
    16iTs                        d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	m
Z
  eded      Zej                  d	d
g      e
d               Zd Zej                  dd
g      e
d               Zej                  d	dg      e	d               Zej                  dd
g      e
d               Zej                  dd
g      e
d               Zej                  ddg      e	d               Zej                  dd
g      e
d               Zej                  ddg      e	d               Zej                  ddg      e	d               Zej                  dd
g      e	d               Zej                  dd
g      e
d                Zej                  d!d
g      e
d"               Zej                  d!dg      e	d#               Zej                  d$d%g      e	d&               Zej                  d'd
g      e
d(               Zy))zI
Inventory Management Routes
Parts and part variants with stock tracking
    N)	Blueprintrequestjsonify)Database)require_adminoptional_auth	inventoryz/api/inventory)
url_prefixz/partsGET)methodsc                     t         j                  j                  d      } t         j                  j                  d      }d}g }| r|dz  }|j                  |        |r|dz  }|j                  |       |dz  }	 t	        j
                  ||r|nd      }t        |      dfS # t        $ r"}t        d	t        |      i      d
fcY d}~S d}~ww xY w)z%Get all parts with optional filteringservice_typecategoryz'SELECT * FROM parts WHERE active = truez AND service_type = %sz AND category = %sz ORDER BY service_type, nameN   error  )	r   argsgetappendr   execute_queryr   	Exceptionstr)r   r   queryparamspartses         H/var/www/html/mobile-medic-2.0/apis/medicore-api/app/routes/inventory.py	get_partsr      s     <<##N3L||
+H5EF))l#%%h	++E/&&ufDIu~s"" /Q()3../s   9&B   	C)C CCc                    | j                  d      }| j                  d      }| j                  d      }| j                  d      }| j                  d      }d}g }|dz  }|r|dz  }|j                  |       |r |d	z  }d
| d
}|j                  ||||g       |r|dz  }|j                  |       |r|dz  }|j                  |       |r&|dk(  r	|dz  }||fS |dk(  r	|dz  }||fS |dk(  r|dz  }||fS )zFReuse the same filters used by the variants listing for review counts.part_idsearchserviceTypegradestockStatus*WHERE pv.active = true AND p.active = truezi AND pv.price_reviewed_by IS NOT NULL AND pv.price_reviewed_by <> '' AND pv.price_reviewed_at IS NOT NULL AND pv.part_id = %s AND (
            pv.sku ILIKE %s OR
            p.name ILIKE %s OR
            p.part_number ILIKE %s OR
            p.description ILIKE %s
        )% AND p.service_type = %s AND pv.grade = %sin_stock5 AND (pv.quantity_on_hand - pv.quantity_reserved) > 0	low_stock~ AND (pv.quantity_on_hand - pv.quantity_reserved) > 0 AND (pv.quantity_on_hand - pv.quantity_reserved) <= pv.reorder_thresholdout_of_stock5 AND (pv.quantity_on_hand - pv.quantity_reserved) = 0)r   r   extend)	r   r    r!   r   r#   stock_statuswhere_conditionsr   search_params	            r   (_build_variant_filter_clause_for_reviewsr5   +   s]   hhy!GXXhF88M*LHHWE88M*LCF   D  D22g  	 6(!}|\<NO66l#00e:% WW V## [(  !a  a V## ^+ WWV##    z/review-statsc                  :   d} d|  d}	 t        j                  |dd      }t        |r|j                  dd      nd|r|j                  d	d      nd|r|j                  d
