§
    9†ÆjA­  ã                   ó†   — d dl Zd dlmZ d dlZd dlZd dlZd dlmZm	Z	m
Z
 d dlmZmZmZmZmZmZ dZ G d„ de¦  «        ZdS )é    N)ÚWangpProgress)Úconfig_lockÚwrite_configÚupdate_config)ÚINSTALLED_REMOTE_PLUGINS_KEYÚWAN2GPPluginÚcompare_release_metadataÚis_wangp_compatibleÚnormalize_plugin_typesÚplugin_id_from_url))ÚallÚAllN)ÚappsÚAppsÚapp)Ú
extensionsÚ
ExtensionsÚ	extension)Ú
processorsÚ
ProcessorsÚ	processor)ÚmodelsÚModelsÚmodelc                   óL  ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd)d„Zd„ Zd„ Zd)d„Zd„ Zd„ Zd„ Zdefd„Z e¦   «         fd„Zdefd„Zd„ Zdefd„Zdefd„Zdedefd„Zd*d!e d"e!fd#„Z"d!e fd$„Z#d%efd&„Z$ e¦   «         fd'„Z% e¦   «         fd%efd(„Z&ˆ xZ'S )+ÚPluginManagerUIPluginc                 óª   •— t          ¦   «                              ¦   «          d| _        d| _        d| _        d| _        d | _        d | _        d| _        d S )NzPlugin Manager UIz1.8.0zCA built-in UI for managing, installing, and updating Wan2GP pluginsÚ F)	ÚsuperÚ__init__ÚnameÚversionÚdescriptionÚWanGP_versionÚquit_applicationÚrestart_applicationÚrestart_required)ÚselfÚ	__class__s    €úEC:\Users\johnn\OneDrive\Documents\AI\plugins\plugin_manager\plugin.pyr    zPluginManagerUIPlugin.__init__   sU   ø€ Ý‰Œ×ÒÑÔÐØ'ˆŒ	ØˆŒØ`ˆÔØˆÔØ $ˆÔØ#'ˆÔ Ø %ˆÔÐÐó    c                 ó�  — |                       d¦  «         |                       d¦  «         |                       d¦  «         |                       d¦  «         |                       d¦  «         |                       d¦  «         |                      d¦  «         |                      d¦  «         |                      d	d
| j        ¬¦  «         d S )Nr   Úserver_configÚserver_config_filenamer%   r&   r$   ÚmainÚ	main_tabsÚplugin_manager_tabÚPlugins)Útab_idÚlabelÚcomponent_constructor)Úrequest_globalÚrequest_componentÚadd_tabÚcreate_plugin_manager_ui©r(   s    r*   Úsetup_uizPluginManagerUIPlugin.setup_ui   sÖ   € Ø×Ò˜EÑ"Ô"Ð"Ø×Ò˜OÑ,Ô,Ð,Ø×ÒÐ4Ñ5Ô5Ð5Ø×ÒÐ.Ñ/Ô/Ð/Ø×ÒÐ1Ñ2Ô2Ð2Ø×Ò˜OÑ,Ô,Ð,Ø×Ò˜vÑ&Ô&Ð&Ø×Ò˜{Ñ+Ô+Ð+à�ŠØ'ØØ"&Ô"?ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r+   c                 ó   — d}|› S )Nal  
            () => {
                function pluginRoot() {
                    if (window.gradioApp) {
                        return window.gradioApp();
                    }
                    const app = document.querySelector('gradio-app');
                    return app ? (app.shadowRoot || app) : document;
                }

                function updateGradioInput(elem_id, value) {
                    const root = pluginRoot();
                    const input = root.querySelector(`#${elem_id} textarea, #${elem_id} input`);
                    if (input) {
                        input.value = value;
                        input.dispatchEvent(new Event('input', { bubbles: true }));
                        input.dispatchEvent(new Event('change', { bubbles: true }));
                        return true;
                    }
                    return false;
                }

                function makePayload(data) {
                    return JSON.stringify(Object.assign({ nonce: `${Date.now()}-${Math.random()}` }, data));
                }

                function makeSortable() {
                    const root = pluginRoot();
                    const userPluginList = root.querySelector('#user-plugin-list');
                    if (!userPluginList) return;
                    if (userPluginList.dataset.sortableBound === '1') return;
                    userPluginList.dataset.sortableBound = '1';

                    let draggedItem = null;
                    let orderBeforeDrag = "";

                    function currentPluginOrder() {
                        return Array.from(userPluginList.querySelectorAll('.plugin-item')).map(item => item.dataset.pluginId || '').join('|');
                    }

                    userPluginList.addEventListener('dragstart', e => {
                        draggedItem = e.target.closest('.plugin-item');
                        if (!draggedItem) return;
                        orderBeforeDrag = currentPluginOrder();
                        draggedItem.classList.add('dragging');
                        if (e.dataTransfer) {
                            e.dataTransfer.effectAllowed = 'move';
                            e.dataTransfer.setData('text/plain', draggedItem.dataset.pluginId || '');
                        }
                        setTimeout(() => {
                            if (draggedItem) draggedItem.style.opacity = '0.5';
                        }, 0);
                    });

                    userPluginList.addEventListener('dragend', e => {
                        setTimeout(() => {
                             if (draggedItem) {
                                draggedItem.style.opacity = '1';
                                draggedItem.classList.remove('dragging');
                                draggedItem = null;
                             }
                             if (orderBeforeDrag && orderBeforeDrag !== currentPluginOrder()) {
                                handlePluginOrderSave(false, true);
                             }
                             orderBeforeDrag = "";
                        }, 0);
                    });

                    userPluginList.addEventListener('dragover', e => {
                        e.preventDefault();
                        if (e.dataTransfer) {
                            e.dataTransfer.dropEffect = 'move';
                        }
                        const afterElement = getDragAfterElement(userPluginList, e.clientY);
                        if (draggedItem) {
                            if (afterElement === draggedItem) return;
                            if (afterElement == null) {
                                userPluginList.appendChild(draggedItem);
                            } else {
                                userPluginList.insertBefore(draggedItem, afterElement);
                            }
                        }
                    });

                    userPluginList.addEventListener('drop', e => {
                        e.preventDefault();
                    });

                    function getDragAfterElement(container, y) {
                        const draggableElements = [...container.querySelectorAll('.plugin-item:not(.dragging)')];
                        return draggableElements.reduce((closest, child) => {
                            const box = child.getBoundingClientRect();
                            const offset = y - box.top - box.height / 2;
                            if (offset < 0 && offset > closest.offset) {
                                return { offset: offset, element: child };
                            } else {
                                return closest;
                            }
                        }, { offset: Number.NEGATIVE_INFINITY }).element;
                    }
                }
                
                function observeUserPluginList() {
                    const root = pluginRoot();
                    if (!root) {
                        setTimeout(observeUserPluginList, 400);
                        return;
                    }
                    if (root.dataset.pluginSortableObserver === '1') {
                        makeSortable();
                        return;
                    }
                    root.dataset.pluginSortableObserver = '1';
                    const observer = new MutationObserver(() => {
                        makeSortable();
                    });
                    observer.observe(root, { childList: true, subtree: true });
                    makeSortable();
                }
                
                setTimeout(observeUserPluginList, 200);
                setTimeout(makeSortable, 500);

                window.handlePluginAction = function(button, action) {
                    const pluginItem = button.closest('.plugin-item');
                    const pluginId = pluginItem.dataset.pluginId;
                    const payload = makePayload({ action: action, plugin_id: pluginId });
                    updateGradioInput('plugin_action_input', payload);
                };
                
                window.handleStoreInstall = function(button, url) {
                    const payload = makePayload({ action: 'install_from_store', url: url });
                    updateGradioInput('plugin_action_input', payload);
                };

                function collectEnabledUserPlugins() {
                    const root = pluginRoot();
                    const user_container = root.querySelector('#user-plugin-list');
                    if (!user_container) return null;
                    
                    const user_plugins = user_container.querySelectorAll('.plugin-item');
                    return Array.from(user_plugins).map(item => item.dataset.pluginId);
                }

                window.handlePluginOrderSave = function(restart, silent) {
                    const enabledUserPlugins = collectEnabledUserPlugins();
                    if (silent && enabledUserPlugins === null) return;
                    
                    const payload = makePayload({ restart: restart, silent: !!silent, enabled_plugins: enabledUserPlugins });
                    updateGradioInput('save_action_input', payload);

                    if (restart) {
                        setTimeout(() => {
                            document.body.innerHTML = "<div style='display:flex;justify-content:center;align-items:center;height:100vh;background-color:#0b0f19;color:#e5e7eb;font-family:sans-serif;text-align:center;'><h2>WanGP is restarting...<br><br>You can safely close this tab.<br>A new tab will open shortly.</h2></div>";
                            window.open('', '_self', '');
                            window.close();
                        }, 1000);
                    }
                };

                window.handleRestart = function() {
                    handlePluginOrderSave(true, false);
                };
            }
        © )r(   Újs_codes     r*   Ú_get_js_script_htmlz)PluginManagerUIPlugin._get_js_script_html,   s   € ðdˆðJ ˆ|Ðr+   c                 óü   — t          | d¦  «        r| j        �| j        S 	 | j        j                             d¬¦  «        | _        | j        S # t
          $ r%}t          d|› �¦  «         i | _        i cY d }~S d }~ww xY w)NÚ_community_plugins_cacheT©Ú
