__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
�

�QDb����r�SSKrSSKJr SSKJr SSKrSSKrSSKrSSKrSSK	r
SSKrSSKrSSKJ
r
Jr SSKJr SS/rS	\R""S
54S\R""S54S
\R""S54S\R""S54S\R""S54S\R""S54S\R""S54S\R""S54S\R""S54S\R""S54S\R""S54S\R""S 54/r0r\Hurr\\\R-5'M S!S"S#S$S%S&S'.r\R""S(5r\R""S)5r\R""S*5r\R""S+\R65rS,rS-rS.r"S/S5r S0r!g)1�N�)�
parseDeviceID)�xmldriverprefs)�_debugprint�set_debugprint_fn)�reduce�ppdMakeModelSplit�PPDs�HPzhdeskjet|dj[ 0-9]?|laserjet|lj|color laserjet|color lj|designjet|officejet|oj|photosmart|ps |psc|edgeline�Epsonzstylus|aculaser�Applez.stylewriter|imagewriter|deskwriter|laserwriter�Canonz%pixus|pixma|selphy|imagerunner|bj|lbp�Brotherz
hl|dcp|mfc�Xeroxz/docuprint|docupage|phaser|workcentre|homecentre�Lexmarkzoptra|(:color )?jetprinter�KONICA MINOLTAzmagicolor|pageworks|pagepro�Kyocerazfs-|km-|taskalfa�Ricoh�aficio�Oce�
varioprint�Okizokipage|microline�DeskJet�LaserJet�	OfficeJetzColor LaserJet�
PhotoSmart�)�dj�lj�ojzcolor ljzps zhp �
turboprintz! v(?:er\.)?\d(?:\d*\.\d+)?(?: |$)zn,| hpijs| foomatic/| - | w/| \(| postscript| ps| pdf| pxl| zjs| zxs| pcl3| printer|_bt| pcl| ufr ii| br-scriptz series| all-in-onec��UR5 SnSnUR5n[H!upEURU5(dMUnUn O Uc�[RU5(a�UR
S5nUS:wa#URS5nXx:waXS-UnOUSUnURSS5up[R"S	S
U5n[R"SS
U5n[R"S	S
U5n[R"SS
U5n[R"SS
U5n[R"SSU5nSnO�URS5(aSnUSSnO�URS5(aSnUSSnOqURS5(aSnUSSnOSURS5(aSnUSSnO5URS5(aSnUSSnOSnURS
S5upUR5n	U(a�U	RS5(aU	RS 5(aS!nS"n	OOU	RS#5(aU	RS$5(aSnS%n	O[RU	5nU(aUnUR5n
U
R
S&5nUS:wa6[RU
5nU(aUR!5n
U
SU
n
USU
n["RU
5nU(aUR!5nU
SUn
USUn[$R'SUSS'9unnU(aUR5n
U	S":XaW[(R+5H?unnU
RU5(dMUU[-U5S-nUR5n
 O UR5nX4$! UnSnGN=f! UnSnGN�=f)(z�
Split a ppd-make-and-model string into a canonical make and model pair.

@type ppd_make_and_model: string
@param ppd_make_and_model: IPP ppd-make-and-model attribute
@return: a string pair representing the make and the model
NFz TurboPrint�����_rrz(?<=[a-z])(?=[0-9])� z(?<=[a-z])(?=[A-Z])z Jet�JetzPhoto SmartrTzkonica minolta r�zlexmark international r�z
kyocera mita r�
zkyocera �zfuji xerox z
Fuji Xerox��hewlett�packardr�hp�konica�minoltazkonica minoltaz v)�count)�strip�lower�
_MFR_BY_RANGE�match�_RE_turboprint�search�find�rfind�split�re�sub�
startswith�endswith�_MFR_NAMES_BY_LOWER�get�_RE_version_numbers�start�_RE_ignore_suffix�_RE_ignore_series�subn�_HP_MODEL_BY_NAME�items�len)�ppd_make_and_model�make�cleanup_make�l�mfr�regexp�model�t�t2�makel�modell�v�vmatch�vstart�suffix�suffixstart�n�name�fullnames                   �2/usr/lib/python3/dist-packages/cupshelpers/ppds.pyr	r	ws��������D��L�� � �#�A�$����<�<�����D�&�E��	%��|��-�-�q�1�1��#�#�]�3����7�#�)�)�=�9�B��w�%7�B��r�%B�"�%7���%;�"�	�,�2�2�3��:�K�D��v�v�-�s�D�9���v�v�-�s�D�9�����.��U�;�����.��U�;��������.�������e�<����
���(�	)�	)���"�2�3�'��	
���/�	0�	0���"�2�3�'��	
����	'�	'���"�2�3�'��	
���z�	"�	"���"�1�2�&��	
���}�	%�	%���"�2�3�'����	�,�2�2�3��:�K�D�
�J�J�M�E�����i�(�(��N�N�I�&�&��D��E�����)�)��n�n�i�(�(�#�D�$�E�&�)�)�5�1�C�����[�[�^�F����T��A��B�w�%�+�+�V�4����\�\�_�F��G�V�_�F��'�6�N�E�
�
%�
%�v�
.�F�
��l�l�o�����%���l�{�#��#�'�'��U�!�'�<�J�U�A���������}�/�5�5�8�N�D�(�� � �$�'�'� �5��d���#5�5��������	9�
�K�K�N�E��=���C	�%�D��E��>	�%�D��E�s�(O�(O�O�Oc��UR5R5nSnSnSnSnUnSn[[U55H}nXR	5(aXd:waU(aUS-
nUnO-XR5(aXe:waU(aUS-
nUnOUnXR
5(dMtX!U-
nSnM U$)a�
This function normalizes manufacturer and model names for comparing.
The string is turned to lower case and leading and trailing white
space is removed. After that each sequence of non-alphanumeric
characters (including white space) is replaced by a single space and
also at each change between letters and numbers a single space is added.
This makes the comparison only done by alphanumeric characters and the
words formed from them. So mostly two strings which sound the same when
you pronounce them are considered equal. Printer manufacturers do not
market two models whose names sound the same but differ only by
upper/lower case, spaces, dashes, ..., but in printer drivers names can
be easily supplied with these details of the name written in the wrong
way, especially if the IEEE-1284 device ID of the printer is not known.
This way we get a very reliable matching of printer model names.
Examples:
- Epson PM-A820 -> epson pm a 820
- Epson PM A820 -> epson pm a 820
- HP PhotoSmart C 8100 -> hp photosmart c 8100
- hp Photosmart C8100  -> hp photosmart c 8100

@type strin: string that can be the make or the model
@return: a normalized lowercase string in which punctuations have been replaced with spaces.
rrr�Fr&T)r3r4�rangerI�isalpha�isdigit�isalnum)	�strin�lstrin�
normalized�BLANK�ALPHA�DIGIT�lastchar�
alnumfound�is	         r]�	normalizerm�s���0�[�[�^�
!�
!�
$�F��J�
�E�
�E�
�E��H��J�
�C��L�
!���9������ �Z��c�!�
��H�
�Y�
�
�
!�
!�� �Z��c�!�
��H��H��9�������)�#�J��J�"� ��c�:�[U[5(aUS$U$)zwIf we don't know whether getPPDs() or getPPDs2() was used, this
function can unwrap an item from a list in either case.r)�
isinstance�list)�xs r]�
_singletonrs.s���1�d�����t���Hrnc
��\rSrSrSrSrSrSrSr\	RRr\	RRr\	RRr
\	RRr\	RRr\\\\\
\\\\\0rSSjrS	rS
rSrSrS
rSSjrSSjrSSjrSrSSjrSrSrSrg)r
i5aD
This class is for handling the list of PPDs returned by CUPS.  It
indexes by PPD name and device ID, filters by natural language so
that foreign-language PPDs are not included, and sorts by driver
type.  If an exactly-matching PPD is not available, it can
substitute with a PPD for a similar model or for a generic driver.
rrr_�Nc��UR5UlSUlSUl[R
"5Ul[R"5UlUcR[RRS5nUc0SSKJ
n [RRUR S5n[RRUS5n[R""U5upgURR%U5 URR%U5 UbUS	:XdUS
:XaSnUR+S5n	U	S
:waUSU	n
OUn
/nURR-5H;up�[/U
S5nUS:XaMX�:XaM#X�:XaM*UR3U5 M= UHnURU	M SUR;aH[/URSS5nUR5S5(dSU-URSS'ggg![&a,n[)SW<SU<35 SUlSUlSnAGN+SnAff=f![0a M�f=f)z�
@type ppds: dict
@param ppds: dict of PPDs as returned by cups.Connection.getPPDs()
or cups.Connection.getPPDs2()

@type language: string
@param language: language name, as given by the first element
of the pair returned by locale.getlocale()
N�CUPSHELPERS_XMLDIRr)�config�cupshelperszpreferreddrivers.xmlzError loading �: �C�POSIX�en_USr%r#zppd-natural-language�en�raw�ppd-make-and-modelzGeneric )�copy�ppds�makes�idsr�DriverTypes�drivertypes�PreferenceOrder�	preforder�os�environrArrx�path�join�
sysconfdir�PreferredDrivers�load�	Exception�printr9rHrs�KeyError�appendr>)�selfr��language�xml_dirrx�xmlfiler��preferenceorder�e�u�short_language�	to_remove�ppdname�ppddict�natural_language�	makemodels                r]�__init__�
PPDs.__init__Ps)���I�I�L��	���
����)�5�5�8���'�7�7�:����?��j�j�n�n�&:�;�G���$��'�'�,�,��(9�(9�=�I��		"��g�g�l�l�G�-C�D�G��/�/��9�
+�[����!�!�;�/��N�N����1�
����O�����H��M�M�3�����7�%�b�q�\�N�%�N��	� $�	�	��� 2��G�
�#-�w�7M�/N�#O� � �4�'���+���1�����g�&�#!3�&!�G��	�	�'�"�!��D�I�I��"�D�I�I�e�$4�5I�$J�K�I��'�'��4�4�9C�i�9O��	�	�%� �!5�6�5���U�	"��G�Q�7�8�#�D��!�D�N�N��	"��(�
��
�s+�.A.H�.I�
I� !I�I�
I�Ic��UR5 [URR55nUR	[
RS9 URS5 URSS5 U$![a U$f=f)zX
@returns: a list of strings representing makes, sorted according
to the current locale
��key�Genericr)
�_init_makesrqr��keys�sort�locale�strxfrm�remove�insert�
ValueError)r��
makes_lists  r]�getMakes�
PPDs.getMakes�s|��
	
�����$�*�*�/�/�,�-�
����V�^�^��,�	����y�)����q�)�,�����	����	�s�#A7�7
B�Bc���UR5 [URUR55nSnUR[R"U5S9 U$![a /s$f=f)zP
@returns: a list of strings representing models, sorted using
cups.modelSort()
c�Z�[U5n[U5n[R"X#5$�N)rm�cups�	modelSort)�a�b�first�seconds    r]�compare_models�&PPDs.getModels.<locals>.compare_models�s#���q�M�E���]�F��>�>�%�0�0rnr�)r�rqr�r�r�r��	functools�
cmp_to_key)r�rK�models_listr�s    r]�	getModels�PPDs.getModels�sp��
	
����	��t�z�z�$�/�4�4�7�8�K�	1�	���Y�1�1�.�A��B�����	��I�	�s�&A � A/�.A/c�l�UR5 URUU$![a 0s$f=f)z�
Obtain a list of PPDs that are suitable for use with a
particular printer model, given its make and model name.

@returns: a dict, indexed by ppd-name, of dicts representing
PPDs (as given by cups.Connection.getPPDs)
)r�r�r�)r�rKrPs   r]�getInfoFromModel�PPDs.getInfoFromModel�s=��	
����	��:�:�d�#�E�*�*���	��I�	�s�$�3�3c� �URU$)zJ
@returns: a dict representing a PPD, as given by
cups.Connection.getPPDs
)r�)r�r�s  r]�getInfoFromPPDName�PPDs.getInfoFromPPDName�s��
�y�y��!�!rnc�j�URRU[RR5$r�)�_fit_to_statusrAr�
DriverType�FIT_NONE)r��fits  r]�getStatusFromFit�PPDs.getStatusFromFit�s'���"�"�&�&��^�-F�-F�-O�-O�P�Prnc�&�Uc/nUc/nUc0nUR(a�UR(a�0nUHnURUXg'M URRURUU5n[	S[U5-5 URR
UXe5n	[	S[U	5-5 U	V
s/sHo�SPM	 nn
[	S[U5-5 [5nUH(nURS5up�nURU5 M* U(ac/nUH0nURS5up�nUU;dMURU5 M2 U(a$UHnUU;dMURU5 M UnU$s sn
f)a

Sort a list of PPD names by preferred driver type.

@param ppdnamelist: PPD names
@type ppdnamelist: string list
@param downloadedfiles: Filenames from packages downloaded
@type downloadedfiles: string list
@param make_and_model: device-make-and-model name
@type make_and_model: string
@param devid: Device ID dict
@type devid: dict indexed by Device ID field name, of strings;
except for CMD field which must be a string list
@param fit: Driver fit string for each PPD name
@type fit: dict of PPD name:fit
@returns: string list
z9Valid driver types for this printer in priority order: %sz5PPDs with assigned driver types in priority order: %srz(Resulting PPD list in priority order: %s�/)r�r�r��get_ordered_typesr�repr�get_ordered_ppdnames�set�
rpartition�addr�)r��ppdnamelist�downloadedfiles�make_and_model�devidr�r�r��orderedtypes�orderedppds�typ_name�downloadedfnames�downloadedfiler��slash�fname�downloadedppdnames�ppdfnames                  r]�orderPPDNamesByPreference�PPDs.orderPPDNamesByPreference�s���*���K��"� �O��;��C��������D�&�� $�	�	�'� 2��
�'� �>�>�;�;�T�=M�=M�=K�=B�D�L�
�S�VZ�[g�Vh�h�i��*�*�?�?��AE�L�K��O�RV�Wb�Rc�c�d�7B�C�{�8�A�;�{�K�C��B�T�+�EV�V�W��5��-�N�#1�#<�#<�c�#B� �T�%�� � �%�(�.��!#��&��*1�*<�*<�c�*B�'��h��/�/�&�-�-�w�7�'�"�*�G��&8�8�*�1�1�7�;� +�1�����5Ds�Fc	��[SU<SU<35 UnUnUR5 Uc/n0n	UR5n
UR5nSnURU
UHn
URX�'M SnU
S:XagURSUHn
URX�'M [SURSU-5 [S	U<S
U<S35 [S5 Sn[S
5 SnUR
5 SnU
S:Xa#[U5up[U5n
[U5n[SU
-5 [SU-5 SSSS.nX�R;aURU
nO<U
U;a6UU
nUUR;a!UnUn
[SU
-5 URU
n[SU-5 UGbVURUnUR[U5nU
SS4HHnURUS-5(dMU[U5S-Sn[U5n[SU-5 MJ X�RU
;aBUUnUUR5H%n
URX�'[X�<SU
<35 M' O�[US-U-5unn[U5n[SU-5 UURU
;aJUUn[UUR55H%n
URX�'[X�<SU
<35 M' U	(dLU(aEUR!X�5unnUUR":wa!UHn
UX�'[X�<SU
<35 M U(at[%U5[:waUR'S5n[S5 UR)U5nU(a-UH'nUR*U	U'[U	U<SU<35 M) U(aHURS5(d�URS5(d�URS5(aSU;a|[-5nU	R5H,nURS 5(dMUR/U5 M. [U5S!:�a[S"U-5 UHn
X�	M [-5nU(Ga�[U5S!:�Ga�[-5n[-5nU	R5H�nSnUR0Un [3U R5S#55n!U!(a[7U!5n"U"S$nU(d8UR9S%5S&:Xa#[3U R5S'55n#U#S(:XaS)/nU(dM�Sn$UH
n%U%U;dMSn$ O U$(aUR/U5 M�UR/U5 M� UH@n
X�UR:XdMUR:X�'[UR:S*U
--5 MB [U5[U	R=5V&V's/sHun&n'U'S+:wdMU&PM sn'n&5:a[S,U-5 UHn
X�	M O[S-U-S.-5 U	(d�S/S0/n(Sn)U(H�n*[S1U*-5 U*S2-n+UR0R5HBn,U,R?U*5(dU,R?U+5(dM1UR"U	U,'Sn) O U)(a O[S3U*-5 M� U)(d>[S45 UR"U	[UR0R55S!'U(do[@RB"S5S6[EU5S79n-[GS8U5n.S9U<S
U<S3n/U.(aU/S:U.--
n/U(aU/S;U--
n/[S<U--5 [U/5 U	$![
a GN_f=f![
a GNf=fs sn'n&f![Ha Sn.Nzf=f)=a
Obtain a best-effort PPD match for an IEEE 1284 Device ID.

@param mfg: MFG or MANUFACTURER field
@type mfg: string
@param mdl: MDL or MODEL field
@type mdl: string
@param description: DES or DESCRIPTION field, optional
@type description: string
@param commandsets: CMD or COMMANDSET field, optional
@type commandsets: string
@param uri: device URI, optional (only needed for debugging)
@type uri: string
@param make_and_model: device-make-and-model string
@type make_and_model: string
@returns: a dict of fit (string) indexed by PPD name
�
r&NFT�hewlett-packardr/z&**** Incorrect IEEE 1284 Device ID: %sz**** Actual ID is MFG:z;MDL:�;z4**** Please report a bug against the HPLIP componentzTrying make/model namesrzmfgl: %szmdll: %s�lexmarkzkyocera mita)r�zlexmark international�kyocerazremapped mfgl: %szmake: %srzunprefixed mdll: %srzzre-split mdll: %s�,zChecking CMD fieldzipp:zipps:�dnssdz._ippzdriverless:rz$Removed %s due to non-IPP connection�
ppd-device-id�CMD�:r#zppd-type�
postscript�
POSTSCRIPTz: %s�genericzRemoved %s due to CMD mis-matchzNot removing %s z3due to CMD mis-match as it would leave nothing goodztextonly.ppdzpostscript.ppdz
'%s' fallbackz.gzzFallback '%s' not availablez#No fallback available; choosing anyz
//[^@]*@/?z//)�pattern�repl�stringc��US-U-$)Nr���rr�ys  r]�<lambda>�.PPDs.getPPDNamesFromDeviceID.<locals>.<lambda>s��1�s�7�A�:rnzMFG:zCMD:%s;zDES:%s;zNo ID match for device %s:)%r�	_init_idsr4r��	FIT_EXACTr�r�r	rm�lmakesr��lmodelsr>rIr�rq�_findBestMatchPPDsr��typer;�_getPPDNameFromCommandSet�FIT_GENERICr�r�r�rsrArr9�
FIT_EXACT_CMDrHr?r<r=�strr�	TypeError)0r��mfg�mdl�description�commandsets�urir��orig_mfg�orig_mdlr��mfgl�mdll�
id_matched�each�mdlsrK�mfgrepl�rmfg�mdlsl�prefixrP�mfg2�mdl2�mdl2l�sr�r��driver�failedr��	exact_cmd�
ppd_cmd_field�ppd�
ppd_device_id�ppd_device_id_dict�ppd_type�usable�pdl�d�m�	fallbacks�found�fallback�
fallbackgz�ppdpath�
sanitised_uri�cmd�ids0                                                r]�getPPDNamesFromDeviceID�PPDs.getPPDNamesFromDeviceIDs���(	�#�s�+�,������������K���
�y�y�|���y�y�|���
�	������t�,�� �N�N��	�-��J�
�$�$�	
� �H�H�T�N�4�0�D� $���C�I�1��E�!�X�X�d�^�D�1�2�3��3��L�M��S�T�!�
�
	�.�/����������2�:�*�C�0�J�S��c�?�D��c�?�D��Z�$�&�'��Z�$�&�'�&*�,5�,�.���;�;���;�;�t�$�D�
�W�_��4�=�D��t�{�{�"������0�4�7�8��{�{�4�(���Z�$�&�'����:�:�d�#�D��L�L��4��1�E� �!2�D�9���?�?�F�S�L�1�1��c�6�l�Q�.�/�0�C�$�c�?�D��!6��!=�>�	:��|�|�D�)�)��d��� ��K�,�,�/�D� $���C�I��S�Y��!=�>�0� 1�#��)�c�/�B���t�!�4�(���0�5�8�9��D�L�L��.�.�!�%�L�E� $�T�%�[�%5�%5�%8� 9��$(�N�N��	�#���D�%A�B�!:��t��/�/��;�I�Q���D�M�M�!� �D� !�C�I��S�Y��!=�>�!���[�!�T�)�)�/�/��5���-�.��4�4�k�B�G��%�F�"&�"2�"2�C��K��S��[�&�!A�B�&������'�'�����(�(��.�.��)�)��S�.��U�F��8�8�;���&�&�}�5�5��J�J��(�'��F��a���C�f�L�M�"�D��	�#��U�F�0�#�{�+�a�/��U�F���I��8�8�;�� $�
��i�i��(�� *�C�G�G�_�,E� F�
� �)6�
�)F�&�$6�u�$=�M�%�
�L�L�#�&�"�,� *�3�7�7�J�+?�@�H��<�/�)5��
�$����(�C��k�)�!%���)�
��M�M�7�+��J�J��(�E'�L"���9����.� $� 2� 2�C�I���!3�!3�f�t�m�!C�D�"�
�F�|�c�C�I�I�L�$7�L�&�1�a�'(�I�~�%&�L�$7�8�8��>��G�H�"�D��	�#��/�&�8�2�2�3��'�)9�:�I��E�%���_�x�7�8�%��-�
�#�y�y�~�~�0�G��(�(�(�3�3��(�(�*�5�5�'+�}�}��G�� $��� 1����:�X�E�F�&���B�C�26�-�-��D������*�+�A�.�/���F�F�L�t�+.��9�6�M�
��5�{�C���&.�x�8�B���i�#�o�%����i�+�-�-���5�
�E�F�����
��A�	��	���
��
��F$7��J�
���
�sC�)_
�A&_�#
_/�4_/�<
_5�
_�_�
_,�+_,�5`�`c�,�Uc/nUc/nURXUXEU5nXUUS.n	UR[UR55UUX�5n
[	S[U
5-5 UR
X�S5n[	SU
SU4-5 X�S4$)aJ
Obtain a best-effort PPD match for an IEEE 1284 Device ID.
The status is one of:

  - L{STATUS_SUCCESS}: the match was successful, and an exact
    match was found

  - L{STATUS_MODEL_MISMATCH}: a similar match was found, but
    the model name does not exactly match

  - L{STATUS_GENERIC_DRIVER}: no match was found, but a
    generic driver is available that can drive this device
    according to its command set list

  - L{STATUS_NO_DRIVER}: no match was found at all, and the
    returned PPD name is a last resort

@param mfg: MFG or MANUFACTURER field
@type mfg: string
@param mdl: MDL or MODEL field
@type mdl: string
@param description: DES or DESCRIPTION field, optional
@type description: string
@param commandsets: CMD or COMMANDSET field, optional
@type commandsets: string
@param uri: device URI, optional (only needed for debugging)
@type uri: string
@param downloadedfiles: filenames from downloaded packages
@type downloadedfiles: string list
@param make_and_model: device-make-and-model string
@type make_and_model: string
@returns: an integer,string pair of (status,ppd-name)
)�MFG�MDL�DESr�zFound PPDs: %srzUsing %s (status: %d))r0r�rqr�rrr�)r�rr	r
rrr�r�r�r�r��statuss            r]�getPPDNameFromDeviceID�PPDs.getPPDNameFromDeviceID(s���L���K��"� �O��*�*�C�k�,7�,:�<���$�$�'���4�4�d�3�8�8�;�6G�6E�6D�6;�B��	�%��[�(9�9�:��&�&���N�(;�<���,��A���/G�G�H��A��'�'rnc��[S5 UR5nURS5(a
USSnUSSnSnSn[UR	55nUVs/sHowUR54PM nnURX#45 UR
[R"S5S9 URX#45n	X�S-
/n
U	S-[U5:a:U
RX�S-5 [U
SSS	-U-S	-U
SS-5 O[U
SSS	-U-5 U
Hkup�[RRX�/5n
[U
5U:�dM6[XR	55n[U
5n[S
X�4-5 Mm U(aBU[U5S-:�a0UnU[U5:XaURnX�4$URnX�4$UR nSnUR
[R"["R$5S9 UVs/sHowR5X4PM nnSnUR'S5HLnUcUnS
n[)[U55Hn	UU	R+5(dMSn O U(dMJUn O SnSnSn[)[U55H4n	UU	R+5(aUS:XaU	nU	nUS-
nM,US:wdM4 O US-
nSnUS:�a�[-UUU5nUSUS-UUS-n[SUUU4-5 SnSnS
nUU:a�[/SU5nUUU-U--n[SUUU4-5 UHXunnUR'S5HnUR5U:XdMSn O U(dM?[UR	55n O U(aOUS-
nUS:aOUU:aM�U(aUnURnX�4$s snfs snf)zd
Find the best-matching PPDs based on the MDL Device ID.
This function could be made a lot smarter.
zTrying best matchz seriesNi����rc�<�[R"USUS5$)Nr)r�r�r�s  r]r��)PPDs._findBestMatchPPDs.<locals>.<lambda>|s��d�n�n�Q�q�T�ST�UV�SW�>Xrnr�rz <= z%s: match length %dr_r&FTr#z%dz'Searching for model ID '%s', '%s' %% %d�
z#Ignoring %d of %d digits, trying %s)rr4r?rqr�r�r�r�r��indexrIr�r��commonprefixr��	FIT_CLOSEr�r�r�r;r`rb�int�pow)r�rr	r�best_mdl�
best_matchlen�mdlnamesrr�	mdlnameslrl�
candidates�	candidate�
candidatelrr�r��mdlitems�modelid�word�have_digits�digits�digits_start�
digits_end�modelnumber�modelpattern�
ignore_digitsr)�divr[r�s                              r]r�PPDs._findBestMatchPPDsisM��	�(�)��y�y�|���=�=�)�$�$����9�D��c�r�(�C����
���	�	��%��.6�6�X������^�X�	�6����3�+�&����I�0�0�1X�Y��Z��O�O�c�[�)���A��&�'�
��q�5�3�	�?�"����y�Q��/�0���A��q�)�F�2�S�8�6�A�"�1�
�a�(�)�
*�
��A��q�)�F�2�S�8�9�(2�#�Y��W�W�)�)�J�+=�>�F��F�|�m�+���� 4� 4� 7�8�� #�V��
��2�i�5O�O�P�(2��
��d��a��8�"�K���T�
�*��n�n��Z�!�!�W�n�n��V�!�!�S�-�-�C��K�
�M�M�y�3�3�D�N�N�C�M�D�7?�@�x�!����T�W�-�x�H�@��G��
�
�C�(���?�"�G�#����T�
�+�A��A�w���)�)�&*���,�
�;�"�G��)��F��L��J��C��M�*���1�:�%�%�(�(�#�r�)�'(��!"�J��a�K�F�!�R�'��+�
�!�O�J��K���z�!�7�<�
�#C�D�� '�
�� 6�� =� '�
�� 4�!5���F�%�|�[�A�B�C� !�
�����#�f�,��r�=�1�C�*�{�S�/@�C�.G�H�G��!F�"/���!A�"B�C�)1���t�$(�J�J��$4�D�#�z�z�}��7�(,�� %�%5�
!�5�'+�D�I�I�L�'9�H�!�)1���!�Q�&�M���z��+$�f�,�.�"*�K��.�.�C��!�!��M7��JAs�O>�*Pc�^^�Uc/nTR5 TRSmUU4SjnUVs/sHo3R5PM nnSU;dSU;dSU;aU"S5$SU;dS	U;dS
U;dSU;a	U"SS
5$SU;a	U"SS
5$SU;a	U"SS
5$SU;dSU;a	U"SS
5$SU;a	U"SS
5$SU;dSU;dSU;aU"S5$g![a gf=fs snf)z^Return ppd-name list or None, given a list of strings representing
the command sets supported.Nr�c�h>�UH+nTRTU5up#UTR:XdM)Us $ gr�)rr�)rFrPrr��modelsr�s    ��r]rA�+PPDs._getPPDNameFromCommandSet.<locals>.get�s7���#�� �3�3�V�U�C�	������&��K�$�rnr��postscript2zpostscript level 2 emulation�
PostScript�pclxlzpcl-xl�pcl6zpcl 6 emulationzPCL 6/PCL XLz	PCL Laser�pcl5ezPCL 5e�pcl5czPCL 5c�pcl5zpcl 5 emulationzPCL 5�pclzPCL 3�escpl2zesc/p2�escp2ezESC/P Dot Matrix)r�r�r�r4)r�rrArr�cmdsetsrWs`    @r]r�PPDs._getPPDNameFromCommandSet�s6������K�	������Z�Z�	�*�F�	�(3�3�{�!�7�7�:�{��3�
�W�
$�-�7�*B�
+�w�
6���%�%��'�!�x�7�':��� �&7�7�&B����4�4�
��
���+�.�.�
��
���+�.�.����%6�'�%A����-�-�
�g�
����-�-��7�"��G�(;��7�"��*�+�+���9�	��	��4s�C&�C6�&
C3�2C3c	�(�UR(ag[R"5n0n0n0n0nURR5GHVupg[	US5n[U5n	[
U	/5n
URS/5n[U[5(dU/n[
UVs/sHo�RS5(dMUPM sn5nU(a�[U5S:Xa
[
5n[	URSS55R5n
U
(aU
S-
n
[U
5nUH�nURS5(a'URS5(aUS[U5S-
nU(dMI[U5nURU5(dX�-nU
R[U55 M� U
HZun
n[U
5n[U5nX�;a
X�U'0XN'0X-'OX>n
UXN;aUXNU'0X-U'OXNUnXrU
UU'M\ X�;aU
R!U	5 U
(dGM�U	un
nX�;aX]RU[
55nO0X]'[
5nUR#U
Vs/sHo�SPM	 sn5nUX]U'GMY UR5H�un
n[U
5nX>nUR5HqunnXNR[U55nU(dM+UUUnUH8nXNR[U55nUUUnUR%U5 M: Ms M� X lX0lX@l[+S	[R"5U-
-5 gs snfs snf)
Nr�zppd-product�(rzppd-makerr&�)zinit_makes: %.3fs)r��timer�rHrsr	r�rArprqr>rI�rstriprmr?r�r��union�updater�rr)r��tstartr�r�r�aliasesr�r�rJ�ppd_mm_split�ppd_makes_and_models�ppd_productsrrrK�lmake�ppd_product�lprodrP�lmodelrW�	main_make�
modelnames�
main_model�	main_ppds�	eachmodel�
this_modelr�s                           r]r��PPDs._init_makes
sb���:�:��������������� $�	�	��� 2��G�!+�W�5I�-J�!K��,�.@�A�L�#&��~�#6� �#�;�;�
�r�:�L��|�T�2�2� ,�~���L� O�L�q�L�L�#�<N��L� O�P�L����%��*�#&�5�L�!�7�;�;�
�B�#?�@�G�G�J����C�K�D�!�4�(��#/�K�#�.�.��4�4�#�,�,�c�2�2�&1�!�C��4E��4I�&J��&� �&�{�3�E� �+�+�U�3�3�&*�&8��(�,�,�.?��.M�N�$0�" 4���e�!�4�(��"�E�*���&�$(�5�M�%'�G�N�"$�E�K�!�=�D����/�-2�G�N�6�*�)+�E�K��&�#�N�6�2�E�.5�d��E�"�7�+�! 4�&�3�$�+�+�\�:�#�#� ,�
��u��?�$�]�.�.��s�u�=�F�$&�G�M� �U�F����6J�'K�6J��!��6J�'K�L��'-��
�e�$�Y!3�`$�M�M�,�L�D�&��t�$�E��
�I�%+�\�\�_�!��z�$�^�/�/��E�1B�C�
�!��!�)�,�Z�8�	�!+�I�!(��!3�!3�Y�	�5J�!K�J� ��+�J�7�D��K�K��+�",�&5�-��
������(�D�I�I�L�6�,A�B�C��c!P��t(Ls�(N

�N

�N
c���UR(ag0nURR5H�up#[UR	S55nU(dM([U5nUSR
5nUSR
5nSn[U5S:XaSn[U5S:XaSnU(aM�Xa;a0X'XqU;a/XU'XURU5 M� Xlg)Nr�r3r4FrT)	r�r�rHrsrArr4rIr�)	r�r�r�r�r/�id_dict�lmfg�lmdl�bads	         r]r��PPDs._init_idsws����8�8���� $�	�	��� 2��G��W�[�[�/�:�;�B���#�R�(�G��5�>�'�'�*�D��5�>�'�'�*�D��C��D�z�Q�����D�z�Q����������	��t�9�$�"$��	�$���I�d�O�"�"�G�,�/!3�2�rn)r�r�r�rr�r�r�)NN)NNNNN)rNNN)rNNNNr�)�__name__�
__module__�__qualname__�__firstlineno__�__doc__�STATUS_SUCCESS�STATUS_MODEL_MISMATCH�STATUS_GENERIC_DRIVER�STATUS_NO_DRIVERrr�rr�r?rr�r�r�r�r�r�r�r�r�r0r7rrr�r��__static_attributes__r�rnr]r
r
5s����N�������"�-�-�;�;�M��)�)�3�3�I��)�)�3�3�I� �+�+�7�7�K��(�(�1�1�H�$�n� �.� �"7�"�$9��!1�	4�N�IP�V� �$�"�Q�6:�37�26�37�D�L>@�7;�04�K�Z=?�6:�04�/3�?(�Bw"�r&�PkD�Zrnc��[S5 g)NzBusage: ppds.py [--deviceid] [--list-models] [--list-ids] [--debug])r�r�rnr]�
_show_helpr��s��	�O�Prn)"r�ryrrr�	itertoolsr�rhr��os.pathr�r�r<rrr�__all__�compiler5r@rNrOr4rGr7rBrD�IrEr	rmrsr
r�r�rnr]�<module>r�s���.�&���
��
���	�,������

�2�:�:�"�#�$�
�b�j�j�*�+�,��b�j�j�(�)�*�
�b�j�j� �!�"���
�
�<�(�)��b�j�j�'�(�)�
��
�
�7�8�9��r�z�z�#-�.�/���
�
�'�(�)�
�b�j�j��"�#�
�B�J�J�|�$�%�
�B�J�J�*�+�,�S*�
�X�� �K�C��(+���	�	��%�!��
�
� ��
�
�����\�*���j�j�"F�G���J�J�!.�"��&�J�J� 5�r�t�t�<��B�H1�f
�`
�`
�DQrn

Filemanager

Name Type Size Permission Actions
__init__.cpython-313.pyc File 1.08 KB 0644
config.cpython-313.pyc File 241 B 0644
cupshelpers.cpython-313.pyc File 35.32 KB 0644
debug.cpython-313.pyc File 1.84 KB 0644
installdriver.cpython-313.pyc File 2.88 KB 0644
openprinting.cpython-313.pyc File 18.44 KB 0644
ppds.cpython-313.pyc File 37.65 KB 0644
smburi.cpython-313.pyc File 3.62 KB 0644
xmldriverprefs.cpython-313.pyc File 22.39 KB 0644
Filemanager