d      ndd      dfS # t        $ r"}t        dt        |      i      dfcY d}~S d}~ww xY w)zReturn counts of reviewed variants by reviewer (blue, green, purple) across all pages.
    Always returns full counts regardless of filters/search.zWHERE pv.active = true AND p.active = true AND pv.price_reviewed_by IS NOT NULL AND pv.price_reviewed_by <> '' AND pv.price_reviewed_at IS NOT NULLa3  
        SELECT
            COALESCE(SUM(CASE WHEN slug LIKE '%%blue-parrot%%' THEN 1 ELSE 0 END), 0) AS blue,
            COALESCE(SUM(CASE WHEN slug LIKE '%%green-ghost%%' OR slug LIKE '%%green-goblin%%' OR slug LIKE '%%jeksaballa%%' THEN 1 ELSE 0 END), 0) AS green,
            COALESCE(SUM(CASE WHEN slug LIKE '%%purple-dino%%' THEN 1 ELSE 0 END), 0) AS purple
        FROM (
            SELECT lower(regexp_replace(pv.price_reviewed_by, '[\s_]+', '-', 'g')) AS slug
            FROM part_variants pv
            JOIN parts p ON pv.part_id = p.id
            z
        ) reviewer_slugs;
    NT	fetch_onebluer   greenpurple)r:   r;   r<   r   r   r   )r   r   r   r   r   r   )r3   r   resultr   s       r   get_review_statsr>   Z   s     m	  E/''ttD-3FJJvq)/5VZZ+117fjj1-Q
  	 	
  /Q()3../s   A$A/ /	B8BBBPOSTc                     t        j                         } 	 t        j                  d| j	                  d      | j	                  d      | j	                  d      | j	                  d      | j	                  d      | j	                  d      fd	      }t        |      d
fS # t        $ r"}t        dt        |      i      dfcY d}~S d}~ww xY w)zCreate a new partz
            INSERT INTO parts (part_number, name, service_type, category, description, manufacturer_part_number)
            VALUES (%s, %s, %s, %s, %s, %s)
            RETURNING *
        part_numbernamer   r   descriptionmanufacturer_part_numberTr8      r   r   Nr   get_jsonr   r   r   r   r   r   datar=   r   s      r   create_partrJ   {   s     D/'' )
 HH]#HHVHH^$HHZ HH]#HH/0
  v## /Q()3../s   BB 	C$C;CCz/parts/<int:part_id>c                     	 t        j                  d| fd      }|st        ddi      dfS t        |      dfS # t        $ r"}t        dt	        |      i      dfcY d	}~S d	}~ww xY w)
zGet a specific part by IDz3SELECT * FROM parts WHERE id = %s AND active = trueTr8   r   Part not found  r   r   Nr   r   r   r   r   )r    partr   s      r   get_partrP      su    /%%AJ
 G%567<<t}c!! /Q()3../   )9 9 	A$AA$A$z	/variantsc            	         t         j                  j                  d      } t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d	      d
k(  }t        t         j                  j                  dd            }	t         j                  j                  d      xs# t         j                  j                  d      xs d}
	 t        |
      }
|	dz
  |
z  }d}g }g }| r'|dz  }|j                  |        |j                  |        |r5|dz  }d| d}|j                  ||||g       |j                  ||||g       |r'|dz  }|j                  |       |j                  |       |r'|dz  }|j                  |       |j                  |       |r |dk(  r|dz  }n|dk(  r|dz  }n
|dk(  r|dz  }|r/|dz  }|j                  d| d       |j                  d| d       |r|dz  }|d
k(  r|dz  }|d
k(  r|dz  }d| d}	 t        j                  ||r|nd      }|r|d    d!   nd }||
z   dz
  |
