
    >TfXN                     B   d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlT d dlmZ d dlmZmZ d dlmZ d dlmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* ddl+m,Z, ddl-m.Z.  G d de          Z/ G d de0          Z1 G d de0          Z2 G d de$e#          Z3 G d  d!e$e#          Z4 G d" d#e#          Z5 G d$ d%e$e#          Z6 G d& d'e#          Z7 G d( d)e#          Z8 G d* d+e#          Z9 G d, d-e#          Z: G d. d/e#          Z; G d0 d1e#          Z< G d2 d3e#          Z= G d4 d5e#          Z> G d6 d7e#          Z? G d8 d9e#          Z@ G d: d;e#          ZA G d< d=e#          ZB G d> d?e#          ZC G d@ dAe#          ZD G dB dCe#          ZE G dD dEe#          ZF G dF dGe$e#          ZG G dH dIe#          ZH G dJ dKe#          ZI G dL dMe&eee#          ZJ G dN dOe#          ZK G dP dQe#          ZL G dR dSe1e#          ZM G dT dUe1e#          ZN G dV dWe1e#          ZO G dX dYe1e#          ZP G dZ d[e1e#          ZQ G d\ d]e2e#          ZR G d^ d_e2e#          ZS G d` dae#          ZT G db dce#          ZU G dd dee$e#          ZV G df dge#          ZW G dh die#          ZX G dj dke#          ZY G dl dme#          ZZ G dn doe#          Z[ G dp dqe1e#          Z\ G dr dse          Z]dtS )u    )Http404HttpResponse)get_object_or_404)OpenApiTypes)extend_schemaOpenApiParameter)action)Response)APIRootView)ViewSet)
filtersets)CABLE_TRACE_SVG_DEFAULT_WIDTH)*)CableTraceSVG)ConfigContextQuerySetMixinRenderConfigMixin)!IsAuthenticatedOrLoginNotRequired)ContentTypeMetadata)StripCountAnnotationsPaginator)NetBoxModelViewSetMPTTLockedMixin)SequentialBulkCreatesMixin)get_serializer_for_model)CollateAsChar   )serializers)MissingFilterExceptionc                       e Zd ZdZd ZdS )DCIMRootViewz
    DCIM API root view
    c                     dS )NDCIM selfs    3/var/www/html/netbox-4.1.3/netbox/dcim/api/views.pyget_view_namezDCIMRootView.get_view_name   s    v    N)__name__
__module____qualname____doc__r&   r"   r'   r%   r   r      s-             r'   r   c                   :    e Zd Z edd          d             ZdS )PathEndpointMixinTtracedetailurl_pathc                 F   t          | j        |          }g }|j                            dd          dk    r	 t	          |j                            dt
                              }n# t          t          f$ r
 t
          }Y nw xY wt          ||	                    d          |          }t          |                                                                d	          S |                                D ]\  }}}	|r,t          |d
                   }
 |
|ddd|i          j        }n nk|r#t!          j        |d
         d|i          j        }|	r+t          |	d
                   } ||	ddd|i          j        }	|                    |||	f           t'          |          S )z|
        Trace a complete cable path and return each segment as a three-tuple of (termination, cable, termination).
        pkrenderNsvgwidth/)base_urlr7   image/svg+xmlcontent_typer   Trequest)nestedmanycontextr@   )r   querysetGETgetintr   
ValueError	TypeErrorr   build_absolute_urir   r5   tostringr.   r   datar   TracedCableSerializerappendr
   )r$   r=   r4   objpathr7   drawing	near_endscablefar_endsserializer_aserializer_bs               r%   r.   zPathEndpointMixin.trace&   s   
  "555  ;??8T**e336GKOOG5RSSTT	* 6 6 656#C'2L2LS2Q2QY^___G 0 0 9 9 ; ;/ZZZZ +.))++ 	6 	6&Iuh 7	!EE(L4dU^`gThiiin		  g#9%(YX_L`aaaf m7DD'<DS\^eRfggglKKE845555~~s   -A' 'BBN)r(   r)   r*   r	   r.   r"   r'   r%   r-   r-   $   s=        V4'***" " +*" " "r'   r-   c                   :    e Zd Z edd          d             ZdS )PassThroughPortMixinTpathsr/   c                     t          | j        |          }t          j                            |          }t          j        |d|id          }t          |j                  S )zQ
        Return all CablePaths which traverse a given pass-through port.
        r3   )_nodes__containsr=   T)r@   r?   )	r   rB   	CablePathobjectsfilterr   CablePathSerializerr
   rJ   )r$   r=   r4   rM   