use_remotez8[PluginManager] Could not fetch community plugins info: )ÚhasattrrA   r   Úplugin_managerÚget_merged_catalog_entriesÚ	ExceptionÚprint)r(   Úes     r*   Ú_get_community_plugins_infoz1PluginManagerUIPlugin._get_community_plugins_infoÔ   s    € Ý�4Ð3Ñ4Ô4ð 	1¸Ô9VÐ9bØÔ0Ð0ð	Ø,0¬HÔ,C×,^Ò,^ÐjnÐ,^Ñ,oÔ,oˆDÔ)ØÔ0Ð0øÝð 	ð 	ð 	ÝÐPÈQÐPÐPÑQÔQÐQØ,.ˆDÔ)ØˆIˆIˆIˆIˆIˆIøøøøð	øøøs    +A Á
A;ÁA6Á0A;Á6A;c                 ó*   ‡ — ˆ fd„t           D ¦   «         S )Nc                 óB   •— g | ]\  }}}‰                      |¦  «        ‘ŒS r=   )Ú_build_community_plugins_html©Ú.0Ú_Úplugin_typer(   s      €r*   ú
<listcomp>zOPluginManagerUIPlugin._build_community_plugins_html_outputs.<locals>.<listcomp>à   s.   ø€ ÐsÐsÐsÑDUÀAÀqÈ+�×2Ò2°;Ñ?Ô?ÐsÐsÐsr+   ©ÚDISCOVER_PLUGIN_TYPE_TABSr:   s   `r*   Ú%_build_community_plugins_html_outputsz;PluginManagerUIPlugin._build_community_plugins_html_outputsß   s   ø€ ØsÐsÐsÐsÕYrÐsÑsÔsÐsr+   c                 óT   — |                       ¦   «         |                      ¦   «         z   S ©N)Ú+_build_local_available_plugins_html_outputsrU   r:   s    r*   Ú%_build_available_plugins_html_outputsz;PluginManagerUIPlugin._build_available_plugins_html_outputsâ   s%   € Ø×?Ò?ÑAÔAÀD×DnÒDnÑDpÔDpÑpÐpr+   c                 ó0   — t          t          ¦  «        dz  S )Né   )ÚlenrT   r:   s    r*   Ú_available_outputs_countz.PluginManagerUIPlugin._available_outputs_countå   s   € ÝÕ,Ñ-Ô-°Ñ1Ð1r+   c           	      óŒ   — dd                      d„ t          |                     d¦  «        ¦  «        D ¦   «         ¦  «        z   dz   S )Nz!<span class='plugin-type-badges'>r   c              3   ón   K  — | ]0}d |                      dd¦  «                             ¦   «         › d�V — Œ1dS )z <span class='plugin-type-badge'>rP   ú ú</span>N)ÚreplaceÚtitle)rO   rQ   s     r*   ú	<genexpr>z@PluginManagerUIPlugin._build_type_badges_html.<locals>.<genexpr>é   s†   è è € ð  =Nð  =Nð  T_ð  >OÐ`k×`sÒ`sÐtwÐy|Ñ`}Ô`}÷  aDò  aDñ  aFô  aFð  >Oð  >Oð  >Oð  =Nð  =Nð  =Nð  =Nð  =Nð  =Nr+   Útypera   )Újoinr   Úget)r(   Úplugins     r*   Ú_build_type_badges_htmlz-PluginManagerUIPlugin._build_type_badges_htmlè   s�   € Ø2°R·W²Wð  =Nð  =Nõ  cyð  z@÷  zDò  zDð  EKñ  zLô  zLñ  cMô  cMð  =Nñ  =Nô  =Nñ  6Nô  6Nñ  Nð  QZñ  Zð  	Zr+   c                 óH  — |                      d¦  «        p|                      d¦  «        pd}t          |t          ¦  «        r|                     ¦   «         n t          |¦  «                             ¦   «         }|rt	          || j        ¦  «        r|ddfS d|› �}|dd|› d|› d	�fS )
NÚwan2gp_versionÚwangp_versionr   FzNeed WanGP vTz/<span class='plugin-incompatible-badge' title='z'>ra   )rg   Ú
isinstanceÚstrÚstripr
   r$   )r(   rh   Úrequired_versionÚtexts       r*   Ú_wan2gp_requirement_htmlz.PluginManagerUIPlugin._wan2gp_requirement_htmlë   sÇ   € Ø!Ÿ:š:Ð&6Ñ7Ô7Ð\¸6¿:º:ÀoÑ;VÔ;VÐ\ÐZ\ÐÝ7AÐBRÕTWÑ7XÔ7XÐ{Ð+×1Ò1Ñ3Ô3Ð3Õ^aÐbrÑ^sÔ^s×^yÒ^yÑ^{Ô^{ÐØð 	/Õ#6Ð7GÈÔI[Ñ#\Ô#\ð 	/Ø# U¨BÐ.Ð.Ø0Ð.Ð0Ð0ˆØ Ð'nÐY]Ð'nÐ'nÐaeÐ'nÐ'nÐ'nÐnÐnr+   c                 ó   — d|› d�S )NzW<div class='plugin-item-actions'><span class='plugin-requirements-not-met'>Need WanGP vz</span></div>r=   )r(   rp   s     r*   Ú_requirement_actions_htmlz/PluginManagerUIPlugin._requirement_actions_htmló   s#   € ð IÐiyð  Ið  Ið  Ið  	Ir+   c                 ó|   ‡— ‰€dS t          ˆfd„t          D ¦   «         ¦  «        }d|                     ¦   «         › d�S )Nz6All available community plugins are already installed.c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rW   r=   ©rO   rP   r4   Útab_typerQ   s       €r*   rd   zAPluginManagerUIPlugin._empty_community_message.<locals>.<genexpr>ù   ó6   øè è € ÐjÐjÑ1˜q %¨ÐRZÐ^iÒRiÐRi�UÐRiÐRiÐRiÐRiÐjÐjr+   zNo available z plugins found.©ÚnextrT   Úlower©r(   rQ   r4   s    ` r*   Ú_empty_community_messagez.PluginManagerUIPlugin._empty_community_messageö   sK   ø€ ØÐØKÐKÝÐjÐjÐjÐjÕ5NÐjÑjÔjÑjÔjˆØ=˜uŸ{š{™}œ}Ð=Ð=Ð=Ð=r+   Nc                 ó¤  ‡‡— 	 d„ | j         j                             ¦   «         D ¦   «         Š|                      ¦   «         }ˆˆfd„|                     ¦   «         D ¦   «         }|                     d„ ¬¦  «         n/# t          $ r"}t          j        d|› �¦  «         Y d }~dS d }~ww xY w|sd|  	                    ‰¦  «        › d�S d	}|D �]}| 
                    d
¦  «        }| 
                    d¦  «        pd}| 
                    dd¦  «        }	| 
                    d¦  «        pd}
|                      |¦  «        }| 
                    d¦  «        }|sŒ‰|st          |¦  «        pd}|                     dd¦  «        }|                      |¦  «        \  }}}|r|                      |¦  «        nd|› d�}|d|› d|› d|	› d|› d|› d|