z  }|	|k  }d"| d#}|j                  |
|g       t        j                  ||      }t        |||	|
||d$      d%fS # t        $ r d}
Y w xY w# t        $ r"}t        d&t        |      i      d'fcY d}~S d}~ww xY w)(z@Get part variants with inventory levels and device compatibilityr    r-   r+   r!   r"   r#   r$   manufacturerunreviewed_onlytruepage   pageSize	page_size2   r%   r&   r'   r(   r)   r*   r,   r.   r/   r0   a*   AND EXISTS (
            SELECT 1 FROM part_compatibility pc
            JOIN devices d ON pc.device_id = d.id
            JOIN device_families df ON d.family_id = df.id
            JOIN manufacturers m ON df.manufacturer_id = m.id
            WHERE pc.part_id = p.id AND m.name ILIKE %s
        )zC AND (pv.price_reviewed_by IS NULL OR pv.price_reviewed_at IS NULL)zI AND (pv.quantity_on_hand - pv.quantity_reserved) <= pv.reorder_thresholdzi
        SELECT COUNT(*)
        FROM part_variants pv
        JOIN parts p ON pv.part_id = p.id
        z
    Nr   counta  
            WITH part_devices AS (
                SELECT
                    pc.part_id,
                    d.id as device_id,
                    d.model_name,
                    d.model_number,
                    d.release_date,
                    df.id as family_id,
                    df.name as family_name,
                    m.id as manufacturer_id,
                    m.name as manufacturer_name,
                    dt.id as device_type_id,
                    dt.name as device_type_name
                FROM part_compatibility pc
                JOIN devices d ON d.id = pc.device_id
                JOIN device_families df ON df.id = d.family_id
                JOIN manufacturers m ON m.id = df.manufacturer_id
                JOIN device_types dt ON dt.id = df.device_type_id
                WHERE pc.device_id IS NOT NULL
            ),
            part_families_agg AS (
                SELECT
                    part_id,
                    family_id,
                    family_name,
                    manufacturer_id,
                    manufacturer_name,
                    device_type_id,
                    device_type_name,
                    json_agg(
                        json_build_object(
                            'device_id', device_id,
                            'model_name', model_name,
                            'model_number', model_number,
                            'release_date', release_date
                        ) ORDER BY model_name
                    ) as devices
                FROM part_devices
                GROUP BY part_id, family_id, family_name, manufacturer_id, manufacturer_name, device_type_id, device_type_name
            ),
            part_compatibility_json AS (
                SELECT
                    part_id,
                    json_agg(
                        json_build_object(
                            'family_id', family_id,
                            'family_name', family_name,
                            'manufacturer_id', manufacturer_id,
                            'manufacturer_name', manufacturer_name,
                            'device_type_id', device_type_id,
                            'device_type_name', device_type_name,
                            'devices', devices
                        ) ORDER BY manufacturer_name, family_name
                    ) as compatibility
                FROM part_families_agg
                GROUP BY part_id
            )
            SELECT
                pv.id,
                pv.part_id,
                pv.sku,
                pv.color,
                pv.grade,
                pv.cost,
                pv.quantity_on_hand,
                pv.quantity_reserved,
                (pv.quantity_on_hand - pv.quantity_reserved) as quantity_available,
                pv.reorder_threshold,
                pv.reorder_quantity,
                pv.notes,
                pv.supplier_id,
                pv.active,
                pv.created_at,
                pv.updated_at,
                pv.price_reviewed_by,
                pv.price_reviewed_at,
                p.name as part_name,
                p.service_type,
                p.category,
                p.part_number,
                p.description,
                COALESCE(pcj.compatibility, '[]'::json) as compatibility
            FROM part_variants pv
            JOIN parts p ON pv.part_id = p.id
            LEFT JOIN part_compatibility_json pcj ON pcj.part_id = p.id
            zX
            ORDER BY p.name, pv.grade, pv.color
            LIMIT %s OFFSET %s
        )itemstotalrV   rX   	pageCounthasMorer   r   r   )r   r   r   int
ValueErrorr   r1   r   r   r   r   r   )r    r-   r+   r!   r   r#   r2   rS   rT   rV   rY   offsetr3   r   count_paramsr4   count_querycount_resultr]   
page_counthas_morer   variantsr   s                           r   get_variantsri      s    lly)G  -I||
+H\\h'F<<##M2LLLW%E<<##M2L<<##N3Lll&&'89VCO w||*+D  ,S0@0@0MSQSI	N	 Qh)#F DFL22gG$  	 6(!}|\<NO\<|TU66l#L)00eE":% WW[(  !a  a^+ WW  	 	,q)*a~Q/0 aaFgg6SS	 
 	Kt/--k<<]ab,8Q(a i'!+	9
*$Vl  	mYx 	y&)*))%8 !#
   	k  	|  /Q()3../s1   	M 	A8M MM	M?M:4M?:M?c                     t        j                         } 	 t        j                  d| j	                  d      | j	                  d      | j	                  d      | j	                  d      | j	                  d      | j	                  dd      | j	                  d	d      | j	                  d
d      | j	                  d      f	d      }t        |      dfS # t        $ r"}t        dt        |      i      dfcY d}~S d}~ww xY w)zCreate a new part variant (SKU)z
            INSERT INTO part_variants
            (part_id, sku, color, grade, cost, quantity_on_hand, reorder_threshold, reorder_quantity, supplier_id)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
            RETURNING *
        r    skucolorr#   costquantity_on_handr   reorder_thresholdreorder_quantitysupplier_idTr8   rE   r   r   NrF   rH   s      r   create_variantrr   }  s     D/'' ) HHYHHUOHHWHHWHHVHH'+HH(!,HH'+HH]#

 " v## /Q()3../s   B7C 	C9C4.C94C9z/variants/<int:variant_id>c                     	 t        j                  d| fd      }|st        ddi      dfS t        |      dfS # t        $ r"}t        dt	        |      i      dfcY d	}~S d	}~ww xY w)