cablepaths
serializers         r%   rW   zPassThroughPortMixin.pathsN   s_    
  "555&--s-CC
 4Z)U\I]dhiii

(((r'   N)r(   r)   r*   r	   rW   r"   r'   r%   rV   rV   L   s=        V4'***) ) +*) ) )r'   rV   c                       e Zd Zej                            ej                                        eddd          Ze	j
        Zej        ZdS )RegionViewSetregion
site_countT
cumulativeN)r(   r)   r*   Regionr[   add_related_countallSiterB   r   RegionSerializerserializer_classr   RegionFilterSetfilterset_classr"   r'   r%   ra   ra   ^   sZ        ~// 0  H #3 0OOOr'   ra   c                       e Zd Zej                            ej                                        eddd          Ze	j
        Zej        ZdS )SiteGroupViewSetgrouprc   Trd   N)r(   r)   r*   	SiteGroupr[   rg   rh   ri   rB   r   SiteGroupSerializerrk   r   SiteGroupFilterSetrm   r"   r'   r%   ro   ro   n   s\         22 3  H #6 3OOOr'   ro   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )SiteViewSetN)r(   r)   r*   ri   r[   rh   rB   r   SiteSerializerrk   r   SiteFilterSetrm   r"   r'   r%   ru   ru   ~   s2        |!!H"1 .OOOr'   ru   c            	           e Zd Zej                            ej                            ej                                        eddd          eddd          Z	e
j        Zej        ZdS )LocationViewSetlocationdevice_countTrd   
rack_countN)r(   r)   r*   Locationr[   rg   rh   DeviceRackrB   r   LocationSerializerrk   r   LocationFilterSetrm   r"   r'   r%   ry   ry      s        11**  "" 	+ 	
 	
 	 2  H #5 2OOOr'   ry   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )RackRoleViewSetN)r(   r)   r*   RackRoler[   rh   rB   r   RackRoleSerializerrk   r   RackRoleFilterSetrm   r"   r'   r%   r   r      3        ##%%H"5 2OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )RackTypeViewSetN)r(   r)   r*   RackTyper[   rh   rB   r   RackTypeSerializerrk   r   RackTypeFilterSetrm   r"   r'   r%   r   r      r   r'   r   c            	           e Zd Zej                                        Zej        Z	e
j        Z eddej        gd ej        d          i           ed          d
d	                        ZdS )RackViewSetdcim_racks_elevation_retrieveF   T)r?   )operation_idfilters
parameters	responsesr0   Nc                    t          | j        |          }t          j        |j                  }|                                st          |j        d          S |j        }|d         dk    rg }|j        	                    d          D ]<}	 |
                    |                    dd                     -# t          $ r Y 9w xY w|                    |d	         |j        |d
         |d         |d         |d         |                    d          |          }t!          |                                d          S |                    |d	         |j        |d         |d                   }	|d         xr"                                fd|	D             }	|                     |	          }
|
3t          j        |
dd|i          }|                     |j                  S dS )zv
        Rack elevation representing the list of rack units. Also supports rendering the elevation as an SVG.
        r3   )rJ   i  r5   r6   	highlight:r   face
unit_widthunit_heightlegend_widthinclude_imagesr8   )r   userr   r   r   r   r9   highlight_paramsr:   r;   excludeexpand_devices)r   r   r   r   qc                     g | ]D}t          |d                    v s)t          |d                                                   v B|ES )idname)strlower).0ur   s     r%   
<listcomp>z)RackViewSet.elevation.<locals>.<listcomp>   sP    fff1Q#ag,,5F5F!sSTU[S\~~OcOcOeOeJeJeQJeJeJer'   NTr=   )r?   r@   )r   rB   r   #RackElevationDetailFilterSerializerrC   is_validr
   errorsvalidated_datagetlistrL   splitrF   get_elevation_svgr   rH   r   rI   get_rack_unitsr   paginate_querysetRackUnitSerializerget_paginated_responserJ   )r$   r=   r4   rackr_   rJ   r   paramrO   	elevationpage