› d|› d�z  }�Œd|› d�S ) Nc                 ó   — h | ]
}|d          ’ŒS ©Úidr=   ©rO   Úps     r*   ú	<setcomp>zFPluginManagerUIPlugin._build_community_plugins_html.<locals>.<setcomp>þ   s   € Ð#`Ð#`Ð#`° A d¤GÐ#`Ð#`Ð#`r+   c                 ón   •— g | ]1\  }}|‰v¯	‰�$‰t          |                     d¦  «        ¦  «        v ¯/|‘Œ2S )Nre   )r   rg   )rO   Ú	plugin_idr„   Úinstalled_plugin_idsrQ   s      €€r*   rR   zGPluginManagerUIPlugin._build_community_plugins_html.<locals>.<listcomp>   sŒ   ø€ ð !ð !ð !Ù"�i ØÐ$8Ð8Ð8¸kÐ>QÐU`ÕdzÐ{|÷  |Aò  |Að  BHñ  |Iô  |Iñ  eJô  eJð  VJð  VJð ð VJð  VJð  VJr+   c                 óš   — |                       d¦  «        p$t          |                       dd¦  «        ¦  «        pd                     ¦   «         S )Nr!   Úurlr   )rg   r   r|   ©r„   s    r*   ú<lambda>zEPluginManagerUIPlugin._build_community_plugins_html.<locals>.<lambda>  sC   € °!·%²%¸±-´-Ð2mÕCUÐVW×V[ÒV[Ð\aÐceÑVfÔVfÑCgÔCgÐ2mÐkm×1tÒ1tÑ1vÔ1v€ r+   ©Úkeyz*Could not process community plugins list: zd<p style='text-align:center; color: var(--color-accent-soft);'>Failed to load community plugins.</p>úB<p style='text-align:center; color: var(--text-color-secondary);'>ú</p>r   r!   ÚauthorÚUnknownr"   zN/Ar#   úNo description provided.rŠ   zUnknown Pluginú'z\'zÄ
                <div class="plugin-item-actions">
                    <div class="plugin-action-row">
                        <button class="plugin-action-btn" onclick="handleStoreInstall(this, 'zT')">Download</button>
                    </div>
                </div>
            z±
            <div class="plugin-item">
                <div class="plugin-item-info">
                    <div class="plugin-header">
                        <span class="name">ú </span>
                        ú7
                        <span class="version">version ú by zJ
                    </div>
                    <span class="description">ú/</span>
                </div>
                ú 
            </div>
            ú<div class='plugin-list'>ú</div>)r   rE   Úget_plugins_inforJ   ÚitemsÚsortrG   ÚgrÚWarningr~   rg   ri   r   rb   rr   rt   )r(   rQ   Úremote_pluginsÚcommunity_pluginsrI   Ú
items_htmlrh   r!   r‘   r"   r#   Útype_badges_htmlrŠ   Úsafe_urlrp   ÚincompatibleÚincompat_htmlÚactions_container_htmlrˆ   s    `                @r*   rM   z3PluginManagerUIPlugin._build_community_plugins_htmlü   sã  øø€ ð	zØ#`Ð#`°T´XÔ5L×5]Ò5]Ñ5_Ô5_Ð#`Ñ#`Ô#`Ð Ø!×=Ò=Ñ?Ô?ˆNð!ð !ð !ð !ð !Ø&4×&:Ò&:Ñ&<Ô&<ð!ñ !ô !Ðð ×"Ò"Ð'vÐ'vÐ"ÑwÔwÐwÐwøåð 	zð 	zð 	zÝŒJÐGÀAÐGÐGÑHÔHÐHØyÐyÐyÐyÐyÐyøøøøð	zøøøð !ð 	Ið IÐX\×XuÒXuð  wBñ  YCô  YCð  Ið  Ið  Ið  Iàˆ
Ø'ð $	ñ $	ˆFØ—:’:˜fÑ%Ô%ˆDØ—Z’Z Ñ)Ô)Ð6¨YˆFØ—j’j ¨EÑ2Ô2ˆGØ Ÿ*š* ]Ñ3Ô3ÐQÐ7QˆKØ#×;Ò;¸FÑCÔCÐØ—*’*˜UÑ#Ô#ˆCàð ØØð CÝ)¨#Ñ.Ô.ÐBÐ2B�à—{’{ 3¨Ñ.Ô.ˆHØ<@×<YÒ<YÐZ`Ñ<aÔ<aÑ9Ð˜l¨MØYeð & T×%CÒ%CÐDTÑ%UÔ%UÐ%Uð lð _gðlð lð lÐ"ð ð ð -1ð	ð ð
 *ðð ð 8?ðð ð EKðð ð 'ðð ð 0;ðð ð (ðð ð ñ ˆJ‰Jð >¨:Ð=Ð=Ð=Ð=s   „A4A9 Á9
B%ÂB Â B%c                 ó*   ‡ — ˆ fd„t           D ¦   «         S )Nc                 óB   •— g | ]\  }}}‰                      |¦  «        ‘ŒS r=   )Ú#_build_local_available_plugins_htmlrN   s      €r*   rR   zUPluginManagerUIPlugin._build_local_available_plugins_html_outputs.<locals>.<listcomp>7  s/   ø€ ÐyÐyÐyÑJ[È!ÈQÐP[�×8Ò8¸ÑEÔEÐyÐyÐyr+   rS   r:   s   `r*   rX   zAPluginManagerUIPlugin._build_local_available_plugins_html_outputs6  s   ø€ ØyÐyÐyÐyÕ_xÐyÑyÔyÐyr+   c                 ó|   ‡— ‰€dS t          ˆfd„t          D ¦   «         ¦  «        }d|                     ¦   «         › d�S )Nz$No disabled local plugins available.c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rW   r=   rw   s       €r*   rd   zGPluginManagerUIPlugin._empty_local_available_message.<locals>.<genexpr><  ry   r+   zNo disabled local z plugins available.rz   r}   s    ` r*   Ú_empty_local_available_messagez4PluginManagerUIPlugin._empty_local_available_message9  sK   ø€ ØÐØ9Ð9ÝÐjÐjÐjÐjÕ5NÐjÑjÔjÑjÔjˆØF E§K¢K¡M¤MÐFÐFÐFÐFr+   c                 ó>  ‡‡— | j         j                             ¦   «         }t          | j                             dg ¦  «        ¦  «        Št          | j                             t          g ¦  «        ¦  «        }ˆˆfd„|D ¦   «         }|                     d„ ¬¦  «         |sd|                      ‰¦  «        › d�S d}|D �]\}|d         }|                     d	¦  «        pd
}|  	                    |¦  «        }	|                     dd¦  «         }
|
rdnd}|  
                    |¦  «        \  }}}|
s||v rdnd}|dk    rdnd}d}|                     dd¦  «        rSt          j                             t          j                             |                     dd¦  «        d¦  «        ¦  «        rd}|r|                      |¦  «        nd|› d|› d|› d�}|rdnd}|d|› d|› d|d         › d|› d |	› d |› d!|d"         › d#|› d$|› d%|                     d&d'¦  «        › d(|› d)�z  }�Œ^d*|› d+�S ),NÚenabled_pluginsc                 ó¸   •— g | ]V}|                      d ¦  «        s?|                      d¦  «        ‰v¯.‰�$‰t          |                      d¦  «        ¦  «        v ¯T|‘ŒWS )Úsystemr‚   Nre   )rg   r   )rO   rh   Úenabled_user_pluginsrQ   s     €€r*   rR   zMPluginManagerUIPlugin._build_local_available_plugins_html.<locals>.<listcomp>C  sµ   ø€ ð 
ð 
ð 
ØØ—:’:˜hÑ'Ô'ð
à,2¯JªJ°tÑ,<Ô,<ÐDXÐ,XÐ,XÐ^iÐ^qð  vAõ  E[ð  \b÷  \fò  \fð  gmñ  \nô  \nñ  Eoô  Eoð  voð  voð ð voð  voð  vor+   c                 ó~   — |                       d¦  «        p|                       d¦  «        pd                     ¦   «         S )Nr!   r‚   r   )rg   r|   r‹   s    r*   rŒ   zKPluginManagerUIPlugin._build_local_available_plugins_html.<locals>.<lambda>G  s0   € ¨!¯%ª%°©-¬-Ð*L¸1¿5º5À¹;¼;Ð*LÈ"×)SÒ)SÑ)UÔ)U€ r+   r�   r�   r�   r   r‚   r‘   r’   ÚuninstallableTú_<span class="plugin-bundled-badge" title="Bundled plugin, cannot be uninstalled">Bundled</span>Úenable_localÚinstall_localÚEnableÚInstallÚpathz.gitz^<button class="plugin-action-btn" onclick="handlePluginAction(this, 'update')">Update</button>zÄ
                <div class="plugin-item-actions">
                    <div class="plugin-action-row">
                        <button class="plugin-action-btn" onclick="handlePluginAction(this, 'z')">z"</button>
                        z?
                    </div>
                </div>
            zplugin-item incompatiblezplugin-itemz
            <div class="ú" data-plugin-id="z�">
                <div class="plugin-item-info">
                    <div class="plugin-header">
                        <span class="name">r!   r•   z
                        r–   r"   r—   ú (id: zR)</span>
                    </div>
                    <span class="description">r#   r“   r˜   r™   rš   r›   )r   rE   rœ   Úsetr-   rg   r   rž   r®   ri   rr   Úosr»   Úisdirrf   rt   )r(   rQ   Úplugins_infoÚinstalled_remote_pluginsÚlocal_pluginsr£   rh   r‡   r‘   r¤   Ú