z!Get a specific part variant by IDak  
            SELECT
                pv.*,
                (pv.quantity_on_hand - pv.quantity_reserved) as quantity_available,
                p.name as part_name,
                p.service_type,
                p.part_number
            FROM part_variants pv
            JOIN parts p ON pv.part_id = p.id
            WHERE pv.id = %s AND pv.active = true
        Tr8   r   Part variant not foundrM   r   r   NrN   )
variant_idvariantr   s      r   get_variantrw     sy    /(( 
* ]d
, G%=>?DDw$$ /Q()3../rQ   PUTc                    t        j                         }	 t        j                  d| fd      }|st	        ddi      dfS |d   }g }g }d|v r%|j                  d	       |j                  |d          d
|v r%|j                  d       |j                  |d
          |rE|j                  |       ddj                  |       d}t        j                  |t        |             g }g }d|v r%|j                  d       |j                  |d          d|v rf|j                  d       |j                  |d          |j                  d       |j                  t         j                         |j                  d       d|v r%|j                  d       |j                  |d          d|v r%|j                  d       |j                  |d          d|v r%|j                  d       |j                  |d          d|v r%|j                  d       |j                  |d          d|v r%|j                  d       |j                  |d          |rH|j                  |        ddj                  |       d }	t        j                  |	t        |      d      }
nd!}	t        j                  |	| fd      }
|
st	        ddi      dfS t	        |
      d"fS # t        $ r"}t	        dt        |      i      d#fcY d$}~S d$}~ww xY w)%z4Update a part variant and optionally its parent partz3SELECT id, part_id FROM part_variants WHERE id = %sTr8   r   rt   rM   r    rC   zdescription = %s	part_namez	name = %sz2
                UPDATE parts
                SET , z+
                WHERE id = %s
            rl   z
color = %srm   z	cost = %szprice_reviewed_by = %sz%price_reviewed_at = CURRENT_TIMESTAMPrn   zquantity_on_hand = %sro   zreorder_threshold = %srp   zreorder_quantity = %snotesz
notes = %sactivezactive = %sz=
                UPDATE part_variants pv
                SET a  
                WHERE pv.id = %s
                RETURNING
                    pv.*,
                    (SELECT name FROM parts WHERE id = pv.part_id) as part_name,
                    (SELECT service_type FROM parts WHERE id = pv.part_id) as service_type,
                    (SELECT category FROM parts WHERE id = pv.part_id) as category,
                    (SELECT part_number FROM parts WHERE id = pv.part_id) as part_number,
                    (SELECT description FROM parts WHERE id = pv.part_id) as description
            ai  
                SELECT
                    pv.*,
                    p.name as part_name,
                    p.service_type,
                    p.category,
                    p.part_number,
                    p.description
                FROM part_variants pv
                JOIN parts p ON p.id = pv.part_id
                WHERE pv.id = %s
            r   r   N)r   rG   r   r   r   r   jointuple
user_emailr   r   )ru   rI   rv   r    part_fieldspart_params
part_queryfieldsr   r   r=   r   s               r   update_variantr     s    Dq/((AM
 G%=>?DD)$ D 12tM23${+tK01 w'YY{+, -J
 "":u[/AB d?MM,'MM$w-(T>MM+&MM$v,' MM23MM',,-MMAB %MM12MM$123$&MM23MM$234%MM12MM$123d?MM,'MM$w-(tMM-(MM$x.) MM*%YYv&' 	(E ++E5=DQFE ++EJ=DQFG%=>?DDv## /Q()3../s*   )K	  I;K	 <K	 		K4K/)K4/K4z!/variants/<int:variant_id>/adjustc                    t        j                         }|j                  d      }|j                  d      }|j                  dd      }|t        ddi      dfS |st        dd	i      dfS g d
}||vr!t        dddj	                  |       i      dfS 	 t        j                  d|| fd      }|st        ddi      dfS t        d|d   |d   ||d      dfS # t        $ r"}t        dt        |      i      dfcY d}~S d}~ww xY w)z/Adjust inventory quantity (add or remove stock)
adjustmentreasonr|    Nr   zAdjustment value required  zReason required)receiveddamagedreturned
correctionusedz Invalid reason. Must be one of: r{   z
            UPDATE part_variants
            SET quantity_on_hand = quantity_on_hand + %s
            WHERE id = %s AND active = true
            RETURNING *, (quantity_on_hand - quantity_reserved) as quantity_available
        Tr8   rt   rM   zInventory adjusted successfullyrn   quantity_available)messagenew_quantityr   r   r   r   r   )	r   rG   r   r   r~   r   r   r   r   )ru   rI   r   r   r|   valid_reasonsr=   r   s           r   adjust_inventoryr   *  sM    D,'JXXhFHHWb!E!<=>CC!234c99MM]"#CDIImD\C]!^_`beee/'' )
 *%7 G%=>?DD
 8"#56"()=">$
   	  /Q()3../s$   *C  C 	D"C?9D?Dz