rack_unitsr   s               @r%   r   zRackViewSet.elevation   s    !2666 D'+VVV
""$$ 	4J-s333(>U""! ,,[99  $++EKKQ,?,?@@@@!   D ,,&\\- /!.1#$45 33C88!1 - 	 	G   0 0 2 2QQQQ ++&\\Y#$45	 ,  I I~q gGGIIffff	fff	)))44D(;DtV_ahUijjj
22:?CCC  s   )B77
CC)N)r(   r)   r*   r   r[   rh   rB   r   RackSerializerrk   r   RackFilterSetrm   r   r   r   r	   r   r"   r'   r%   r   r      s        |!!H"1 .O]4CD66DAAAB	   V41D 1D 1D  1D 1D 1Dr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )RackReservationViewSetN)r(   r)   r*   RackReservationr[   rh   rB   r   RackReservationSerializerrk   r   RackReservationFilterSetrm   r"   r'   r%   r   r      s3        &**,,H"< 9OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ManufacturerViewSetN)r(   r)   r*   Manufacturerr[   rh   rB   r   ManufacturerSerializerrk   r   ManufacturerFilterSetrm   r"   r'   r%   r   r      s3        #''))H"9 6OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )DeviceTypeViewSetN)r(   r)   r*   
DeviceTyper[   rh   rB   r   DeviceTypeSerializerrk   r   DeviceTypeFilterSetrm   r"   r'   r%   r   r   
  3        !%%''H"7 4OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ModuleTypeViewSetN)r(   r)   r*   
ModuleTyper[   rh   rB   r   ModuleTypeSerializerrk   r   ModuleTypeFilterSetrm   r"   r'   r%   r   r     r   r'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ConsolePortTemplateViewSetN)r(   r)   r*   ConsolePortTemplater[   rh   rB   r   ConsolePortTemplateSerializerrk   r   ConsolePortTemplateFilterSetrm   r"   r'   r%   r   r     3        "*..00H"@ =OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS ) ConsoleServerPortTemplateViewSetN)r(   r)   r*   ConsoleServerPortTemplater[   rh   rB   r   #ConsoleServerPortTemplateSerializerrk   r   "ConsoleServerPortTemplateFilterSetrm   r"   r'   r%   r   r      s3        (04466H"F COOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )PowerPortTemplateViewSetN)r(   r)   r*   PowerPortTemplater[   rh   rB   r   PowerPortTemplateSerializerrk   r   PowerPortTemplateFilterSetrm   r"   r'   r%   r   r   &  3         (,,..H"> ;OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )PowerOutletTemplateViewSetN)r(   r)   r*   PowerOutletTemplater[   rh   rB   r   PowerOutletTemplateSerializerrk   r   PowerOutletTemplateFilterSetrm   r"   r'   r%   r   r   ,  r   r'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )InterfaceTemplateViewSetN)r(   r)   r*   InterfaceTemplater[   rh   rB   r   InterfaceTemplateSerializerrk   r   InterfaceTemplateFilterSetrm   r"   r'   r%   r   r   2  r   r'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )FrontPortTemplateViewSetN)r(   r)   r*   FrontPortTemplater[   rh   rB   r   FrontPortTemplateSerializerrk   r   FrontPortTemplateFilterSetrm   r"   r'   r%   r   r   8  r   r'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )RearPortTemplateViewSetN)r(   r)   r*   RearPortTemplater[   rh   rB   r   RearPortTemplateSerializerrk   r   RearPortTemplateFilterSetrm   r"   r'   r%   r   r   >  s3        '++--H"= :OOOr'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ModuleBayTemplateViewSetN)r(   r)   r*   ModuleBayTemplater[   rh   rB   r   ModuleBayTemplateSerializerrk   r   ModuleBayTemplateFilterSetrm   r"   r'   r%   r   r   D  r   r'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )DeviceBayTemplateViewSetN)r(   r)   r*   DeviceBayTemplater[   rh   rB   r   DeviceBayTemplateSerializerrk   r   DeviceBayTemplateFilterSetrm   r"   r'   r%   r   r   J  r   r'   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )InventoryItemTemplateViewSetN)r(   r)   r*   InventoryItemTemplater[   rh   rB   r   InventoryItemTemplateSerializerrk   r   InventoryItemTemplateFilterSetrm   r"   r'   r%   r  r  P  s3        $,0022H"B ?OOOr'   r  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )DeviceRoleViewSetN)r(   r)   r*   
DeviceRoler[   rh   rB   r   DeviceRoleSerializerrk   r   DeviceRoleFilterSetrm   r"   r'   r%   r  r  Z  r   r'   r  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )PlatformViewSetN)r(   r)   r*   Platformr[   rh   rB   r   PlatformSerializerrk   r   PlatformFilterSetrm   r"   r'   r%   r  r  d  r   r'   r  c                   Z    e Zd Zej                            d          Zej        Z	e
Zd ZdS )DeviceViewSet
parent_bayc                     |                                  d         }| j        sd|j                            dg           v rt          j        S t          j        S )aI  
        Select the specific serializer based on the request context.

        If the `brief` query param equates to True, return the NestedDeviceSerializer

        If the `exclude` query param includes `config_context` as a value, return the DeviceSerializer

        Else, return the DeviceWithConfigContextSerializer
        r=   config_contextr   )get_serializer_contextbriefquery_paramsrD   r   DeviceSerializer!DeviceWithConfigContextSerializer)r$   r=   s     r%   get_serializer_classz"DeviceViewSet.get_serializer_classz  sU     --//	:: 	0)W-A-E-EiQS-T-TTT//<<r'   N)r(   r)   r*   r~   r[   prefetch_relatedrB   r   DeviceFilterSetrm   r   pagination_classr  r"   r'   r%   r  r  n  sO         ~.. H !0O5= = = = =r'   r  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )VirtualDeviceContextViewSetN)r(   r)   r*   VirtualDeviceContextr[   rh   rB   r   VirtualDeviceContextSerializerrk   r   VirtualDeviceContextFilterSetrm   r"   r'   r%   r  r    s3        #+//11H"A >OOOr'   r  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ModuleViewSetN)r(   r)   r*   Moduler[   rh   rB   r   ModuleSerializerrk   r   ModuleFilterSetrm   r"   r'   r%   r$  r$    s2        ~!!##H"3 0OOOr'   r$  c                   `    e Zd Zej                            dd          Zej        Z	e
j        ZdS )ConsolePortViewSet_pathcable__terminationsN)r(   r)   r*   ConsolePortr[   r  rB   r   ConsolePortSerializerrk   r   ConsolePortFilterSetrm   r"   r'   r%   r)  r)    ?        "33& H #8 5OOOr'   r)  c                   `    e Zd Zej                            dd          Zej        Z	e
j        ZdS )ConsoleServerPortViewSetr*  r+  N)r(   r)   r*   ConsoleServerPortr[   r  rB   r   ConsoleServerPortSerializerrk   r   ConsoleServerPortFilterSetrm   r"   r'   r%   r1  r1    s?         (99& H #> ;OOOr'   r1  c                   `    e Zd Zej                            dd          Zej        Z	e
j        ZdS )PowerPortViewSetr*  r+  N)r(   r)   r*   	PowerPortr[   r  rB   r   PowerPortSerializerrk   r   PowerPortFilterSetrm   r"   r'   r%   r6  r6    ?         11& H #6 3OOOr'   r6  c                   `    e Zd Zej                            dd          Zej        Z	e
j        ZdS )PowerOutletViewSetr*  r+  N)r(   r)   r*   PowerOutletr[   r  rB   r   PowerOutletSerializerrk   r   PowerOutletFilterSetrm   r"   r'   r%   r<  r<    r/  r'   r<  c                   l    e Zd Zej                            ddddd          Zej        Z	e
j        Zd ZdS )InterfaceViewSetr*  r+  l2vpn_terminationsip_addressesfhrp_group_assignmentsc                 n    |                                                      ddt          d                    S )Ndeviceparent_name)get_querysetorder_byr   r#   s    r%   get_bulk_destroy_querysetz*InterfaceViewSet.get_bulk_destroy_queryset  s.      ""++Hhg@V@VWWWr'   N)r(   r)   r*   	Interfacer[   r  rB   r   InterfaceSerializerrk   r   InterfaceFilterSetrm   rK  r"   r'   r%   rA  rA    sb         11& 	 H #6 3OX X X X Xr'   rA  c                   ^    e Zd Zej                            d          Zej        Z	e
j        ZdS )FrontPortViewSetr+  N)r(   r)   r*   	FrontPortr[   r  rB   r   FrontPortSerializerrk   r   FrontPortFilterSetrm   r"   r'   r%   rP  rP    s<         11 H #6 3OOOr'   rP  c                   ^    e Zd Zej                            d          Zej        Z	e
j        ZdS )RearPortViewSetr+  N)r(   r)   r*   RearPortr[   r  rB   r   RearPortSerializerrk   r   RearPortFilterSetrm   r"   r'   r%   rU  rU    s<        00 H #5 2OOOr'   rU  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ModuleBayViewSetN)r(   r)   r*   	ModuleBayr[   rh   rB   r   ModuleBaySerializerrk   r   ModuleBayFilterSetrm   r"   r'   r%   rZ  rZ    3         $$&&H"6 3OOOr'   rZ  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )DeviceBayViewSetN)r(   r)   r*   	DeviceBayr[   rh   rB   r   DeviceBaySerializerrk   r   DeviceBayFilterSetrm   r"   r'   r%   r`  r`    r^  r'   r`  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )InventoryItemViewSetN)r(   r)   r*   InventoryItemr[   rh   rB   r   InventoryItemSerializerrk   r   InventoryItemFilterSetrm   r"   r'   r%   re  re    s3        $((**H": 7OOOr'   re  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )InventoryItemRoleViewSetN)r(   r)   r*   InventoryItemRoler[   rh   rB   r   InventoryItemRoleSerializerrk   r   InventoryItemRoleFilterSetrm   r"   r'   r%   rj  rj    r   r'   rj  c                   ^    e Zd Zej                            d          Zej        Z	e
j        ZdS )CableViewSetterminations__terminationN)r(   r)   r*   Cabler[   r  rB   r   CableSerializerrk   r   CableFilterSetrm   r"   r'   r%   ro  ro    s5        }--.IJJH"2 /OOOr'   ro  c                   `    e Zd ZeZej                                        Ze	j
        Zej        ZdS )CableTerminationViewSetN)r(   r)   r*   r   metadata_classCableTerminationr[   rh   rB   r   CableTerminationSerializerrk   r   CableTerminationFilterSetrm   r"   r'   r%   ru  ru     s8        (N'++--H"= :OOOr'   ru  c                   ^    e Zd Zej                            d          Zej        Z	e
j        ZdS )VirtualChassisViewSetmaster__virtual_chassisN)r(   r)   r*   VirtualChassisr[   r  rB   r   VirtualChassisSerializerrk   r   VirtualChassisFilterSetrm   r"   r'   r%   r{  r{    s<        %66! H #; 8OOOr'   r{  c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )PowerPanelViewSetN)r(   r)   r*   
PowerPanelr[   rh   rB   r   PowerPanelSerializerrk   r   PowerPanelFilterSetrm   r"   r'   r%   r  r    r   r'   r  c                   `    e Zd Zej                            dd          Zej        Z	e
j        ZdS )PowerFeedViewSetr*  r+  N)r(   r)   r*   	PowerFeedr[   r  rB   r   PowerFeedSerializerrk   r   PowerFeedFilterSetrm   r"   r'   r%   r  r  "  r:  r'   r  c                       e Zd ZdZegZ eddddej                  Z	 eddddej                  Z
ej        Zd	 Z ee	e
gd
ej        i          d             ZdS )ConnectedDeviceViewSeta  
    This endpoint allows a user to determine what device (if any) is connected to a given peer device and peer
    interface. This is useful in a situation where a device boots with no configuration, but can detect its neighbors
    via a protocol such as LLDP. Two query parameters must be included in the request:

    * `peer_device`: The name of the peer device
    * `peer_interface`: The name of the peer interface
    peer_devicequeryzThe name of the peer deviceT)r   rz   descriptionrequiredtypepeer_interfacezThe name of the peer interfacec                     dS )NzConnected Device Locatorr"   r#   s    r%   r&   z$ConnectedDeviceViewSet.get_view_nameH  s    ))r'   r   )r   r   c                    |j                             | j        j                  }|j                             | j        j                  }|r|st          d          t          t          j        	                    |j
        d          |          }t          t          j        	                    |j
        d          ||          }|j        }|rt          |d                   t          u rit          t          j        	                    |j
        d          |d         j                  }t          t!          j        |d|i	          j                  S t&          )