is_bundledÚbundled_badge_htmlrp   r¦   r§   Úactionr4   Úupdate_button_htmlr¨   Ú
item_classr³   s    `                  @r*   r«   z9PluginManagerUIPlugin._build_local_available_plugins_html?  sr  øø€ Ø”xÔ.×?Ò?ÑAÔAˆÝ" 4Ô#5×#9Ò#9Ð:KÈRÑ#PÔ#PÑQÔQÐÝ#& tÔ'9×'=Ò'=Õ>ZÐ\^Ñ'_Ô'_Ñ#`Ô#`Ð ð
ð 
ð 
ð 
ð 
Ø!-ð
ñ 
ô 
ˆð 	×ÒÐUÐUÐÑVÔVÐVØð 	Oð OÐX\×X{ÒX{ð  }Hñ  YIô  YIð  Oð  Oð  Oð  Oàˆ
Ø#ð #	ñ #	ˆFØ˜tœˆIØ—Z’Z Ñ)Ô)Ð6¨YˆFØ#×;Ò;¸FÑCÔCÐØ#ŸZšZ¨¸Ñ>Ô>Ð>ˆJð GQð  "Yð  "Cð  "Cð  WYÐØ<@×<YÒ<YÐZ`Ñ<aÔ<aÑ9Ð˜l¨MØ'1Ðo°YÐBZÐ5ZÐ5Z�^�^Ð`oˆFØ &¨.Ò 8Ð 8�H�H¸iˆEØ!#ÐØ�zŠz˜/¨4Ñ0Ô0ð HµR´W·]²]Å2Ä7Ç<Â<ÐPV×PZÒPZÐ[aÐceÑPfÔPfÐhnÑCoÔCoÑ5pÔ5pð Hð &HÐ"ØYeð & T×%CÒ%CÐDTÑ%UÔ%UÐ%Uð lð _eðlð lð kpðlð lð ,ð	lð lð lÐ"ð 8DÐVÐ3Ð3ÈˆJØð Ø#ðð Ø7@ðð ð -3°6¬Nð	ð ð
 ,ðð ð *ðð ð 'ðð ð 8>¸iÔ7Hðð ð OUðð ð ]fðð ð 06¯zªz¸-ÐIcÑ/dÔ/dðð ð (ðð ð ñ ˆJ‰Jð >¨:Ð=Ð=Ð=Ð=r+   c                 ó¢  — | j         j                             ¦   «         }| j                             dg ¦  «        }d„ |D ¦   «         }| j         j                             d¬¦  «        }d}|sd}d}�nÊd}d	„ |D ¦   «         }g }	|D ].}
|
|v r(|	                     |                     |
¦  «        ¦  «         Œ/d}|	D �]}}|d
         }
|                     dd¦  «        }|                     d¦  «        pd}|                      |¦  «        }d}g }|rg|
|v rc||
         }t          ||¦  «        dk    rG|                     d¦  «        p|                     d¦  «        pd}d|› d�}|                     d¦  «         d}|sd}|  
                    |¦  «        \  }}}|r+|                     d¦  «         |                      |¦  «        }nd}|r|dz  }|dz  }d|› d�}|dd                     |¦  «        › d|
