
    Vhi                         d dl mZmZmZ eZd dlmZ d dlm	Z	 d dl
mZ  edd      Z edd      Z ed	d
      Z G d d      Zy)    )absolute_importdivisionprint_function)TEMPLATE_TYPES)generate_api_endpoint)
namedtupleKVPairz	key valueItemzindex detailsSearchQueryzkey kv_pairsc                       e Zd ZddZed        Zd ZddZddZd Z	d Z
d	 Zd
 ZddZd ZddZddZddZddZddZd Zd ZddZddZddZd Zd Zy)MSOTemplateNc                    || _         d| _        dj                  | j                        | _        i | _        d| _        || _        || _        || _        i | _	        i | _
        |rp| j                   j                  | j                  | j                        | _	        | j                  rdj                  | j                  | j                        | _        | j                   j                  | j
                        | _        | j                  j                  d      | _        | j                  j                  d      | _        n| j                   j                  dj                  | j                  | j                   j                  | j                        D cg c]2  }d	j                  |j                  d
      |j                  d            4 c}             nw|r|s| j                   j                  d       | j                   j                  | j                  | j                  t         |   d         | _	        | j                  rdj                  | j                  | j                  j                  d            | _        | j                   j                  | j
                        | _        | j                  j                  d      | _        | j                  j                  d      | _        nc|r7| j                   j                  | j                  t         |   d         | _        n*| j                   j                  | j                        | _        t#        | j                  t$              r$dD ]  }| j                  j'                  |d          y y c c}w )N	templatesz{0}/summaries )