Nz@Request must include "peer_device" and "peer_interface" filters.r   view)r   )rF  r   r   r3   r=   rA   )r  rD   _device_paramr   _interface_paramr   r   r~   r[   restrictr   rL  connected_endpointsr  	device_idr
   r   r  rJ   r   )r$   r=   peer_device_namepeer_interface_namer  r  	endpointsrF  s           r%   listzConnectedDeviceViewSet.listK  sV    #/33D4F4KLL%266t7L7QRR 	t': 	t(0rssss (N##GL&99!
 
 
 +&&w|V<<$
 
 

 #6	  	eil++y88&''f==Q<)  F K8)U\I]^^^cddd r'   N)r(   r)   r*   r+   r   permission_classesr   r   STRr  r  r   r  rk   r&   r   r  r"   r'   r%   r  r  .  s          <<$$1  M ('4   #3* * * ]!#3445   	   r'   r  N)^django.httpr   r   django.shortcutsr   drf_spectacular.typesr   drf_spectacular.utilsr   r   rest_framework.decoratorsr	   rest_framework.responser
   rest_framework.routersr   rest_framework.viewsetsr   dcimr   dcim.constantsr   dcim.modelsdcim.svgr   extras.api.mixinsr   r   netbox.api.authenticationr   netbox.api.metadatar   netbox.api.paginationr   netbox.api.viewsetsr   r   netbox.api.viewsets.mixinsr   utilities.apir   utilities.query_functionsr    r   