› d|d          › d!|› d"|› d"|› d"|› d#|d         › d$|› d%|d
         › d&|                     d'd(¦  «        › d)|› d*�z  }�Œd+|› d�}| j        rd,nd}|› d-|› |› |› d�S ).Nr°   c                 ó<   — g | ]}|                      d ¦  «        °|‘ŒS )r²   ©rg   rƒ   s     r*   rR   z=PluginManagerUIPlugin._build_plugins_html.<locals>.<listcomp>u  s'   € Ð PÐ PÐ P qÀÇÂÀhÁÄÐ P Ð PÐ PÐ Pr+   FrB   aQ  
        <style>
            .plugin-list { display: flex; flex-direction: column; gap: 12px; }
            .plugin-item { display: flex; flex-wrap: column; gap: 12px; justify-content: space-between; align-items: center; padding: 16px; border: 1px solid var(--border-color-primary); border-radius: 12px; background-color: var(--background-fill-secondary); transition: box-shadow 0.2s ease-in-out; }
            .plugin-item:hover { box-shadow: var(--shadow-drop-lg); }
            .plugin-item[draggable="true"] { cursor: grab; }
            .plugin-item[draggable="true"]:active { cursor: grabbing; }
            .plugin-info-container { display: flex; align-items: center; gap: 16px; flex-grow: 1; }
            .plugin-item-info { display: flex; flex-direction: column; gap: 4px; }
            .plugin-header { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
            .plugin-item-info .name { font-weight: 600; font-size: 1.1em; color: var(--text-color-primary); font-family: 'Segoe UI', 'Roboto', 'Helvetica Neue', sans-serif; }
            .plugin-item-info .version { font-size: 0.9em; color: var(--text-color-secondary); }
            .plugin-item-info .description { font-size: 0.95em; color: var(--text-color-secondary); margin-top: 4px; }
            .plugin-type-badges { display: inline-flex; flex-wrap: wrap; gap: 6px; }
            .plugin-type-badge { display: inline-flex; align-items: center; width: max-content; border: 1px solid var(--border-color-primary); border-radius: 4px; padding: 1px 7px; font-size: 0.78em; font-weight: 600; color: var(--text-color-secondary); background-color: var(--background-fill-primary); line-height: 1.5; }
            .plugin-item-actions { display: flex; flex-direction: column; gap: 6px; flex-shrink: 0; align-items: stretch; }
            .plugin-action-row { display: flex; gap: 8px; justify-content: flex-end; }
            .plugin-action-btn { display: inline-flex; align-items: center; justify-content: center; min-width: 88px; margin: 0 !important; border: 1px solid var(--button-secondary-border-color, #ccc) !important; background: var(--button-secondary-background-fill, #f0f0f0) !important; color: var(--button-secondary-text-color) !important; padding: 4px 12px !important; border-radius: 4px !important; cursor: pointer; font-weight: 500; }
            .plugin-action-btn:hover { background: var(--button-secondary-background-fill-hover, #e0e0e0) !important; transform: translateY(-1px); box-shadow: var(--shadow-drop); }
            .plugin-requirements-not-met { display: inline-flex; align-items: center; justify-content: center; min-width: 132px; border: 1px solid rgba(185, 28, 28, 0.35); border-radius: 4px; padding: 4px 12px; color: var(--color-error, #b91c1c); background-color: rgba(185, 28, 28, 0.1); font-weight: 600; white-space: nowrap; }
            .save-buttons-container { justify-content: flex-start; margin-top: 20px !important; gap: 12px; }
            .stylish-save-btn { font-family: 'Segoe UI', 'Roboto', 'Helvetica Neue', sans-serif !important; font-weight: 600 !important; font-size: 1.05em !important; padding: 10px 20px !important; white-space: nowrap; }
            .plugin-instruction { font-size: 0.95em; color: var(--text-color-secondary); margin-bottom: 6px; }
            .plugin-restart-warning {
                border: 1px solid rgba(217, 119, 6, 0.45);
                border-left: 4px solid rgb(217, 119, 6);
                border-radius: 6px;
                background-color: rgba(217, 119, 6, 0.12);
                color: var(--body-text-color);
                padding: 10px 12px;
                font-size: 0.95em;
                font-weight: 600;
            }
            .update-available-notice {
                font-size: 0.9em;
                font-weight: 600;
                color: var(--color-accent);
                background-color: var(--color-accent-soft);
                padding: 2px 8px;
                border-radius: 4px;
                margin-left: 8px;
                white-space: nowrap;
            }
            .plugin-bundled-badge {
                font-size: 0.85em;
                font-weight: 600;
                color: var(--text-color-secondary);
                background-color: var(--background-fill-primary);
                padding: 2px 8px;
                border-radius: 4px;
                margin-left: 8px;
                border: 1px solid var(--border-color-primary);
                white-space: nowrap;
            }
            .plugin-incompatible-badge {
                font-size: 0.85em;
                font-weight: 600;
                color: var(--color-error, #b91c1c);
                background-color: rgba(185, 28, 28, 0.1);
                padding: 2px 8px;
                border-radius: 4px;
                margin-left: 8px;
                border: 1px solid rgba(185, 28, 28, 0.35);
                white-space: nowrap;
            }
            .plugin-item.update-available {
                border-left: 4px solid var(--color-accent);
            }
            .plugin-item.incompatible {
                border-left: 4px solid var(--color-error, #b91c1c);
            }
        </style>
        r   z�<p style='text-align:center; color: var(--text-color-secondary);'>No installed plugins. Install a plugin from the right pane.</p>z§<div class='plugin-instruction'>Drag enabled plugins to reorder their tabs. Order is saved automatically. Use Disable to move a plugin back to Available Locally.</div>c                 ó    — i | ]}|d          |“ŒS r�   r=   rƒ   s     r*   ú
<dictcomp>z=PluginManagerUIPlugin._build_plugins_html.<locals>.<dictcomp>Ç  s   € ÐJÐJÐJ¨q  $¤¨ÐJÐJÐJr+   r‚   rµ   Tr‘   r’   r   r"   ÚdateÚunknownz2<span class="update-available-notice">New version z is available !</span>zupdate-availabler¶   r¦   zÈ
                    <div class="plugin-action-row">
                        <button class="plugin-action-btn" onclick="handlePluginAction(this, 'disable_local')">Disable</button>
                    aÙ  
                        <button class="plugin-action-btn" onclick="handlePluginAction(this, 'update')">Update</button>
                    </div>
                    <div class="plugin-action-row">
                        <button class="plugin-action-btn" onclick="handlePluginAction(this, 'reinstall')">Reinstall</button>
                        <button class="plugin-action-btn" onclick="handlePluginAction(this, 'uninstall')">Uninstall</button>
                        r›   z!<div class="plugin-item-actions">z)
                <div class="plugin-item r`   r¼   zî" draggable="true">
                    <div class="plugin-info-container">
                        <div class="plugin-item-info">
                            <div class="plugin-header">
                                <span class="name">r!   z(</span>
                                z!
                                z^
                            </div>
                            <span class="version">version r—   r½   z?)</span>
                            <span class="description">r#   r“   zV</span>
                        </div>
                    </div>
                    z(
                </div>
                z<div id="user-plugin-list">z�<div class='plugin-restart-warning'>Restart required: plugin changes were saved. Restart WanGP for tab visibility and ordering to update.</div>rš   )r   rE   rœ   r-   rg   rF   ÚappendÚpopri   r	   rr   rt   rf   r'   )r(   rÁ   r³   Úall_user_plugins_infoÚremote_plugins_infoÚcssÚinstruction_htmlÚ	user_htmlÚuser_plugins_mapÚuser_pluginsr‡   Úuser_items_htmlrh   rµ   r‘   r¤   Úupdate_notice_htmlÚitem_classesÚremote_entryÚremote_versionrÅ   rp   r¦   r§   r¨   Úactions_htmlÚrestart_warning_htmls                              r*   Ú_build_plugins_htmlz)PluginManagerUIPlugin._build_plugins_htmlr  sØ  € Ø”xÔ.×?Ò?ÑAÔAˆØ#Ô1×5Ò5Ð6GÈÑLÔLÐØ PÐ P¨LÐ PÑ PÔ PÐØ"œhÔ5×PÒPÐ\aÐPÑbÔbÐðHˆðT $ð G	NØ!Ðð \ˆI‰Ið  IÐØJÐJÐ4IÐJÑJÔJÐØˆLØ1ð Ið I�	ØÐ 0Ð0Ð0Ø ×'Ò'Ð(8×(<Ò(<¸YÑ(GÔ(GÑHÔHÐHøà ˆOØ&ð :ñ :�Ø" 4œL�	Ø &§
¢
¨?¸DÑ AÔ A�ØŸš HÑ-Ô-Ð:°�Ø#'×#?Ò#?ÀÑ#GÔ#GÐ à%'Ð"Ø!�Ø ð @ YÐ2EÐ%EÐ%EØ#6°yÔ#A�LÝ/°¸fÑEÔEÈÒIÐIØ)5×)9Ò)9¸)Ñ)DÔ)DÐ)mÈ×HXÒHXÐY_ÑH`ÔH`Ð)mÐdm˜àwÐQ_ÐwÐwÐwð +ð %×+Ò+Ð,>Ñ?Ô?Ð?à%'Ð"Ø$ð Kð *KÐ&à@D×@]Ò@]Ð^dÑ@eÔ@eÑ=Ð  ,°Øð fØ ×'Ò'¨Ñ7Ô7Ð7Ø-1×-KÒ-KÐL\Ñ-]Ô-]Ð*Ð*ð$�Lð %ð Ø$ð )ñ ˜ð ! HÑ,�LØ-eÐQ]Ð-eÐ-eÐ-eÐ*àð $Ø),¯ª°,Ñ)?Ô)?ð$ð $ØS\ð$ð $ð
 5;¸6´Nð$ð $ð "4ð$ð $ð "2ð$ð $ð "4ð$ð $ð "/ð$ð $ð <BÀ)Ô;Lð$ð $ð SYð$ð $ð agÐgkÔ`lð$ð $ð 8>·z²zÀ-ÐQkÑ7lÔ7lð$ð $ð ,ð$ð $ð $ñ �‘ð$ N°oÐMÐMÐMˆIð uyô  uJð   Rð   qð   qð  PRÐØÐiÐiÐ0@ÐiÀ)ÐiÐMaÐiÐiÐiÐir+   c                 óÎ   ‡— t          | j                             dg ¦  «        ¦  «        Š| j        j                             ¦   «         }t          ˆfd„|D ¦   «         ¦  «        rdndS )Nr°   c              3   ór   •K  — | ]1}|                      d ¦  «         o|                      d¦  «        ‰vV — Œ2dS )r²   r‚   NrË   )rO   rh   r³   s     €r*   rd   z?PluginManagerUIPlugin._default_available_tab.<locals>.<genexpr>  sc   øè è € ð  *Pð  *PÐx~¨f¯jªj¸Ñ.BÔ.BÐ*BÐ*sÀvÇzÂzÐRVÑGWÔGWÐ_sÐGsð  *Pð  *Pð  *Pð  *Pð  *Pð  *Pr+   Úavailable_locallyÚdownloadable)r¾   r-   rg   r   rE   rœ   Úany)r(   rÁ   r³   s     @r*   Ú_default_available_tabz,PluginManagerUIPlugin._default_available_tab  s”   ø€ Ý" 4Ô#5×#9Ò#9Ð:KÈRÑ#PÔ#PÑQÔQÐØ”xÔ.×?Ò?ÑAÔAˆÝ&)ð  *Pð  *Pð  *Pð  *Pð  COð  *Pñ  *Pô  *Pñ  'Pô  'Pð  dÐ"Ð"ð  Vdð  	dr+   c                 óh  — t          j        ¦   «         5 }t          j        dd¬¦  «        5  t          j        dd¬¦  «        5  t          j        d¦  «         t          j        ¦   «         | _        t          j        d¬	¦  «        5  t          j        d
dddd¬¦  «        | _        t          j        ddddd¬¦  «        | _	        d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          j        dd¬¦  «        5  t          j        d¦  «         g | _
        g | _        t          j        |                      ¦   «         ¬¦  «        5  t          j        dd¬¦  «        5  t          j        d¬¦  «        5  t          D ]b\  }}}t          j        |d|› �¬¦  «        5  | j
                             t          j        ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   Œc	 d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          j        dd¬¦  «        5  t          j        d¬¦  «        5  t          D ]b\  }}}t          j        |d|› �¬¦  «        5  | j                             t          j        ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   Œc	 d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          j        dd¬ ¦  «        5  t          j        ¦   «         5  t          j        d!d"¬#¦  «        | _        t          j        d$¦  «        | _        d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t-          j        ¦   «         | _        t          j        d¬%¦  «        5  t          j        d&¬'¦  «        | _        t          j        d(¬'¦  «        | _        d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   |                      ¦   «         }|                     d |¬)¦  «         | j        g| j
        ¢| j        ¢| _        | j                             d d*¬)¦  «         t-          j        | j	        j        | j         g | j        g| j
        ¢| j        ¢| j        ¬+¦  «         | j         !                    | j"        | j        g| j        g| j
        ¢| j        ¢¬,¦  «         t-          j        | j        j!        | j#        | j        g| j        g| j
        ¢| j        ¢| j        ¬+¦  «         t-          j        | j        j        | j$        | j        g| j        g| j
        ¢| j        ¢| j        ‘| j        ¬+¦  «         |S )-NFÚpanel)Úequal_heightÚvariantr[   iX  )ÚscaleÚ	min_widthz### Installed Pluginszsave-buttons-container)Úelem_classesÚRestartÚprimaryÚsmr   zstylish-save-btn)rê   Úsizerë   rí   zCheck for UpdatesÚ	secondaryi,  z### Available Plugins)ÚselectedzAvailable Locallyrã   r�   Ú	local_allÚlocal_ÚDownloadablerä   Údownloadable_allÚdownloadable_zInstall from URLT)Úopenz
GitHub URLz*https://github.com/user/wan2gp-plugin-repo)r4   ÚplaceholderzDownload and Install from URL)ÚvisibleÚplugin_action_input)Úelem_idÚsave_action_input)ÚfnÚjszhandleRestart())ÚinputsÚoutputsÚ	component)rÿ   r  r  )%rŸ   ÚBlocksÚRowÚColumnÚMarkdownÚHTMLÚplugins_html_displayÚButtonÚrestart_buttonÚrefresh_catalog_buttonÚ$local_available_plugins_html_outputsÚcommunity_plugins_html_outputsÚTabsræ   ÚTabrT   rÐ   Ú	AccordionÚGroupÚTextboxÚplugin_url_textboxÚinstall_plugin_buttonr   r  Úoperation_progressrü   rþ   r?   ÚloadÚon_tab_outputsÚclickÚbindÚ_refresh_catalogÚchangeÚ_handle_save_actionÚ_handle_plugin_action_from_jsonÚ_install_plugin_and_refresh)r(   Úplugin_blocksr3   r4   rP   r   s         r*   r9   z.PluginManagerUIPlugin.create_plugin_manager_ui  sÒ
  € ÝŒY‰[Œ[ð  	Q˜MÝ” U°GÐ<Ñ<Ô<ð dð dÝ”Y Q°#Ð6Ñ6Ô6ð _ð _Ý”KÐ 7Ñ8Ô8Ð8Ý02´±	´	�DÔ-ÝœÐ-EÐFÑFÔFð _ð _Ý.0¬i¸	È9Ð[_Ðghð  xJð  /Kñ  /Kô  /K˜Ô+Ý68´iÐ@SÐ]hÐosÐ{|ð  L^ð  7_ñ  7_ô  7_˜Ô3ð_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _ð_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _õ ”Y Q°#Ð6Ñ6Ô6ð dð dÝ”KÐ 7Ñ8Ô8Ð8Ø@B�DÔ=Ø:<�DÔ7Ýœ¨$×*EÒ*EÑ*GÔ*GÐHÑHÔHð 
^ð 
^ÝœVÐ$7Ð<OÐPÑPÔPð dð dÝ!#¤°+Ð!>Ñ!>Ô!>ð dð dÝ8Qð !dð !dÑ$4 F¨E°1Ý)+¬°Ð:KÀ6Ð:KÐ:KÐ)LÑ)LÔ)Lð %dð %dØ(,Ô(Q×(XÒ(XÕY[ÔY`ÑYbÔYbÑ(cÔ(cÐ(cð%dð %dð %dñ %dô %dð %dð %dð %dð %dð %dð %døøøð %dð %dð %dð %døð!dðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dõ
  œV N°~ÐFÑFÔFð ^ð ^Ý!#¤Ð2DÐ!EÑ!EÔ!Eð ^ð ^Ý8Qð !^ð !^Ñ$4 F¨E°1Ý)+¬°Ð:RÈ&Ð:RÐ:RÐ)SÑ)SÔ)Sð %^ð %^Ø(,Ô(K×(RÒ(RÕSUÔSZÑS\ÔS\Ñ(]Ô(]Ð(]ð%^ð %^ð %^ñ %^ô %^ð %^ð %^ð %^ð %^ð %^ð %^øøøð %^ð %^ð %^ð %^øð!^ð^ð ^ð ^ñ ^ô ^ð ^ð ^ð ^ð ^ð ^ð ^øøøð ^ð ^ð ^ð ^ð^ð ^ð ^ñ ^ô ^ð ^ð ^ð ^ð ^ð ^ð ^øøøð ^ð ^ð ^ð ^ð
^ð 
^ð 
^ñ 
^ô 
^ð 
^ð 
^ð 
^ð 
^ð 
^ð 
^øøøð 
^ð 
^ð 
^ð 
^õ œÐ&8¸tÐDÑDÔDð dð dÝœX™ZœZð dð dÝ68´jÀ|ð  bNð  7Oñ  7Oô  7O˜DÔ3Ý9;¼ÐCbÑ9cÔ9c˜DÔ6ðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dð!dð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dõ8 '4Ô&=Ñ&?Ô&?ˆDÔ#Ý” 5Ð)Ñ)Ô)ð Qð QÝ+-¬:Ð>SÐ+TÑ+TÔ+T�Ô(Ý)+¬Ð<OÐ)PÑ)PÔ)P�Ô&ðQð Qð Qñ Qô Qð Qð Qð Qð Qð Qð Qøøøð Qð Qð Qð Qð= 	Qð  	Qð  	Qñ  	Qô  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qøøøð  	Qð  	Qð  	Qð  	QðD ×%Ò%Ñ'Ô'ˆØ×Ò˜d rÐÑ*Ô*Ð*à#Ô8ð  L¸4Ô;dð  LÐgkô  hKð  LˆÔàÔ×!Ò! TÐ.?Ð!Ñ@Ô@Ð@ÝÔ˜4Ô6Ô<¸dÔ>SØØÔ.ð  B°Ô1Zð  BÐ]aô  ^Að  BØÔ-ð	
ñ 	
ô 	
ð 	
ð 	Ô×%Ò%ØÔ'ØÔ*Ð+ØÔ.ð  B°Ô1Zð  BÐ]aô  ^Að  Bð 	&ñ 	
ô 	
ð 	
õ 	Ô˜4Ô3Ô:¸DÔ<`ØÔ,Ð-ØÔ.ð  B°Ô1Zð  BÐ]aô  ^Að  BØÔ-ð	
ñ 	
ô 	
ð 	
õ 	Ô˜4Ô5Ô;¸TÔ=]ØÔ+Ð,ØÔ.ð  [°Ô1Zð  [Ð]aô  ^Að  [ð  CGô  CZð  [ØÔ-ð	
ñ 	
ô 	
ð 	
ð Ðs
  ”P3«N#ÁAC$Â=C	ÃC$ÃCÃC$ÃCÃC$ÃN#Ã$C(Ã(N#Ã+C(Ã,N#ÄA
NÅK(	Å&HÅ<'G4Æ#,GÇG4ÇGÇG4Ç"GÇ#G4Ç(HÇ4G8Ç8HÇ;G8Ç<HÇ?K(	ÈHÈK(	ÈHÈK(	È,KÉ'J:É),J!ÊJ:Ê!J%Ê%J:Ê(J%Ê)J:Ê.KÊ:J>Ê>KËJ>ËKËK(	ËKËK(	ËKËK(	ËNË(K,Ë,NË/K,Ë0NÌ	M5	Ì5MÍM5	ÍM"Í"M5	Í%M"Í&M5	Í)NÍ5M9Í9NÍ<M9Í=NÎ N#ÎNÎN#ÎNÎN#ÎP3Î#N'	Î'P3Î*N'	Î+0P3Ï5PÐP3ÐP 	Ð P3Ð#P 	Ð$P3Ð3P7Ð:P7Ústatec                 ó¼   — t          | d¦  «        r| `|                      ¦   «         }d„ |                      ¦   «         D ¦   «         }t	          j        |¬¦  «        g|¢R S )NrA   c                 ó8   — g | ]}t          j        |¬ ¦  «        ‘ŒS )©Úvalue©rŸ   Úupdate)rO   Úhtmls     r*   rR   z7PluginManagerUIPlugin.on_tab_select.<locals>.<listcomp>[  s%   € ÐlÐlÐl°t�RœY¨TÐ2Ñ2Ô2ÐlÐlÐlr+   r$  )rD   rA   rà   rY   rŸ   r'  )r(   r!  Úinstalled_htmlÚavailable_outputss       r*   Úon_tab_selectz#PluginManagerUIPlugin.on_tab_selectV  sk   € Ý�4Ð3Ñ4Ô4ð 	.ØÐ-à×1Ò1Ñ3Ô3ˆØlÐl¸t×?iÒ?iÑ?kÔ?kÐlÑlÔlÐÝŒy˜~Ð.Ñ.Ô.ÐBÐ1BÐBÐBÐBr+   c                 ó~  — | j         j                             dd¬¦  «         t          | d¦  «        r| `|                      ¦   «         }|dk    rt          j        d¦  «         n2|dk    rt          j        d¦  «         nt          j        |› d	�¦  «         |                      ¦   «         g|  	                    ¦   «         ¢R S )
NTF)Úinstalled_onlyrC   rA   r   zNo Plugin Update is availableé   zOne Plugin Update is availablez Plugin Updates are available)
r   rE   Úrefresh_catalogrD   rA   Ú_count_available_updatesrŸ   ÚInforà   rY   )r(   ÚprogressÚupdates_availables      r*   r  z&PluginManagerUIPlugin._refresh_catalog^  sÍ   € ØŒÔ×/Ò/¸tÐPUÐ/ÑVÔVÐVÝ�4Ð3Ñ4Ô4ð 	.ØÐ-Ø ×9Ò9Ñ;Ô;ÐØ Ò!Ð!ÝŒGÐ3Ñ4Ô4Ð4Ð4Ø !Ò#Ð#ÝŒGÐ4Ñ5Ô5Ð5Ð5åŒGÐ(ÐGÐGÐGÑHÔHÐHØ×'Ò'Ñ)Ô)ÐX¨D×,VÒ,VÑ,XÔ,XÐXÐXÐXr+   Úreturnc                 óˆ  — 	 | j         j                             ¦   «         }| j         j                             d¬¦  «        }d}|D ]l}|                     d¦  «        rŒ|                     dd¦  «        sŒ/|                     d¦  «        }|r||vrŒK||         }t          ||¦  «        dk    r|dz  }Œm|S # t          $ r Y dS w xY w)	NFrB   r   r²   rµ   Tr‚   r.  )r   rE   rœ   rF   rg   r	   rG   )r(   rÁ   rÓ   Úcountrh   r‡   rÜ   s          r*   r0  z.PluginManagerUIPlugin._count_available_updatesk  sõ   € ð	Øœ8Ô2×CÒCÑEÔEˆLØ"&¤(Ô"9×"TÒ"TÐ`eÐ"TÑ"fÔ"fÐØˆEØ&ð 
ð 
�Ø—:’:˜hÑ'Ô'ð ØØ—z’z /°4Ñ8Ô8ð ØØ"ŸJšJ tÑ,Ô,�	Ø ð  IÐ5HÐ$HÐ$HØØ2°9Ô=�Ý+¨L¸&ÑAÔAÀAÒEÐEØ˜Q‘J�EøØˆLøÝð 	ð 	ð 	Ø�1�1ð	øøøs   ‚B0B3 Â3
CÃ Cc                 ó:   — t          | j        | j        ¦  «         d S rW   )r   r-   r.   r:   s    r*   Ú_write_server_configz*PluginManagerUIPlugin._write_server_config  s   € Ý�TÔ'¨Ô)DÑEÔEÐEÐEÐEr+   r‡   c                 ó  — t           5  | j                             dg ¦  «        }||vrA|                     |¦  «         || j        d<   |                      ¦   «          	 d d d ¦  «         dS 	 d d d ¦  «         dS # 1 swxY w Y   d S )Nr°   TF)r   r-   rg   rÐ   r8  )r(   r‡   r°   s      r*   Ú_enable_plugin_idz'PluginManagerUIPlugin._enable_plugin_id‚  sô   € Ýð 	ð 	Ø"Ô0×4Ò4Ð5FÈÑKÔKˆOØ Ð/Ð/Ø×&Ò& yÑ1Ô1Ð1Ø8G�Ô"Ð#4Ñ5Ø×)Ò)Ñ+Ô+Ð+Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆAA7Á)A7Á7A;Á>A;rŠ   c                 ó²   — t          |¦  «        }	 |                      |¦  «        S # t          $ r$}t          j        d|› d|› �¦  «         Y d }~nd }~ww xY wdS )NzFailed to auto-enable plugin z: F)r   r:  rG   rŸ   r    )r(   rŠ   r‡   rI   s       r*   Ú_enable_plugin_after_installz2PluginManagerUIPlugin._enable_plugin_after_installŒ  s�   € Ý& sÑ+Ô+ˆ	ð	IØ×)Ò)¨)Ñ4Ô4Ð4øÝð 	Ið 	Ið 	IÝŒJÐG°yÐGÐGÀAÐGÐGÑHÔHÐHÐHÐHÐHÐHÐHøøøøð	Iøøøàˆus   ‘& ¦
A°AÁAÚresult_messagec                 óF  — t          |¦  «        }d|v r�d| _        |                      |¦  «        }|r|                     dd¦  «        }n3|| j                             dg ¦  «        v r|                     dd¦  «        }|r!| j        j                             ||¬¦  «         |S |S )Nú	[Success]Tú/Please enable it in the list and restart WanGP.z/It has been auto-enabled. Please restart WanGP.r°   z,It is already enabled. Please restart WanGP.)rŠ   )	r   r'   r<  rb   r-   rg   r   rE   Úrecord_plugin_metadata)r(   rŠ   r=  r‡   Úwas_enableds        r*   Ú_finish_install_from_urlz.PluginManagerUIPlugin._finish_install_from_url”  sÔ   € Ý& sÑ+Ô+ˆ	Ø˜.Ð(Ð(Ø$(ˆDÔ!Ø×;Ò;¸CÑ@Ô@ˆKØð [Ø!/×!7Ò!7Ð8ið  l]ñ  "^ô  "^��Ø˜dÔ0×4Ò4Ð5FÈÑKÔKÐKÐKØ!/×!7Ò!7Ð8ið  lZñ  "[ô  "[�Øð SØ”Ô'×>Ò>¸yÈcÐ>ÑRÔRÐRØ!Ð!ØÐr+   Fr°   Úsilentc                 óÊ   — t          | j        | j        d|i¦  «         d| _        |st	          j        d¦  «         |                      ¦   «         g|                      ¦   «         ¢R S )Nr°   TzGPlugin settings saved. Please restart WanGP for changes to take effect.)r   r-   r.   r'   rŸ   r1  rà   rY   )r(   r°   rD  s      r*   Ú_save_plugin_settingsz+PluginManagerUIPlugin._save_plugin_settings¢  sl   € Ý�dÔ(¨$Ô*EÐHYÐ[jÐGkÑlÔlÐlØ $ˆÔØð 	_ÝŒGÐ]Ñ^Ô^Ð^Ø×'Ò'Ñ)Ô)ÐX¨D×,VÒ,VÑ,XÔ,XÐXÐXÐXr+   c                 ó`  — t          | j        | j        d|i¦  «         t          j        d¦  «         t          t          | dd ¦  «        ¦  «        r|                      ¦   «          d S t          t          | dd ¦  «        ¦  «        r*t          j        d¦  «         |  	                    ¦   «          d S d S )Nr°   z)Settings saved. Restarting application...r&   r%   zVRestart hook is unavailable. WAN2GP will now quit. Please start WAN2GP again manually.)
r   r-   r.   rŸ   r1  ÚcallableÚgetattrr&   r    r%   )r(   r°   s     r*   Ú_save_and_restartz'PluginManagerUIPlugin._save_and_restart©  sµ   € Ý�dÔ(¨$Ô*EÐHYÐ[jÐGkÑlÔlÐlÝ
ŒÐ;Ñ<Ô<Ð<Ý•G˜DÐ"7¸Ñ>Ô>Ñ?Ô?ð 	Ø×$Ò$Ñ&Ô&Ð&ØˆFÝ•g˜dÐ$6¸Ñ=Ô=Ñ>Ô>ð 	ÝŒJÐoÑpÔpÐpØ×!Ò!Ñ#Ô#Ð#ØˆFð	ð 	r+   Úpayload_strc                 óž  — |sTt          j        |                      ¦   «         ¬¦  «        gd„ t          |                      ¦   «         ¦  «        D ¦   «         ¢R S 	 t          j        |¦  «        }|                     d| j                             dg ¦  «        ¦  «        }t          |t          ¦  «        s| j                             dg ¦  «        }|                     dd¦  «        r?|                      |¦  «         |                      ¦   «         g|                      ¦   «         ¢R S |                      ||                     dd¦  «        ¬¦  «        S # t
          j        t          f$ rk t          j        d¦  «         t          j        |                      ¦   «         ¬¦  «        gd	„ t          |                      ¦   «         ¦  «        D ¦   «         ¢R cY S w xY w)