/low-stockc                      	 t        j                  d      } t        |       dfS # t        $ r"}t        dt	        |      i      dfcY d}~S d}~ww xY w)z-Get all part variants below reorder thresholda#  
            SELECT
                pv.*,
                (pv.quantity_on_hand - pv.quantity_reserved) as quantity_available,
                p.name as part_name,
                p.service_type,
                p.part_number
            FROM part_variants pv
            JOIN parts p ON pv.part_id = p.id
            WHERE pv.active = true
              AND p.active = true
              AND (pv.quantity_on_hand - pv.quantity_reserved) <= pv.reorder_threshold
            ORDER BY (pv.quantity_on_hand - pv.quantity_reserved) ASC, p.name
        r   r   r   NrN   )r-   r   s     r   get_low_stockr   W  sW    /** , 	 y!3&& /Q()3../s   !$ 	AA
A
Az/statsc                      	 t        j                  d      } | rt        |       dkD  rt        | d         dfS t        ddddd      dfS # t        $ r"}t        dt        |      i      dfcY d}~S d}~ww xY w)z"Get inventory statistics dashboarda  
            SELECT
                COUNT(*) as total_skus,
                COALESCE(SUM(pv.cost * pv.quantity_on_hand), 0) as inventory_value,
                SUM(CASE WHEN (pv.quantity_on_hand - pv.quantity_reserved) <= pv.reorder_threshold THEN 1 ELSE 0 END) as low_stock,
                SUM(CASE WHEN (pv.quantity_on_hand - pv.quantity_reserved) = 0 THEN 1 ELSE 0 END) as out_of_stock
            FROM part_variants pv
            JOIN parts p ON pv.part_id = p.id
            WHERE pv.active = true AND p.active = true
        r   r   )
total_skusinventory_valuer-   r/   r   r   N)r   r   lenr   r   r   )statsr   s     r   get_inventory_statsr   o  s    /&& 	( 	 SZ!^58$c))#$ !	 
    /Q()3../s"   4A	 A	 		A4A/)A4/A4z"/parts/<int:part_id>/compatibilityc                     	 t        j                  d| f      }t        |      dfS # t        $ r"}t        dt	        |      i      dfcY d}~S d}~ww xY w)z(Get compatibility assignments for a parta@  
            SELECT
                pc.id as compatibility_id,
                pc.part_id,
                d.id AS device_id,
                d.model_name,
                d.model_number,
                d.release_date,
                df.id AS family_id,
                df.name AS family_name,
                m.id AS manufacturer_id,
                m.name AS manufacturer_name,
                dt.id AS device_type_id,
                dt.name AS device_type_name
            FROM part_compatibility pc
            JOIN devices d ON d.id = pc.device_id
            JOIN device_families df ON df.id = d.family_id
            JOIN manufacturers m ON m.id = df.manufacturer_id
            JOIN device_types dt ON dt.id = df.device_type_id
            WHERE pc.part_id = %s
            ORDER BY m.name, df.name, d.model_name
        r   r   r   NrN   )r    compatibilityr   s      r   get_part_compatibilityr     s^    / .. 0* Z+. }%s** /Q()3../s   #& 	AAAAc                    t        j                         }|j                  d      }|st        ddi      dfS 	 t	        j
                  d| fd      }|st        ddi      d	fS t	        j
                  d
|fd      }|st        ddi      d	fS t	        j
                  d| |fd      }|rt        ddi      dfS t	        j
                  d| |fd      }t        |      dfS # t        $ r"}t        dt        |      i      dfcY d}~S d}~ww xY w)z"Assign a part to a specific device	device_idr   device_id is requiredr   z4SELECT id FROM parts WHERE id = %s AND active = trueTr8   rL   rM   z6SELECT id FROM devices WHERE id = %s AND active = truezDevice not foundzGSELECT id FROM part_compatibility WHERE part_id = %s AND device_id = %sr   zCompatibility already existsr   z
            INSERT INTO part_compatibility (part_id, device_id)
            VALUES (%s, %s)
            RETURNING id, part_id, device_id
            rE   r   N)r   rG   r   r   r   r   r   r   )r    rI   r   rO   deviceexistingr=   r   s           r   add_part_compatibilityr     s?    D%I!89:C??%/%%BJ

 G%567<<''DL

 G%7893>>))Ui 

 I'EFGLL''
 i 
 v## /Q()3../s/   )C ")C *C 7&C 	D	'D>D	D	z%/compatibility/<int:compatibility_id>DELETEc                     	 t        j                  d| fd      }|st        ddi      dfS t        j                  d| f       t        dd	i      d
fS # t        $ r"}t        dt	        |      i      dfcY d}~S d}~ww xY w)z!Delete a compatibility assignmentz/SELECT id FROM part_compatibility WHERE id = %sTr8   r   z"Compatibility assignment not foundrM   z,DELETE FROM part_compatibility WHERE id = %sr   z"Compatibility deleted successfullyr   r   NrN   )compatibility_idr   r   s      r   delete_compatibilityr     s    /))=
 G%IJKSPP 	:	

 	#GHI3NN /Q()3../s"   )A %A 	A=A82A=8A=z/parts/recommendedc                     	 t         j                  j                  dt              } t         j                  j                  d      }| st	        ddi      dfS |st	        ddi      dfS t        j                  d| d	| d	f      }|r|D cg c]  }t        |       c}ng }t	        |      d
fS c c}w # t        $ rC}t        j                  dt        |              t	        dt        |      i      dfcY d}~S d}~ww xY w)z
    Get recommended parts for a device and service combination

    Query parameters:
    - device_id: Device ID
    - service_name: Service name (e.g., "Screen Repair")
    r   )typeservice_namer   r   r   zservice_name is requireda  
            SELECT DISTINCT
                pv.id,
                pv.sku,
                p.name as part_name,
                pv.quantity_on_hand as stock_level,
                pv.cost as price
            FROM part_variants pv
            JOIN parts p ON pv.part_id = p.id
            JOIN service_offer_parts sop ON pv.id = sop.part_variant_id
            JOIN service_offers so ON sop.service_offer_id = so.id
            JOIN service_variants sv ON so.service_variant_id = sv.id
            JOIN service_catalog sc ON sv.service_id = sc.id
            WHERE so.device_id = %s
            AND LOWER(sc.name) LIKE LOWER(%s)
            AND so.active = true
            ORDER BY p.name
        r(   r   z"Error fetching recommended parts: r   N)r   r   r   r`   r   r   r   dictr   loggingr   r   )r   r   r   rO   r=   r   s         r   get_recommended_partsr     s   %/LL$$[s$;	||''7G%<=>CCG%?@A3FF && (" 1\N!,-#/& 49/$t*/bv## 0  /:3q6(CDQ()3../s<   AB3 B3 ("B3 
B.B3 .B3 3	C?<8C:4C?:C?)__doc__r   flaskr   r   r   app.models.databaser   app.middleware.auth_localr   r   __name__inventory_bprouter   r5   r>   rJ   rP   ri   rr   rw   r   r   r   r   r   r   r   r    r6   r   <module>r      s    - - ( Bh;KL Hug./  //2,$^ OeW5/  6/> Hvh//  0/, *UG</  =/( K%1P/  2P/d K&2/  3/4 05'B/  C/, 05'Bu/  Cu/n 7&J)/  K)/V L5'2/  3/, Hug./  //> 85'J/  K/> 86(K-/  L-/^ ;hZP/  Q/0 (5':-/  ;-/r6   