exceptionsr   r   objectr-   rV   ra   ro   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r$  r)  r1  r6  r<  rA  rP  rU  rZ  r`  re  rj  ro  ru  r{  r  r  r  r"   r'   r%   <module>r     s	   - - - - - - - - . . . . . . . . . . . . A A A A A A A A , , , , , , , , , , , , . . . . . . + + + + + +       8 8 8 8 8 8     " " " " " " K K K K K K K K G G G G G G 3 3 3 3 3 3 @ @ @ @ @ @ C C C C C C C C A A A A A A 2 2 2 2 2 2 3 3 3 3 3 3       . . . . . .    ;   % % % % % % % %P) ) ) ) )6 ) ) )$	1 	1 	1 	1 	1O%7 	1 	1 	1 	4 	4 	4 	4 	4(: 	4 	4 	4 / / / / /$ / / /3 3 3 3 3o'9 3 3 3,3 3 3 3 3( 3 3 33 3 3 3 3( 3 3 3=D =D =D =D =D$ =D =D =DH: : : : :/ : : :7 7 7 7 7, 7 7 75 5 5 5 5* 5 5 55 5 5 5 5* 5 5 5> > > > >!3 > > >D D D D D'9 D D D< < < < <1 < < <> > > > >!3 > > >< < < < <1 < < << < < < <1 < < <; ; ; ; ;0 ; ; ;< < < < <1 < < << < < < <1 < < <@ @ @ @ @?4F @ @ @5 5 5 5 5* 5 5 53 3 3 3 3( 3 3 3= = = = =	= = =:? ? ? ? ?"4 ? ? ?1 1 1 1 1& 1 1 16 6 6 6 6*,> 6 6 6< < < < <02D < < <4 4 4 4 4(*< 4 4 46 6 6 6 6*,> 6 6 6X X X X X(*< X X X4 4 4 4 4+-? 4 4 43 3 3 3 3*,> 3 3 34 4 4 4 4) 4 4 44 4 4 4 4) 4 4 48 8 8 8 8?,> 8 8 8< < < < <1 < < <0 0 0 0 0% 0 0 0; ; ; ; ;0 ; ; ;9 9 9 9 9. 9 9 95 5 5 5 5* 5 5 54 4 4 4 4(*< 4 4 4> > > > >W > > > > >r'   