Nr$  c                 ó4   — g | ]}t          j        ¦   «         ‘ŒS r=   r&  ©rO   rP   s     r*   rR   z=PluginManagerUIPlugin._handle_save_action.<locals>.<listcomp>¶  ó   € ÐA~ÐA~ÐA~ÐRSÅ"Ä)Á+Ä+ÐA~ÐA~ÐA~r+   r°   ÚrestartFrD  )rD  z2Could not process save action due to invalid data.c                 ó4   — g | ]}t          j        ¦   «         ‘ŒS r=   r&  rN  s     r*   rR   z=PluginManagerUIPlugin._handle_save_action.<locals>.<listcomp>Ã  rO  r+   )rŸ   r'  rà   Úranger]   ÚjsonÚloadsrg   r-   rm   ÚlistrJ  rY   rF  ÚJSONDecodeErrorÚ	TypeErrorr    )r(   rK  Úpayloadr°   s       r*   r  z)PluginManagerUIPlugin._handle_save_action´  sÎ  € Øð 	Ý”9 4×#;Ò#;Ñ#=Ô#=Ð>Ñ>Ô>Ð~ÐA~ÐA~ÕW\Ð]a×]zÒ]zÑ]|Ô]|ÑW}ÔW}ÐA~ÑA~ÔA~Ð~Ð~Ð~ð	Ý”j Ñ-Ô-ˆGØ%ŸkškÐ*;¸TÔ=O×=SÒ=SÐTeÐgiÑ=jÔ=jÑkÔkˆOÝ˜o­tÑ4Ô4ð PØ"&Ô"4×"8Ò"8Ð9JÈBÑ"OÔ"O�Ø�{Š{˜9 eÑ,Ô,ð hØ×&Ò& Ñ7Ô7Ð7Ø×/Ò/Ñ1Ô1Ð`°D×4^Ò4^Ñ4`Ô4`Ð`Ð`Ð`à×1Ò1°/È'Ï+Ê+ÐV^Ð`eÑJfÔJfÐ1ÑgÔgÐgøÝÔ$¥iÐ0ð 	ð 	ð 	ÝŒJÐKÑLÔLÐLÝ”9 4×#;Ò#;Ñ#=Ô#=Ð>Ñ>Ô>Ð~ÐA~ÐA~ÕW\Ð]a×]zÒ]zÑ]|Ô]|ÑW}ÔW}ÐA~ÑA~ÔA~Ð~Ð~Ð~Ð~Ð~ð	øøøs   ÁCE Ä *E ÅA>GÇGc                 óš  —  |dd¬¦  «         | j         j                             ||¬¦  «        }|                      ||¦  «        }d|v r2d|v sd|v rt	          j        |¦  «         n)t	          j        |¦  «         nt	          j        |¦  «         t          | d¦  «        r| `|  	                    ¦   «         g|  
                    ¦   «         ¢d	‘R S )