templateIdz{0}/{1}displayNametemplateTypezBProvided template id '{0}' does not exist. Existing templates: {1}zTemplate '{0}' with id '{1}'templateNamer   msgz8Template type must be provided when using template name.template_type)r   r   )r   )_updateVersionversion)msotemplates_pathformatsummaries_pathtemplatetemplate_pathtemplate_nametemplate_idr   template_summarytemplate_objects_cacheget_obj	query_objget	fail_json
query_objsr   
isinstancedictpop)self
mso_moduler   r    r!   r   keys          k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/cisco/mso/plugins/module_utils/template.py__init__zMSOTemplate.__init__   s   )-44T5H5HI*&* "&(#$(HH$4$4T5H5HUYUeUe$4$fD!$$%.%5%5d6I6I4K[K[%\" $ 2 243E3E F%)]]%6%6}%E"%)]]%6%6~%F"""\cc(( -1HH,?,?@S@S,T ( ;AA(,,~B^`h`l`lmy`z{ #   ""'a"b$(HH$4$4##$2D2DSaboSp  rA  TB %5 %D! $$%.%5%5d6I6I4K`K`KdKdeqKr%s" $ 2 243E3E F#'==#4#4\#B %)]]%6%6~%F" HH//0C0CR`anRop  SA/  BDM HH//0C0CDDM dmmT*4 -!!#t,- +1s   7N	c                     d t        fdt        |       D        d      }| D cg c]$  }D ]  }|j                  |j                         & }}}||fS c c}}w )a  
        Get the first matched object from a list of mso object dictionaries.
        :param search_list: Objects to search through -> List.
        :param kv_list: Key/value pairs that should match in the object. -> List[KVPair(Str, Str)]
        :return: The index and details of the object. -> Item (Named Tuple)
                 Values of provided keys of all existing objects. -> List
        c                 ,    t        fd| D              S )Nc              3   n   K   | ],  }j                  |j                        |j                  k(   . y wN)r&   r.   value).0kvitems     r/   	<genexpr>zEMSOTemplate.get_object_from_list.<locals>.kv_match.<locals>.<genexpr>S   s'     C(BHH4Cs   25)all)kvsr8   s    `r/   kv_matchz2MSOTemplate.get_object_from_list.<locals>.kv_matchR   s    CsCDD    c              3   P   K   | ]  \  }} |      st        ||        y wr4   )r
   )r6   indexr8   kv_listr<   s      r/   r9   z3MSOTemplate.get_object_from_list.<locals>.<genexpr>U   s(     mKE4U]^egkUld5$'ms   &&N)next	enumerater&   r.   )search_listr@   matchr8   r7   existingr<   s    `    @r/   get_object_from_listz MSOTemplate.get_object_from_listH   s`    	E m9[;Qmost1<OwODHHRVV$O$OOh Ps   )Ac                 N   | j                   rt        | j                   t              s5| j                  j	                  dj                  | j                               | j                   j                  d      |k7  r,| j                  j	                  dj                  |             yy)zk
        Validate that attributes are set to a value that is not equal None.
        :return: None
        zTemplate '{0}' not found.r   r   zTemplate type must be '{0}'.N)r   r)   r*   r   r'   r   r    r&   )r,   r   s     r/   validate_templatezMSOTemplate.validate_templateY   s|    
 }}Jt}}d$CHH#>#E#EdFXFX#YZ==^,=HH#A#H#H#WX >r=   c                     | j                  ||      \  }}|s@|r>dj                  ||dj                  |            }| j                  j	                  |       |S )a  
        Get the object from a list of mso object dictionaries by name.
        :param object_description: Description of the object to search for -> Str
        :param search_list: Objects to search through -> List.
        :param kv_list: Key/value pairs that should match in the object. -> List[KVPair(Str, Str)]
        :param fail_module: When match is not found fail the ansible module. -> Bool
        :return: The object. -> Dict | None
        z<Provided {0} with '{1}' not matching existing object(s): {2}z, r   )rF   r   joinr   r'   )r,   object_descriptionrC   r@   fail_modulerD   rE   r   s           r/   get_object_by_key_value_pairsz)MSOTemplate.get_object_by_key_value_pairsc   sg     33KIxPWWXjlsuyu~u~  @H  vI  JCHH3'r=   c                 D    t        d|      g}| j                  ||||      S )a  
        Get the object from a list of mso object dictionaries by uuid.
        :param object_description: Description of the object to search for -> Str
        :param search_list: Objects to search through -> List.
        :param uuid: UUID of the object to search for -> Str
        :param fail_module: When match is not found fail the ansible module. -> Bool
        :return: The object. -> Dict | None
        uuid)r	   rM   )r,   rK   rC   rO   rL   r@   s         r/   get_object_by_uuidzMSOTemplate.get_object_by_uuidr   s-     &$'(112DkSZ\ghhr=   c                     | j                   j                  di       j                  di       j                  dg       }t        d|      g}| j                  d||d      }|j                  j                  d      S )	
        Get the UUID of a VLAN pool by name.
        :param vlan_pool_name: Name of the VLAN pool to search for -> Str
        :return: UUID of the VLAN pool. -> Str
        fabricPolicyTemplater   	vlanPoolsname	VLAN PoolTrL   rO   r   r&   r	   rM   details)r,   vlan_pool_nameexisting_vlan_poolsr@   rD   s        r/   get_vlan_pool_uuidzMSOTemplate.get_vlan_pool_uuid~   z     #mm//0FKOOPZ\^_ccdoqst&.1222;@SU\jn2o}}  ((r=   c                     | j                   j                  di       j                  di       j                  dg       }t        d|      g}| j                  d||d      }|j                  j                  d      S )	rR   rS   r   rT   rO   rV   TrW   rU   rX   )r,   vlan_pool_uuidr[   r@   rD   s        r/   get_vlan_pool_namezMSOTemplate.get_vlan_pool_name   r]   r=   c                     |rn|rl|rj| j                  |t        d|      t        d|      g      }|d   r|d   j                  S | j                  j	                  dj                  |||             yi S )a  
        Retrieves the details of a specific route map object based on the provided attributes.
        :param attr_name: The attribute name for error messaging. -> Str
        :param tenant_id: The ID of the tenant. -> Str
        :param tenant_name: The name of the tenant. -> Str
        :param route_map: The name of the route map. -> Str
        :param route_map_objects: The list of route map objects to search from. -> List
        :return: The details of the route map object if found, otherwise an empty dictionary. -> Dict
        rU   tenantIdr   z;Provided Route Map {0}: {1} with the tenant: {2} not found.r   N)rF   r	   rY   r   r'   r   )r,   	attr_name	tenant_idtenant_name	route_maproute_map_objectsroute_map_objects          r/   get_route_mapzMSOTemplate.get_route_map   s     '8#88!	*F:y,IJ   "'*222""'d'k'klu  xA  CN  (O"  PIr=   c                    t        |fi d|dd}| j                  j                  |      }t        d|j	                  d            t        d|j	                  d            t        d|j	                  d            t        d	|      g}| j                  ||      }|d
   r|d
   S | j                  j                  dj                  |j	                  d                   y)aV  
        Get VRF object based on provided parameters.
        :param vrf_dict: Dictionary containing VRF details. -> Dict
        :param tenant_id: Id of the tenant. -> Str
        :param templates_objects_path: Path to the templates objects. -> Str
        :return: VRF object if found, otherwise fail with an error message. -> Dict
        vrftrue)typez	tenant-idzinclude-commonrU   r   r   
schemaNameschemarb   r   zProvided VRF {0} not found.r   N)r   r   r(   r	   r&   rF   r'   r   )r,   vrf_dictrd   templates_objects_pathvrf_pathvrf_objectsvrf_kv_list
vrf_objects           r/   get_vrf_objectzMSOTemplate.get_vrf_object   s     ))?  FE`i  ~D  DE  Fhh))(368<</0>8<<
#;<<h!78:y)	
 ..{KH
a=a= HH#@#G#GU[H\#]^r=   c                     | j                   j                  di       j                  di       j                  dg       }|s|r3| j                  d||rt        d|      g|      S t        d|      g|      S |S )a  
        Get the L3Out Node Routing Policy by UUID or Name.
        :param uuid: UUID of the L3Out Node Routing Policy to search for -> Str
        :param name: Name of the L3Out Node Routing Policy to search for -> Str
        :param fail_module: When match is not found fail the ansible module -> Bool
        :return: Dict | None | List[Dict] | List[]: The processed result which could be:
                 When the UUID | Name is existing in the search list -> Dict
                 When the UUID | Name is not existing in the search list -> None
                 When both UUID and Name are None, and the search list is not empty -> List[Dict]
                 When both UUID and Name are None, and the search list is empty -> List[]
        tenantPolicyTemplater   l3OutNodePolGroupszL3Out Node Routing PolicyrO   rU   r   r&   rM   r	   )r,   rO   rU   rL   "existing_l3out_node_routing_policys        r/   $get_l3out_node_routing_policy_objectz0MSOTemplate.get_l3out_node_routing_policy_object   s     .2]]->->?UWY-Z-^-^_ikm-n-r-r  tH  JL  .M*455+-OjnRXY_aeRf  RJ  LW tz  |B  DH  uI  RJ  LW  21r=   c                     | j                   j                  di       j                  di       j                  dg       }t        d|      g}| j                  d||d      }|j                  j                  d      S )	z
        Get the UUID of an Interface Policy Group by name.
        :param interface_policy_group: Name of the Interface Policy Group to search for -> Str
        :return: UUID of the Interface Policy Group. -> Str
        rS   r   interfacePolicyGroupsrU   zInterface Policy GroupsTrW   rO   rX   )r,   interface_policy_groupexisting_policy_groupsr@   rD   s        r/   get_interface_policy_group_uuidz+MSOTemplate.get_interface_policy_group_uuid   s     "&!2!23I2!N!R!RS]_a!b!f!fg~  AC  "D&"89:223LNdfm{2  A}}  ((r=   c                     | j                   j                  di       j                  di       j                  dg       }|s|r.| j                  d||rt        d|      nt        d|      g|      S |S )a  
        Get the IPSLA Monitoring Policy by UUID or Name.
        :param uuid: UUID of the IPSLA Monitoring Policy to search for -> Str
        :param name: Name of the IPSLA Monitoring Policy to search for -> Str
        :param fail_module: When match is not found fail the ansible module -> Bool
        :return: Dict | None | List[Dict] | List[]: The processed result which could be:
                 When the UUID | Name is existing in the search list -> Dict
                 When the UUID | Name is not existing in the search list -> None
                 When both UUID and Name are None, and the search list is not empty -> List[Dict]
                 When both UUID and Name are None, and the search list is empty -> List[]
        rx   r   ipslaMonitoringPolicieszIPSLA Monitoring PolicyrO   rU   rW   rz   )r,   rO   rU   rL   existing_ipsla_policiess        r/   get_ipsla_monitoring_policyz'MSOTemplate.get_ipsla_monitoring_policy   s     #'--"3"34JB"O"S"ST^`b"c"g"g  iB  DF  #G455)')-%6&$3GH'	 6   '&r=   c                     | j                   j                  di       j                  dg       }|s|r3| j                  d||rt        d|      g|      S t        d|      g|      S |S )a  
        Get the L3Out by uuid or name.
        :param uuid: UUID of the L3Out to search for -> Str
        :param name: Name of the L3Out to search for -> Str
        :param fail_module: When match is not found fail the ansible module -> Bool
        :return: Dict | None | List[Dict] | List[]: The processed result which could be:
                 When the UUID | Name is existing in the search list -> Dict
                 When the UUID | Name is not existing in the search list -> None
                 When both UUID and Name are None, and the search list is not empty -> List[Dict]
                 When both UUID and Name are None, and the search list is empty -> List[]
        l3outTemplatel3outsL3OutrO   rU   rz   )r,   rO   rU   rL   existing_l3outss        r/   get_l3out_objectzMSOTemplate.get_l3out_object   s     --++OR@DDXrR455gimQWX^`dQe  QI  KV  W  Wsy  {A  CG  tH  QI  KV  W  Wr=   c                 l    |j                  dg       }|r| j                  d|t        d|      g|      S |S )a  
        Get the L3Out Node Group Policy by name.
        :param name: Name of the L3Out Node Group Policy to search for -> Str
        :param l3out_object: L3Out object to search Node Group Policy -> Dict
        :param fail_module: When match is not found fail the ansible module -> Bool
        :return: Dict | None | List[Dict] | List[]: The processed result which could be:
                 When the Name is existing in the search list -> Dict
                 When the Name is not existing in the search list -> None
                 When the Name is None, and the search list is not empty -> List[Dict]
                 When the Name is None, and the search list is empty -> List[]
        
nodeGroupszL3Out Node Group PolicyrU   )r&   rM   r	   )r,   rU   l3out_objectrL   existing_l3out_node_groupss        r/   get_l3out_node_groupz MSOTemplate.get_l3out_node_group  s]     &2%5%5lB%G"556OQkntu{  ~B  oC  nD  FQ  R  R))r=   c                     | j                   j                  di       j                  di       j                  dg       }|s|r3| j                  d||rt        d|      g|      S t        d|      g|      S |S )a  
        Get the Fabric Node Settings by uuid or name.
        :param uuid: UUID of the Node Setting to search for -> Str
        :param name: Name of the Node Setting to search for -> Str
        :param fail_module: When match is not found fail the ansible module -> Bool
        :return: Dict | None | List[Dict] | List[]: The processed result which could be:
                 When the UUID | Name is existing in the search list -> Dict
                 When the UUID | Name is not existing in the search list -> None
                 When both UUID and Name are None, and the search list is not empty -> List[Dict]
                 When both UUID and Name are None, and the search list is empty -> List[]
        rS   r   nodePolicyGroupszNode SettingsrO   rU   rz   )r,   rO   rU   rL   existing_objectss        r/   get_node_settings_objectz$MSOTemplate.get_node_settings_object  s      ==,,-CRHLLZY[\``asuwx455oGWrvZ`agimZn  ZR  T_  `  `  }C  DJ  LP  }Q  ZR  T_  `  `r=   c                     | j                   j                  di       j                  di       j                  dg       }|s|r3| j                  d||rt        d|      g|      S t        d|      g|      S |S )a  
        Get the L3Out Interface Routing Policy by UUID or Name.
        :param uuid: UUID of the L3Out Interface Routing Policy to search for -> Str
        :param name: Name of the L3Out Interface Routing Policy to search for -> Str
        :param fail_module: When match is not found fail the ansible module -> Bool
        :return: Dict | None | List[Dict] | List[]: The processed result which could be:
                 When the UUID | Name is existing in the search list -> Dict
                 When the UUID | Name is not existing in the search list -> None
                 When both UUID and Name are None, and the search list is not empty -> List[Dict]
                 When both UUID and Name are None, and the search list is empty -> List[]
        rx   r   l3OutIntfPolGroupszL3Out Interface Routing PolicyrO   rU   rz   )r,   rO   rU   rL   'existing_l3out_interface_routing_policys        r/   )get_l3out_interface_routing_policy_objectz5MSOTemplate.get_l3out_interface_routing_policy_object*  s     37--2C2CDZ\^2_2c2cdnpr2s2w2w  yM  OQ  3R/45507)-%H	  4:&$3GH	  76r=   c                     |j                   j                  di       j                  di       j                  |g       }| j                  ||t        d|      gd      }|j                  j                  d      S )a4  
        Get the UUID of a Tenant Policy by name.
        :param tenant_template: The tenant object -> Dict
        :param policy_name: Name of the policy -> Str
        :param policy_type: The type of the policy specified in the API response -> Str
        :return: UUID of the tenant policy -> Str
        rx   r   rU   TrW   rO   )r   r&   rM   r	   rY   )r,   tenant_templatepolicy_namepolicy_typeexisting_policiesrD   s         r/   get_tenant_policy_uuidz"MSOTemplate.get_tenant_policy_uuid@  s     ,44889OQSTXXYceghllmxz|}22;@QTZ[acnToSp  C2  D}}  ((r=   c                     i | _         y r4   )r#   )r,   s    r/   clear_template_objects_cachez(MSOTemplate.clear_template_objects_cacheL  s
    &(#r=   c                 P    | j                  |||      }|r|j                  d      S y)a1  
        Retrieve the name of a specific object type in the MSO template using its UUID.
        :param mso: An instance of the MSO class, which provides methods for making API requests -> MSO Class instance
        :param object_type: The type of the object to retrieve the name for -> Str
        :param uuid: The UUID of the object to retrieve the name for -> Str
        :return: Str | None: The processed result which could be:
              When the UUID is existing, returns object name -> Str
              When the UUID is not existing -> None
        rU   N)get_template_object_by_uuidr&   )r,   object_typerO   rL   response_objects        r/    get_template_object_name_by_uuidz,MSOTemplate.get_template_object_name_by_uuidO  s1     ::;kZ"&&v.. r=   c                 @   d}|r,|| j                   j                         v r| j                   |   }n;| j                  j                  dj	                  ||      d      }|| j                   |<   |s0|r.dj	                  ||      }| j                  j                  |       |S )a  
        Retrieve a specific object type in the MSO template using its UUID.
        :param object_type: The type of the object to retrieve -> Str
        :param uuid: The UUID of the object to retrieve -> Str
        :param use_cache: Use the cached result of the templates/objects API for the UUID -> Bool
        :return: Dict | None: The processed result which could be:
            When the UUID is existing, returns object -> Dict
            When the UUID is not existing -> None
        Nz#templates/objects?type={0}&uuid={1}GETz*Provided {0} with UUID of '{1}' not found.r   )r#   keysr   requestr   r'   )r,   r   rO   rL   	use_cacher   r   s          r/   r   z'MSOTemplate.get_template_object_by_uuid]  s     !<!<!A!A!CC"99$?O"hh../T/[/[\gim/npuvO0?D''-;>EEkSWXCHH3'r=   c           	      \   |r6| j                   r| j                   |d<   | j                  r| j                  |d<   |rp|j                         D ]Z  }|j                  |j                  d            s%| j	                  |j                  d      |j                  |j                  d            d|      }|j                  d      ||j                  d      <   |j                  d      r#|j                  d      ||j                  d      <   |j                  d      r#|j                  d      ||j                  d      <   |j                  d      r#|j                  d      ||j                  d      <   |j                  d	      s8|j                  d
      ||j                  d	      <   ] |S |S )a  
        Return the updated config_data with the template values and reference_collections if provided
        :param config_data: The original config_data that requires to be updated -> Dict
        :param reference_collections: A dict containing the object type, references and the corresponding names -> Dict
        :param set_template: Adds the templateId and templateName to the config_data -> Bool
        :param use_cache: Use the cached result of the templates/objects API for the ref UUID -> Bool
        :return: Updated config_data with names for references -> Dict
        Example 1:
        reference_collections = {
            "qos": {
                "name": "qosName",
                "reference": "qosRef",
                "type": "qos",
                "template": "qosTemplateName",
                "templateId": "qosTemplateId",
            },
            "interfaceRoutingPolicy": {
                "name": "interfaceRoutingPolicyName",
                "reference": "interfaceRoutingPolicyRef",
                "type": "l3OutIntfPolGroup",
                "template": "interfaceRoutingPolicyTemplateName",
                "templateId": "interfaceRoutingPolicyTemplateId",
            },
        }
        config_data = {
            "qosRef": "unique-qos-id",
            "interfaceRoutingPolicyRef": "unique-interface-id"
        }
        updated_config_data = mso_template_object.set_names_for_references(mso_instance, config_data, reference_collections)
        Expected Output:
        {    "templateName": "template_name",
             "templateId": "unique-template-id",
             "qosRef": "unique-qos-id",
             "interfaceRoutingPolicyRef": "unique-interface-id",
             "qosName": "Resolved QoS Name",
             "qosTemplateName": "Resolved QoS Template Name",
             "qosTemplateId": "Resolved QoS Template ID",
             "interfaceRoutingPolicyName": "Resolved Interface Routing Policy Name",
             "interfaceRoutingPolicyTemplateName": "Resolved Interface Routing Policy Template Name",
             "interfaceRoutingPolicyTemplateId": "Resolved Interface Routing Policy Template ID"
         }
        Example 2:
        reference_collections = {
            "stateLimitRouteMap": {
                "name": "stateLimitRouteMapName",
                "reference": "stateLimitRouteMapRef",
                "type": "mcastRouteMap"
            },
            "reportPolicyRouteMap": {
                "name": "reportPolicyRouteMapName",
                "reference": "reportPolicyRouteMapRef",
                "type": "mcastRouteMap"
            },
            "staticReportRouteMap": {
                "name": "staticReportRouteMapName",
                "reference": "staticReportRouteMapRef",
                "type": "mcastRouteMap"
            },
        }
        config_data = {
            "stateLimitRouteMapRef": "unique-state-limit-id",
            "reportPolicyRouteMapRef": "unique-report-policy-id"
        }
        updated_config_data = mso_template_object.set_names_for_references(mso_instance, config_data, reference_collections)
         Expected Output:
         {   "templateName": "template_name",
             "templateId": "unique-template-id",
             "stateLimitRouteMapRef": "unique-state-limit-id",
             "reportPolicyRouteMapRef": "unique-report-policy-id",
             "stateLimitRouteMapName": "Resolved State Limit Route Map Name",
             "reportPolicyRouteMapName": "Resolved Report Policy Route Map Name"
         }
        r   r   	referencerm   TrU   r   schemaIdro   rn   )r!   r    valuesr&   r   )r,   config_datareference_collectionsset_templater   reference_detailstemplate_objects          r/   *update_config_with_template_and_referencesz6MSOTemplate.update_config_with_template_and_referencesr  s   X ,0,<,<L)!!.2.@.@N+ !%:%A%A%C i!??#4#8#8#EF&*&F&F)--f5{GXG\G\]hGi7jlpr{'O BQATATU[A\K 1 5 5f =>(,,Z8IXI\I\]kIl$5$9$9*$EF(,,\:KZK^K^_kKl$5$9$9,$GH(,,Z8IXI\I\]gIh$5$9$9*$EF(,,X6GVGZGZ[gGh$5$9$9($CDi r=   c                     |rq|j                  d      r_|j                  d      sM|j                  d      s;| j                  j                  dj                  |j                  d                   y y y y y )NrU   r   r!   zHEither 'template' or 'template_id' associated with '{}' must be providedr   )r&   r   r'   r   )r,   	parameters     r/   $check_template_when_name_is_providedz0MSOTemplate.check_template_when_name_is_provided  s}    v.	j8QU^UbUbcpUqHH#m#t#tu~  vC  vC  DJ  vK  $L  M Vr8Q.9r=   c                     | j                   j                  di       j                  di       j                  dg       }t        d|      g}| j                  d||d      }|j                  j                  d      S )	a  
        Get the UUID of an Route Map Policy for Multicast by name.
        :param route_map_policy_for_multicast_name: Name of the Route Map Policy for Multicast to search for -> Str
        :return: UUID of the Route Map Policy for Multicast. -> Str
        rx   r   mcastRouteMapPoliciesrU   zRoute Map Policy for MulticastTrW   rO   rX   )r,   #route_map_policy_for_multicast_nameexisting_route_map_policiesr@   rD   s        r/   'get_route_map_policy_for_multicast_uuidz3MSOTemplate.get_route_map_policy_for_multicast_uuid  s     '+mm&7&78NPR&S&W&WXbdf&g&k&k  mD  FH  'I#&"EFG223SUpry  HL2  M}}  ((r=   )NNN)F)NNF)T)TF)NTF)__name__
__module____qualname__r0   staticmethodrF   rH   rM   rP   r\   r`   ri   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r    r=   r/   r   r      s    2-h   Y
i	)	),_22&	)',"*" "7,
))/*cJM	)r=   r   N)
__future__r   r   r   rm   __metaclass__<ansible_collections.cisco.mso.plugins.module_utils.constantsr   8ansible_collections.cisco.mso.plugins.module_utils.utilsr   collectionsr   r	   r
   r   r   r   r=   r/   <module>r      sL    A @ W Z "	Hk	*&/*7Q) Q)r=   