Nr   zStarting installation...)Údesc©r2  r?  ú	[Warning]ú	[CRITICALrA   r   )r   rE   Úinstall_plugin_from_urlrC  rŸ   r    r1  rD   rA   rà   rY   )r(   rŠ   r2  r=  s       r*   r  z1PluginManagerUIPlugin._install_plugin_and_refreshÅ  sé   € Øˆ�Ð3Ð4Ñ4Ô4Ð4ØœÔ0×HÒHÈÐW_ÐHÑ`Ô`ˆØ×6Ò6°s¸NÑKÔKˆØ˜.Ð(Ð(Ø˜nÐ,Ð,°¸~Ð0MÐ0MÝ”
˜>Ñ*Ô*Ð*Ð*å”˜Ñ'Ô'Ð'Ð'åŒJ�~Ñ&Ô&Ð&Ý�4Ð3Ñ4Ô4ð 	.ØÐ-Ø×'Ò'Ñ)Ô)Ð\¨D×,VÒ,VÑ,XÔ,XÐ\ÐZ\Ð\Ð\Ð\r+   c                 ó.  — |s@t          j        ¦   «         gd„ t          |                      ¦   «         ¦  «        D ¦   «         ¢R S 	 t	          j        |¦  «        }|                     d¦  «        }|                     d¦  «        }|dk    r_|                     d¦  «        }|st          d¦  «        ‚| j        j	         
                    ||¬¦  «        }|                      ||¦  «        }�nô|r|st          d¦  «        ‚d	}|d
k    r’| j        j	                             |¦  «        }t          5  | j                             dg ¦  «        }||v r3|                     |¦  «         || j        d<   |                      ¦   «          d d d ¦  «         n# 1 swxY w Y   �nG|dk    r#| j        j	                             ||¬¦  «        }�n|dk    r"| j        j	                             ||¬¦  «        }nö|dk    r|                      |¦  «         d|› d�}nÔ|dk    rQ| j        j	                             ||¬¦  «        }d|v r+|                      |¦  «         |                     dd¦  «        }n}|dk    rwt          5  | j                             dg ¦  «        }	||	v r3|	                     |¦  «         |	| j        d<   |                      ¦   «          d d d ¦  «         n# 1 swxY w Y   d|› d�}d|v r=|dv rd| _        d|v sd|v rt          j        |¦  «         nJt          j        |¦  «         n5d|v sd|v sd|v rt          j        |¦  «         nt          j        |¦  «         n‰# t          j        t          f$ r4}
t          j        d|
› �¦  «         t5          j        ¦   «          Y d }
~
nDd }
~
wt8          $ r4}
t          j        d|
› �¦  «         t5          j        ¦   «          Y d }
~
nd }
~
ww xY wt;          | d¦  «        r| `|                      ¦   «         g|                       ¦   «         ¢R S )Nc                 ó4   — g | ]}t          j        ¦   «         ‘ŒS r=   r&  rN  s     r*   rR   zIPluginManagerUIPlugin._handle_plugin_action_from_json.<locals>.<listcomp>Ö  s   € Ð"_Ð"_Ð"_°1¥2¤9¡;¤;Ð"_Ð"_Ð"_r+   rÆ   r‡   Úinstall_from_storerŠ   z.URL is required for install_from_store action.r[  z"Action and plugin_id are required.r   Ú	uninstallr°   r'  Ú	reinstallr·   z[Success] Plugin 'z;' enabled. Please restart WanGP for changes to take effect.r¸   r?  r@  z*It has been enabled. Please restart WanGP.Údisable_localz<' disabled. Please restart WanGP for changes to take effect.)ra  rb  r'  rc  r·   r¸   rd  Tr\  r]  z[Error]z!Could not perform plugin action: zPlugin action failed: rA   )!rŸ   r'  rR  r]   rS  rT  rg   Ú
ValueErrorr   rE   r^  rC  Úuninstall_pluginr   r-   Úremover8  Úupdate_pluginÚreinstall_pluginr:  Úinstall_local_pluginrb   r'   r    r1  rV  Ú	tracebackÚ	print_excrG   rD   rA   rà   rY   )r(   rK  r2  rX  rÆ   r‡   rŠ   r=  Úcurrent_enabledr°   rI   s              r*   r  z5PluginManagerUIPlugin._handle_plugin_action_from_jsonÔ  sU  € Øð 	aÝ”I‘K”KÐ`Ð"_Ð"_½¸d×>[Ò>[Ñ>]Ô>]Ñ8^Ô8^Ð"_Ñ"_Ô"_Ð`Ð`Ð`ð<	"Ý”j Ñ-Ô-ˆGØ—[’[ Ñ*Ô*ˆFØŸš KÑ0Ô0ˆIàÐ-Ò-Ð-Ø—k’k %Ñ(Ô(�Øð WÝ$Ð%UÑVÔVÐVØ!%¤Ô!8×!PÒ!PÐQTÐ_gÐ!PÑ!hÔ!h�Ø!%×!>Ò!>¸sÀNÑ!SÔ!S�‘àð L Yð LÝ%Ð&JÑKÔKÐKØ!#�Ø˜[Ò(Ð(Ø%)¤XÔ%<×%MÒ%MÈiÑ%XÔ%X�NÝ$ð 8ð 8Ø*.Ô*<×*@Ò*@ÐARÐTVÑ*WÔ*W˜Ø$¨Ð7Ð7Ø+×2Ò2°9Ñ=Ô=Ð=ØDS˜DÔ.Ð/@ÑAØ ×5Ò5Ñ7Ô7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ùð ˜xÒ'Ð'Ø%)¤XÔ%<×%JÒ%JÈ9Ð_gÐ%JÑ%hÔ%h�N‘NØ˜{Ò*Ð*Ø%)¤XÔ%<×%MÒ%MÈiÐbjÐ%MÑ%kÔ%k�N�NØ˜~Ò-Ð-Ø×*Ò*¨9Ñ5Ô5Ð5ð &A¸)ð  &Að  &Að  &A�N�NØ˜Ò.Ð.Ø%)¤XÔ%<×%QÒ%QÐR[ÐfnÐ%QÑ%oÔ%o�NØ" nÐ4Ð4Ø×.Ò.¨yÑ9Ô9Ð9Ø)7×)?Ò)?Ð@qð  t`ñ  *aô  *a˜øØ˜Ò.Ð.Ý$ð 8ð 8Ø*.Ô*<×*@Ò*@ÐARÐTVÑ*WÔ*W˜Ø$¨Ð7Ð7Ø+×2Ò2°9Ñ=Ô=Ð=ØDS˜DÔ.Ð/@ÑAØ ×5Ò5Ñ7Ô7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð &B¸)ð  &Bð  &Bð  &B�Nà˜nÐ,Ð,Øð  Jð  Jð  JØ,0�DÔ)Ø .Ð0Ð0°KÀ>Ð4QÐ4QÝ”J˜~Ñ.Ô.Ð.Ð.å”G˜NÑ+Ô+Ð+Ð+Ø˜nÐ,Ð,°¸~Ð0MÐ0MÐQ\Ð`nÐQnÐQnÝ”
˜>Ñ*Ô*Ð*Ð*å”˜Ñ'Ô'Ð'øøÝÔ$¥jÐ1ð 	"ð 	"ð 	"ÝŒJÐ>¸1Ð>Ð>Ñ?Ô?Ð?ÝÔÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!øøøøÝð 	"ð 	"ð 	"ÝŒJÐ3°Ð3Ð3Ñ4Ô4Ð4ÝÔÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøõ �4Ð3Ñ4Ô4ð 	.ØÐ-à×'Ò'Ñ)Ô)ÐX¨D×,VÒ,VÑ,XÔ,XÐXÐXÐXsq   ÁC$M Ä(AFÅ;M ÆFÆM ÆFÆCM É+AK
Ê>M Ë
KËM ËKËA?M ÍOÍ(*NÎOÎ$*OÏOrW   )F)(Ú__name__Ú
__module__Ú__qualname__r    r;   r?   rJ   rU   rY   r]   ri   rr   rt   r~   rM   rX   r®   r«   rà   ræ   r9   Údictr+  r   r  Úintr0  r8  rn   r:  r<  rC  rU  ÚboolrF  rJ  r  r  r  Ú__classcell__)r)   s   @r*   r   r      s   ø€ € € € € ð&ð &ð &ð &ð &ð
ð 
ð 
ð fð fð fðP	ð 	ð 	ðtð tð tðqð qð qð2ð 2ð 2ðZð Zð Zðoð oð oðIð Ið Ið>ð >ð >ð8>ð 8>ð 8>ð 8>ðtzð zð zðGð Gð Gð1>ð 1>ð 1>ð 1>ðfZjð Zjð Zjðxdð dð dð
Að Að AðFC 4ð Cð Cð Cð Cð )6¨©¬ð Yð Yð Yð Yð¨#ð ð ð ð ð(Fð Fð Fð¨3ð ð ð ð ð°ð ð ð ð ð¨Cð Àð ð ð ð ðYð Y°Tð YÀ4ð Yð Yð Yð Yð	°ð 	ð 	ð 	ð 	ð¨sð ð ð ð ð" 9F¸¹¼ð ]ð ]ð ]ð ]ð JWÈÉÌð DYð DY¸3ð DYð DYð DYð DYð DYð DYð DYð DYr+   r   )ÚgradiorŸ   Úshared.gradio.progressr   rS  r¿   rk  Úshared.utils.config_storer   r   r   Úshared.utils.pluginsr   r   r	   r
   r   r   rT   r   r=   r+   r*   ú<module>ry     s  ðØ Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ Nð gð  gð  gð  gð  gð  gð  gð  gð  gð  gð  gð  gð  gð  gð  gð  gðÐ ðGYð GYð GYð GYð GY˜Lñ GYô GYð GYð GYð GYr+   