Ë
    ÛJêjª  ã                  ór  — U d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZmZmZ dd	lmZmZ dd
lmZ g d¢ZdddddœZded<   dZded<   dZded<    eddh«      Zded<    G d„ de«      Z  e	d¬«       G d „ d!«      «       Z! ejD                  d"«      Z#d#ed$<    ejD                  d%«      Z$d#ed&<    ejD                  d'«      Z%d#ed(<    ejD                  d)«      Z&d#ed*<    ejD                  d+«      Z'd#ed,<    ejD                  d-«      Z(d#ed.<    ejD                  d/«      Z)d#ed0<   d°d1„Z*d±d2„Z+ e	d¬«       G d3„ d4«      «       Z, e!d5¬6«      Z- e!d7¬6«      Z. e,d8d9dd:d;d ed<d=h«      d>¬?«       e,d@dAdBdCdDd eh dE£«      e. e!dFdG¬H«      dIœdJ¬K«	       e,dLdMdBdNdOddP eh dQ£«       e!dRdBdS¬T«       e!dRdBdU¬T«       e!dRddV¬T«       e!dW¬6«       e!dFdX¬H«      dYœdZ¬[«
       e,d\d]dBdCdOdd^ ed_d`h«      e- e!dRdadb¬T«       e!dRdBdc¬T«       e!dRdBdd¬T«       e!dRdBdU¬T«       e!dRdBde¬T«       e!dRdBdf¬T«      dgœdh¬[«
       e,didjdBdSdOdd^ eh dk£«       e!dRdBdd¬T«       e!dRdBdU¬T«       e!dRdBdf¬T«       e!dRdadb¬T«       e!dRddV¬T«      dlœdm¬[«
       e,dndodBdpdDddq edrh«      e. e!dRdBdN¬T«       e!dRdBde¬T«      dsœdtdu e!dv¬6«      iidw¬x«       e,dydzdtdpdDdd^ ed{d|h«       e!dRdBdf¬T«       e!dRddV¬T«       e!d}d~¬H«      dœd€¬[«
       e,d�d‚dtdƒdDdd^ eh d„£«       e!dRdBd…¬T«       e!dRdBdV¬T«       e!dRdBdU¬T«       e!dRddV¬T«       e!dRdBd†¬T«       e!dFd‡¬H«       e!dFdˆ¬H«       e!d‰¬6«      dŠœdV ed‹h«      idŒ¬�«       e,dŽd�dVdpdOdd� ed‘h«       e!d’¬6«      e- e!d“ddN¬T«      d”œd•¬–«
       e,d—d˜dVdƒdDd ed™h«      dš¬?«       e,d›dœdVdpdDdd�dž¬Ÿ«      d œZ/d¡ed¢<   d²d£„Z0d³d¤„Z1d³d¥„Z2	 	 	 	 	 	 	 	 	 	 d´d¦„Z3	 	 	 	 	 	 	 	 	 	 dµd§„Z4 e	d¬«       G d¨„ d©«      «       Z5dddddªœ	 	 	 	 	 	 	 	 	 	 	 	 	 d¶d«„Z6d·d¬„Z7d¸d­„Z8	 	 	 	 	 	 	 	 	 	 	 	 d¹d®„Z9dºd¯„Z:y)»u’
  Pentest tool catalog: the boundary that turns a declared intent into an argv.

The model never supplies an argument vector. It declares an *intent*
(``{tool, target, args, level}``) and this module reconstructs the command line
from the catalog, refusing anything the catalog does not already permit. That
inversion is the whole point:

* an allowlist of arguments the tool may carry, checked token by token;
* a forbidden list and a forbidden-prefix list, checked **before** the allowlist,
  so no argument can be both;
* a check on every invocation that the target lies inside the engagement's
  :class:`~cyberbrain26.agents.engagement.TargetScope`;
* a check that the engagement artifact permits this tool at this level.

Fail-closed everywhere. There is no fallback to a raw shell, no "unknown tool
means run it anyway", and no path where a missing catalog, a missing scope or a
missing engagement artifact produces a run instead of a refusal. Every refusal
is written to the audit log.

What the catalog deliberately does not model
--------------------------------------------
* **No NSE scripts** for nmap (``--script``), no ``-e``, no ``-oN``/``-oG``:
  scripts execute code, output files escape the sandbox, and ``-e`` publishes
  the operator's MAC on the wire.
* **No shells anywhere.** sqlmap's ``--os-shell``/``--os-cmd``/``--sql-shell``
  and ``--exec`` are permanently forbidden, at every level, including L3: they
  hand a shell to a remote host rather than testing it.
* **No output-to-file and no redirect options.** Anything that writes outside
  the one writable workspace bind is refused; ``-o``-family options are
  prefixes in the forbidden list for that reason.
* **No redirect following** (curl ``-L``/``--location``, httpx ``-fr``): a
  redirect can leave the authorised target without any further check.
* **No second target.** Every option that can itself carry a target
  (``-u``, ``-h``, ``-iL``, ``-t``, ``-x``, ``-l``â€¦) is in the forbidden list,
  so the only target in the process argument vector is the one that was checked
  against the scope.
* **No credentials on the command line** (hydra ``-p``, curl ``-u user:pw``).
  Password material must come from a file inside the workspace, which keeps it
  out of the audit trail.
* Only unprivileged scan modes are permitted (nmap ``-sT``/``-sn``, not
  ``-sS``/``-sU``): a raw-socket scan needs privileges this system does not
  grant, and asking for it would mean asking for a weaker sandbox.

Argv values are passed to the sandbox as a vector. They are still validated:
a value is only accepted when it matches the narrow rule declared for its
option, because the same token is what a reviewer reads in the audit trail.
é    )ÚannotationsN)ÚMappingÚSequence)Ú	dataclassÚfield)ÚPath)ÚAnyÚFinal)ÚTOOL_CLASS_BY_LEVELÚEngagementAuthorizationÚTargetScope)ÚAuditEventTypeÚAuditLog)ÚSecurityError)ÚACTION_BY_LEVELÚCATALOGÚMAX_ARGUMENTSÚAuthorizedToolCallÚPentestRefusalÚPentestToolÚ	ValueRuleÚaction_for_levelÚauthorize_tool_callÚcatalog_entryÚdescribe_catalogÚtool_class_for_levelÚ	read_fileÚscan_networkÚ	vuln_scanÚexploit_target)r   é   é   é   zFinal[dict[int, str]]r   é   z
Final[int]r   éÈ   ÚMAX_ARGUMENT_LENGTHÚnetworkÚ	workspacezFinal[frozenset[str]]Ú_TARGET_KINDSc                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )r   zÙA tool call was refused by the catalog.

    Attributes:
        reason_code: Stable machine-readable label recorded in the audit log, so
            a refusal can be counted and alerted on without parsing prose.
    c                ó2   •— t         ‰| �  |«       || _        y ©N)ÚsuperÚ__init__Úreason_code)Úselfr/   ÚmessageÚ	__class__s      €úI/home/oem/CyberBrain26-unified/src/cyberbrain26/agents/pentest_catalog.pyr.   zPentestRefusal.__init__i   s   ø€ Ü‰Ñ˜Ô!Ø&ˆÕó    )r/   Ústrr1   r5   ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   Ú__classcell__)r2   s   @r3   r   r   a   s   ø„ ñ÷'ñ 'r4   r   T)Úfrozenc                  óF   — e Zd ZU dZded<   dZded<   dZded	<   dZded
<   y)r   a  The narrow rule one option's value has to satisfy.

    Options are always written in attached form (``-p80``, ``--level3``): a
    separate value word would make "which token is the value" ambiguous, and an
    ambiguous boundary is an argument-injection boundary.

    Attributes:
        kind: Which validator applies (see :func:`_validate_value`).
        choices: Permitted values for the ``enum``/``enum_csv`` kinds.
        minimum: Lower bound for the numeric kinds.
        maximum: Upper bound for the numeric kinds.
    r5   Úkind© útuple[str, ...]Úchoicesr   ÚintÚminimumÚmaximumN)r8   r9   r:   r;   Ú__annotations__rB   rD   rE   r@   r4   r3   r   r   n   s,   … ñð ƒIØ!€Gˆ_Ó!Ø€GˆSÓØ€GˆSÔr4   r   z;^[0-9]{1,5}(-[0-9]{1,5})?(,[0-9]{1,5}(-[0-9]{1,5})?){0,31}$zFinal[re.Pattern[str]]Ú_PORT_SPEC_REz^[A-Za-z0-9._@-]{1,64}$Ú_IDENTIFIER_REz!^[A-Za-z0-9_%=&+.:,/~@ -]{1,200}$Ú_TEXT_REz^[A-Za-z0-9_.\-%{}":, ]{1,120}$Ú_WRITE_OUT_REz^[0-9a-fx]{1,16}$Ú_HEX_FLAGS_REz^[0-9]{1,5}$Ú_INT_REz^[0-9]{1,3}(\.[0-9]{1,2})?$Ú	_FLOAT_REc          	     óR  ‡ — ‰ j                   }|dk(  r4|‰ j                  vr%t        dd|›dt        ‰ j                  «      › �«      ‚y$|dk(  rM|j	                  d«      }|rt        ˆ fd„|D «       «      r%t        dd|›dt        ‰ j                  «      › �«      ‚y$|d	k(  r{t        j                  |«      st        d
d|›d�«      ‚t        |«      }‰ j                  |cxk  r‰ j                  k  s+n t        dd|› d‰ j                  › d‰ j                  › �«      ‚y$|dk(  r{t        j                  |«      st        d
d|›d�«      ‚t        |«      }‰ j                  |cxk  r‰ j                  k  s+n t        dd|› d‰ j                  › d‰ j                  › �«      ‚y$|dk(  rµt        j                  |«      st        d
|›d�«      ‚|j	                  d«      D ]|  }|j	                  d«      }|D ](  }	dt        |	«      cxk  rdk  rŒn t        dd|	› d�«      ‚ t        |«      dk(  sŒPt        |d   «      t        |d   «      kD  sŒnt        d
d|›d�«      ‚ y$|dk(  r%t        j                  |«      st        d
|›d�«      ‚y$|dk(  r%t         j                  |«      st        d
|›d�«      ‚y$|dk(  r%t"        j                  |«      st        d
|›d �«      ‚y$|d!k(  r%t$        j                  |«      st        d
|›d"�«      ‚y$|d#k(  r|€t        d%d&«      ‚t'        ||«      S t        d'd(|›�«      ‚))z‘Return the in-sandbox path for a workspace option, or ``None``.

    Raises:
        PentestRefusal: If the value does not satisfy ``rule``.
    ÚenumÚvalue_not_allowedzvalue z is not one of Úenum_csvú,c              3  ó:   •K  — | ]  }|‰j                   v–— Œ y ­wr,   )rB   )Ú.0ÚpartÚrules     €r3   ú	<genexpr>z"_validate_value.<locals>.<genexpr>›   s   øè ø€ ÒG¸˜D¨¯©Ô4ÑGùs   ƒz" is not a comma-separated list of Ú	int_rangeÚvalue_malformedz is not an integerÚvalue_out_of_rangez  is outside the permitted range ú-Úfloat_rangez is not a numberÚ	port_specz is not a port specificationr   é   zport z is outside 1-65535r"   r!   zport range z is invertedÚ
identifierz is not a plain identifierÚtextz0 contains characters this option does not acceptÚ	write_outz) is not a permitted curl write-out formatÚ	hex_flagsz$ is not a set of hex flag charactersÚworkspace_pathNÚno_workspacez?a workspace is required for this option but none was configuredÚunknown_value_rulezno validator is defined for )r?   rB   r   ÚlistÚsplitÚanyrL   ÚmatchrC   rD   rE   rM   ÚfloatrG   ÚlenrH   rI   rJ   rK   Ú_in_sandbox_path)
rV   Úvaluer(   r?   ÚpartsÚ
int_numberÚfloat_numberrU   ÚboundsÚbounds
   `         r3   Ú_validate_valuers   Œ   s±  ø€ ð �9‰9€DØˆv‚~Ø˜Ÿ™Ñ$Ü Ø#Ø˜˜	 ´°d·l±lÓ1CÐ0DÐEóð ð\ ðU 
�Ò	Ø—‘˜CÓ ˆÙœÓGÀÔGÔGÜ Ø#Ø˜˜	Ð!CÄDÈÏÉÓDVÐCWÐXóð ðN ðG 
�Ò	Ü�}‰}˜UÔ#Ü Ð!2°f¸U¸IÐEWÐ4XÓYÐYô ˜“Zˆ
Ø�|‰|˜zÔ9¨T¯\©\Ô9Ü Ø$Ø˜˜Ð$DØ—<‘<�.  $§,¡, ð1óð ðr ði 
�Ò	Ü�‰˜uÔ%Ü Ð!2°f¸U¸IÐEUÐ4VÓWÐWÜ˜U“|ˆØ�|‰|˜|Ô;¨t¯|©|Ô;Ü Ø$Ø˜˜Ð&FØ—<‘<�.  $§,¡, ð1óð ð^ ðU 
�Ò	Ü×"Ñ" 5Ô)Ü Ð!2°u°iÐ?[Ð4\Ó]Ð]Ø—K‘K Ó$ò 	\ˆDØ—Z‘Z “_ˆFØò �Øœ3˜u›:Ô-¨Õ-Ü(Ø,°°e°WÐ<OÐ.Póð ðô
 �6‹{˜aÓ¤C¨¨q©	£N´S¸À¹³^Ó$CÜ$Ð%6¸+ÀdÀXÈ\Ð8ZÓ[Ð[ð	\ðN ð= 
�Ò	Ü×#Ñ# EÔ*Ü Ø! e YÐ.HÐ#Ióð ð8 ð3 
�ŠÜ�~‰~˜eÔ$Ü Ø! e YÐ.^Ð#_óð ð. ð) 
�Ò	Ü×"Ñ" 5Ô)Ü Ø! e YÐ.WÐ#Xóð ð$ ð 
�Ò	Ü×"Ñ" 5Ô)Ü Ø! e YÐ.RÐ#Sóð ð ð 
Ð!Ò	!ØÐÜ ØØQóð ô    yÓ1Ð1ô Ð1Ð5QÐRVÐQYÐ3ZÓ[Ð[r4   c           	     óÈ  — | st        dd«      ‚| j                  d«      rt        dd| ›d�«      ‚d| v sd| v rt        dd	| ›d
�«      ‚| j                  d«      }t        d„ |D «       «      rt        dd	| ›d�«      ‚t	        |Ž }|j                  «       }||z  j                  «       }||k7  r&|j                  |«      st        dd	| ›d|› d|› �«      ‚d|j                  «       › �S )aÓ  Validate a workspace-relative path and return its in-sandbox form.

    The sandbox bind-mounts the workspace at ``/workspace``, so the path that has
    to appear in the argv is the in-sandbox one. The host path is still resolved
    for the containment check, which is what refuses a symlink that points out
    of the workspace.

    Raises:
        PentestRefusal: If the value is absolute, escapes the workspace, or is
            not a plain relative path.
    Úpath_not_allowedz
empty path)ú/Ú~Úabsolute_path_not_allowedzabsolute path z0 is not allowed; use a path inside the workspaceú\ú zpath z is not a POSIX relative pathrv   c              3  ó$   K  — | ]  }|d v –— Œ
 y­w)>   ú..Ú ú.Nr@   )rT   rU   s     r3   rW   z#_in_sandbox_path.<locals>.<genexpr>ü   s   è ø€ Ò
5 tˆ4�?Ô"Ñ
5ùs   ‚Úpath_escape_not_allowedz( contains an empty or traversing segmentz resolves to z  which is outside the workspace z/workspace/)r   Ú
startswithrg   rh   r   ÚresolveÚis_relative_toÚas_posix)rm   r(   rn   ÚrelativeÚrootÚresolveds         r3   rl   rl   æ   s"  € ñ ÜÐ/°Ó>Ð>Ø×Ñ˜
Ô#ÜØ'Ø˜U˜IÐ%UÐVó
ð 	
ð ˆu�}˜ %™ÜÐ/°5¸¸	ÐA^Ð1_Ó`Ð`Ø�K‰K˜Ó€EÜ
Ñ
5¨uÔ
5Ô5ÜØ%Ø�E�9ÐDÐEó
ð 	
ô �Uˆ|€HØ×ÑÓ€DØ�x‘×(Ñ(Ó*€HØ�4Ò × 7Ñ 7¸Ô =ÜØ%Ø�E�9˜M¨(¨Ð3SÐTXÐSYÐZó
ð 	
ð ˜×*Ñ*Ó,Ð-Ð.Ð.r4   c                  ó  — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   dZded<   dZded<    e«       Z	ded<    e
e¬«      Zded<    e«       Zded<   dZded<    e
e¬«      Zded<    e
e¬«      Zded<   dd„Zy
)r   a·  One catalog entry: what a tool is, and exactly how it may be invoked.

    Attributes:
        name: Catalog key a declared intent refers to.
        binary: Absolute path of the executable inside the sandbox.
        level: The engagement level at which this tool becomes usable.
        timeout_seconds: Wall-clock ceiling for one invocation.
        max_output_bytes: Captured-output ceiling the caller should apply.
        target_kind: ``"network"`` targets are scope-checked against the
            engagement; ``"workspace"`` targets must resolve inside the
            workspace and reach no network at all.
        target_option: Option the target is attached to, or ``None`` to place it
            positionally. The builder emits it; a caller may not.
        trailing_tokens: Literal tokens appended after a positional target.
        fixed_flags: Flags the builder always emits, declared in code.
        flags: Value-less tokens a caller may pass.
        value_options: Option prefix -> value rule, in attached form.
        forbidden: Tokens a caller may never pass.
        forbidden_prefixes: Token prefixes a caller may never start a token with.
            Checked before the allowlist, so the two can never both win.
        level_gated_flags: Level -> extra value-less flags permitted at or above
            that level. This is how one tool serves two levels: ``sqlmap`` is
            restricted at L2 and gains ``--dump`` only at L3.
    r5   ÚnameÚbinaryrC   ÚlevelÚtimeout_secondsÚmax_output_bytesÚtarget_kindNú
str | NoneÚtarget_optionr@   rA   Útrailing_tokensÚfixed_flagszfrozenset[str]Úflags)Údefault_factoryzMapping[str, ValueRule]Úvalue_optionsÚ	forbiddenÚforbidden_prefixeszMapping[int, frozenset[str]]Úlevel_gated_flagsz%Mapping[int, Mapping[str, ValueRule]]Úlevel_gated_optionsc                ó¬  ‡— | j                   t        vr't        | j                  › dt	        t        «      › �«      ‚| j
                  dk  s| j                  dk  rt        | j                  › d�«      ‚d| j                  cxk  rdk  sn t        | j                  › d�«      ‚d| j                  v rt        | j                  › d�«      ‚| j                  | j                  z  rt        | j                  › d�«      ‚t        | j                  «      | j                  z  rt        | j                  › d	�«      ‚t        | j                  «      | j                  z  rt        | j                  › d
�«      ‚| j                  j                  «       D ]¹  \  }}|| j                  z  rt        | j                  › d�«      ‚|| j                  z  rt        | j                  › d�«      ‚|t        | j                  «      z  rt        | j                  › d�«      ‚|| j                  k  sŒ”t        | j                  › d|› d| j                  › �«      ‚ t        | j                  «      t        | j                  «      z  t        | j                  «      z  }| j                   j#                  «       D ]  }|t        |«      z  }Œ t        | j                  «      }||z  }|r#t        | j                  › dt	        |«      › �«      ‚| j                  D ]X  Š‰|v s‰|v rt        | j                  › d‰›d�«      ‚t	        ˆfd„|D «       «      }|sŒ=t        | j                  › d‰›d|› �«      ‚ y)a“  Refuse a catalog entry whose own rules contradict each other.

        An inconsistency here is not cosmetic: a flag that is also a forbidden
        prefix, or an option that a forbidden prefix swallows, means the
        allowlist and the deny list disagree and one of them silently loses. That
        has to be a loud failure at import time, not a surprising permission at
        run time.
        z: target_kind must be one of r   z-: timeout and output ceiling must be positiver#   z: level must be between 0 and 3r}   z1: an empty forbidden prefix would deny everythingz$: flags and forbidden tokens overlapz*: fixed flags and forbidden tokens overlapz&: fixed flags and caller flags overlapz-: level-gated flags overlap the forbidden setz+: level-gated flags overlap the plain flagsz+: level-gated flags overlap the fixed flagsz: level-gated flags at level z- would be available at the tool's base level z*: permitted and forbidden tokens overlap: z: forbidden prefix z is also a permitted tokenc              3  óF   •K  — | ]  }|j                  ‰«      sŒ|–— Œ y ­wr,   )r€   )rT   ÚtokenÚprefixs     €r3   rW   z,PentestTool.__post_init__.<locals>.<genexpr>f  s   øè ø€ ÒW¨¸e×>NÑ>NÈvÕ>VœeÑWùs   ƒ!š!z& would swallow the permitted token(s) N)r�   r)   Ú
ValueErrorrˆ   Úsortedr‹   rŒ   rŠ   r–   r’   r•   Úsetr‘   r—   Úitemsr”   r˜   Úvalues)	r0   Úgated_levelÚgated_flagsÚ	permittedÚgated_optionsÚexactÚoverlapÚshadowedrœ   s	           @r3   Ú__post_init__zPentestTool.__post_init__7  s(  ø€ ð ×Ñ¤=Ñ0Ü §	¡	˜{Ð*GÌÌ}ÓH]ÐG^Ð_Ó`Ð`Ø×Ñ 1Ò$¨×(=Ñ(=ÀÒ(BÜ §	¡	˜{Ð*WÐXÓYÐYØ�D—J‘JÔ# !Ô#Ü §	¡	˜{Ð*IÐJÓKÐKØ�×(Ñ(Ñ(Ü §	¡	˜{Ð*[Ð\Ó]Ð]Ø�:‰:˜Ÿ™Ò&Ü §	¡	˜{Ð*NÐOÓPÐPÜˆt×ÑÓ  4§>¡>Ò1Ü §	¡	˜{Ð*TÐUÓVÐVÜˆt×ÑÓ  4§:¡:Ò-Ü §	¡	˜{Ð*PÐQÓRÐRØ(,×(>Ñ(>×(DÑ(DÓ(Fò 	Ñ$ˆK˜Ø˜TŸ^™^Ò+Ü  D§I¡I ;Ð.[Ð!\Ó]Ð]Ø˜TŸZ™ZÒ'Ü  D§I¡I ;Ð.YÐ!ZÓ[Ð[ØœS ×!1Ñ!1Ó2Ò2Ü  D§I¡I ;Ð.YÐ!ZÓ[Ð[Ø˜dŸj™jÓ(Ü Ø—y‘y�kÐ!>¸{¸mð L:Ø:>¿*¹*¸ðGóð ð	ô ˜×*Ñ*Ó+¬c°$·*±*«oÑ=ÄÀD×DTÑDTÓ@UÑUˆ	Ø!×5Ñ5×<Ñ<Ó>ò 	,ˆMØœ˜]Ó+Ñ+‰Ið	,ä�D—N‘NÓ#ˆØ˜eÑ#ˆÙÜ §	¡	˜{Ð*TÔU[Ð\cÓUdÐTeÐfÓgÐgØ×-Ñ-ò 
	ˆFØ˜‰ &¨IÑ"5Ü Ø—y‘y�kÐ!4°V°JÐ>XÐYóð ô ÓW°ÔWÓWˆHÚÜ Ø—y‘y�kÐ!4°V°Jð ? Ø (˜zð+óð ñ
	r4   )r6   r7   )r8   r9   r:   r;   rF   r�   r�   r‘   Ú	frozensetr’   r   Údictr”   r•   r–   r—   r˜   r©   r@   r4   r3   r   r     s£   … ñð2 ƒIØƒKØƒJØÓØÓØÓØ $€M�:Ó$Ø')€O�_Ó)Ø#%€K�Ó%Ù%›K€Eˆ>Ó'Ù-2À4Ô-H€MÐ*ÓHÙ )£€Iˆ~Ó+Ø*,Ð˜Ó,Ù6;ÈDÔ6QÐÐ3ÓQÙAFÐW[ÔA\ÐÐ>Ó\ô4r4   r   rc   )r?   r]   Úfilez/usr/bin/fileé   r^   ú-bz--brief)z	--compilez--uncompressú-fú-Pz--preserve-dateú-Lz--dereferenceú-w)rˆ   r‰   rŠ   r‹   rŒ   r�   r’   r–   Únmapz/usr/bin/nmapr!   é´   i@B >   ú-nú-vú-Pnú-sTú-sVú-snú--openrO   )Ú0Ú1Ú2Ú3Ú4)r?   rB   )ú-pú-T)z-oNz-oGz-oAz-oXz-oSz-iLz-iRz--excludefilez--iflistz--resumez	--datadirz--scriptz-sSz-sUz-sAz-sNz-sFz-sXz-sMz-sIz-sCú-ez--source-routeú-Sú-Dz-6z
--send-ethz--spoof-macz--traceroutez--packet-trace)	rˆ   r‰   rŠ   r‹   rŒ   r�   r’   r”   r–   Úcurlz/usr/bin/curlé<   i   ú--url>   ú--failú--headú--ipv4ú--silentú--compressedú--show-errorrX   éx   )r?   rD   rE   é   r#   ra   )ÚGETÚHEADÚOPTIONS)z
--max-timez--connect-timeoutz--retryr²   z-X)"ú-oú--outputz-dú--dataú-Fz--formz-Kú--configz--proxyú-xz--upload-filerÂ   z--cookie-jarú-cz--cookiez--tracez	--dump-caz--cacertz--capathz	--resolvez--connect-toz--interfacez--local-portz-Ez--certz--keyr±   z
--locationz--max-redirsz--path-as-isz--protoz--unix-socketrÈ   ú-u)
rˆ   r‰   rŠ   r‹   rŒ   r�   r�   r’   r”   r–   Úffufz/usr/bin/ffufrÛ   z-noninteractivez-seéd   iW  i † é2   i  iè  )r²   z-mcz-fsú-tú-timeoutú-maxtimez-rate)rÔ   z-acz
-recursionú-proxyrÚ   ú-Hr®   ú-configú-requestz-replay-proxyrÙ   ú-frrÃ   rÄ   rÛ   Úhttpxz/usr/bin/httpx>   ú	-no-colorú-ncú-silent)rß   rà   ú-rlz-scú-retries)ú-lr±   rÔ   rÚ   rä   rÃ   rã   r®   râ   ú-http-proxyú-socks5ræ   z-follow-redirectsrå   rÙ   rÛ   Úniktoz/usr/bin/niktoi,  ú-hz-nointeractive)rÁ   rà   rá   r"   z-Tuningrb   )z-Formatú-outputrÔ   rñ   z-hostz-evasionz-Rulesz-dbú-Crä   z-sslz	-NoUpdatez-askz-Plugins)rˆ   r‰   rŠ   r‹   rŒ   r�   r�   r’   r”   r˜   r–   Únucleiz/usr/bin/nucleirê   ré   rQ   )ÚinfoÚlowÚmediumÚhighÚcriticalÚunknown)rë   rì   z	-severity)rß   z
-templatesz-tplr²   z-wizardrÚ   rä   râ   rî   rï   z-payloadrÁ   z	-headlessz-interactshrÔ   rò   z-mez-markdown-exportrí   rÛ   rÙ   Úsqlmapz/usr/bin/sqlmapiX  >   ú--batchú--formsú--disable-coloringé   é
   )ÚmysqlÚ
postgresqlÚsqliteÚmssqlÚoracleÚmariadb)ÚBEUSTQÚBEUÚUSTÚBEÚSr`   )z--levelz--riskz	--timeoutz	--retriesz	--threadsz--dbmsz--techniquerÖ   z--dump)z
--os-shellz--os-cmdz--sql-shellz--shellz--execz--filez--codez--pluginz--sql-queriesz--tmpdbz--dbms-credrÕ   z--request-fileú-rz--flush-sessionz--session-filez--savez--wizardz--crawlz--tamperz--mobilez--interactiveshellrÚ   z--confrØ   rÛ   rÅ   )rˆ   r‰   rŠ   r‹   rŒ   r�   r�   r’   r”   r—   r–   Úhydraz/usr/bin/hydra)Ússhr¯   r_   r\   )rí   r°   rÂ   )rß   rÙ   ró   ú-mz-Wz-Ur±   rÁ   rÃ   ú-Ir×   z-Oz-ArÄ   r®   z-kr²   )
rˆ   r‰   rŠ   r‹   rŒ   r�   r�   r’   r”   r–   Ú	msfpythonz/usr/bin/msfpythonz-q)rÙ   r°   rÁ   rÃ   r  z-ir  Úcustom_scriptz/usr/bin/python3)r  z-B)rÚ   r  rÃ   rÛ   )rˆ   r‰   rŠ   r‹   rŒ   r�   r‘   r–   )r¬   r³   rÆ   rÜ   rç   rð   rô   rû   r  r  r  zFinal[dict[str, PentestTool]]r   c                óð   — t        | t        «      s"t        ddt        | «      j                  › �«      ‚t
        j                  | j                  «       j                  «       «      }|€t        dd| ›d�«      ‚|S )z®Return the catalog entry for ``name``.

    Raises:
        PentestRefusal: If the name is unknown. An unknown tool is never a
            request to run something else.
    Úunknown_toolz tool name must be a string, got útool z is not in the pentest catalog)	Ú
isinstancer5   r   Útyper8   r   ÚgetÚstripÚlower)rˆ   Úentrys     r3   r   r     so   € ô �dœCÔ Ü˜^Ð/OÔPTÐUYÓPZ×PcÑPcÐOdÐ-eÓfÐfÜ�K‰K˜Ÿ
™
›×*Ñ*Ó,Ó-€EØ€}Ü˜^¨u°T°HÐ<ZÐ-[Ó\Ð\Ø€Lr4   c                óT   — t         j                  | «      }|€t        dd| ›d�«      ‚|S )z–Return the security-plane action an invocation at ``level`` performs.

    Raises:
        PentestRefusal: If the level has no registered action.
    Úunknown_levelúengagement level z has no registered action)r   r  r   )rŠ   Úactions     r3   r   r     s6   € ô × Ñ  Ó'€FØ€~Ü˜_Ð0AÀ%ÀÐJcÐ.dÓeÐeØ€Mr4   c                óT   — t        j                  | «      }|€t        dd| ›d�«      ‚|S )z€Return the tool class belonging to ``level``.

    Raises:
        PentestRefusal: If the level is outside the known range.
    r  r  z is not a known level)r   r  r   )rŠ   Ú
tool_classs     r3   r   r     s8   € ô %×(Ñ(¨Ó/€JØÐÜ˜_Ð0AÀ%ÀÐJ_Ð.`ÓaÐaØÐr4   c          
     ór  — || j                   v rt        dd|›d| j                  ›�«      ‚|| j                  v r|S | j                  D ]2  }|j                  |«      sŒt        dd|›d|›d| j                  ›�«      ‚ | j                  j                  «       D ]J  \  }}|j                  |«      sŒt        |«      t        |«      kD  sŒ0t        ||t        |«      d |¬«      c S  | j                  j                  «       D ]  \  }}||k\  sŒ||v sŒ|c S  | j                  j                  «       D ]j  \  }}	||k  rŒ|	j                  «       D ]L  \  }}|j                  |«      sŒt        |«      t        |«      kD  sŒ0t        ||t        |«      d |¬«      c c S  Œl t        dd|›d	| j                  ›d
|› �«      ‚)a  Validate one caller-supplied argument token.

    Order is the security property, not a style choice: an exact forbidden token
    is refused first, then an allowed value-less flag is accepted, then the
    forbidden prefixes are applied, and only then are value options considered.
    Anything unrecognised is refused.

    Returns:
        The token unchanged, or the in-sandbox path when the token is a
        workspace-path option.

    Raises:
        PentestRefusal: If the token is not permitted at ``level``.
    Úforbidden_argumentz	argument z is forbidden for tool z" starts with the forbidden prefix z
 for tool N)r(   Úargument_not_allowedz is not permitted for tool z
 at level )r•   r   rˆ   r’   r–   r€   r”   r    rk   rs   r—   r˜   )
Útoolr›   rŠ   r(   rœ   ÚoptionrV   r¢   r£   r¥   s
             r3   Ú_authorize_tokenr'  (  sæ  € ð* �—‘ÑÜØ  I¨e¨YÐ6MÈdÏiÉiÈ]Ð"[ó
ð 	
ð �—
‘
ÑØˆØ×)Ñ)ò ˆØ×Ñ˜FÕ#Ü Ø$Ø˜E˜9Ð$FÀvÀjð QØ ŸI™I˜=ð*óð ðð ×*Ñ*×0Ñ0Ó2ò T‰ˆ�Ø×Ñ˜FÕ#¬¨E«
´S¸³[Ó(@Ü" 4¨¬s°6«{¨}Ð)=ÈÔSÒSðTð %)×$:Ñ$:×$@Ñ$@Ó$Bò Ñ ˆ�[Ø�KÓ E¨[Ò$8ØŠLðð '+×&>Ñ&>×&DÑ&DÓ&Fò XÑ"ˆ�]Ø�;ÒØØ)×/Ñ/Ó1ò 	X‰LˆF�DØ×Ñ Õ'¬C°«J¼¸V»Ó,DÜ& t¨U´3°v³;°=Ð-AÈYÔWÔWñ	XðXô ØØ
�E�9Ð7¸¿	¹	°}ÀJÈuÈgÐVóð r4   c               óò  — | j                   dk(  rh|€t        dd| j                  ›d�«      ‚t        |t        «      s"t        ddt        |«      j                  › �«      ‚t        |j                  «       |«      S |st        dd| j                  ›d�«      ‚t        |t        «      s"t        ddt        |«      j                  › �«      ‚|j                  «       }|j                  |«      st        d	d
|›d�«      ‚|S )a˜  Return the validated target token to place in the argv.

    ``workspace`` is optional in the type because a network tool never needs
    one; a workspace tool that is handed none is refused rather than resolved
    against an invented root.

    Raises:
        PentestRefusal: If the target is unusable, out of scope, or, for a
            workspace tool, outside the workspace or without a workspace.
    r(   rd   r  ú; operates on a workspace path but no workspace was providedÚtarget_malformedztarget must be a string, got Úno_scopez> addresses the network but the engagement authorises no targetÚtarget_out_of_scopeztarget z. is not inside the authorised engagement scope)
r�   r   rˆ   r  r5   r  r8   rl   r  Úallows)r%  ÚtargetÚscoper(   r`   s        r3   Ú_resolve_targetr0  \  s  € ð" ×Ñ˜;Ò&ØÐÜ ØØ˜Ÿ	™	�}Ð$_Ð`óð ô ˜&¤#Ô&Ü Ð!3Ð7TÔUYÐZ`ÓUa×UjÑUjÐTkÐ5lÓmÐmÜ §¡£°	Ó:Ð:ÙÜØØ�D—I‘I�=Ð ^Ð_ó
ð 	
ô �fœcÔ"ÜÐ/Ð3PÔQUÐV\ÓQ]×QfÑQfÐPgÐ1hÓiÐiØ�<‰<‹>€DØ�<‰<˜Ôô Ø!Ø�d�XÐKÐLó
ð 	
ð €Kr4   c                  ól   — e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<   y)r   uø  A tool invocation the catalog has authorized, ready to be executed.

    This object â€” not the model, and not the caller â€” is what decides what runs.
    ``argv`` is built here; ``argv_text`` is a human-readable rendering of the
    very same vector, used as the approval record's resource so a reviewer reads
    the command that will actually run.

    Attributes:
        tool: Catalog entry that was used.
        target: The validated target, as it appears in ``argv``.
        level: Engagement level the invocation was authorised at.
        action: Security-plane action for that level.
        argv: The reconstructed argument vector.
        argv_text: ``shlex.join`` rendering of ``argv``, for display only.
        timeout_seconds: Wall-clock ceiling for this invocation.
        max_output_bytes: Captured-output ceiling for this invocation.
        engagement_digest: Digest of the engagement the call was authorised
            under, recorded so an audit reader can tie the run to the terms.
    r   r%  r5   r.  rC   rŠ   r  rA   ÚargvÚ	argv_textr‹   rŒ   Úengagement_digestN)r8   r9   r:   r;   rF   r@   r4   r3   r   r   ˆ  s;   … ñð( ÓØƒKØƒJØƒKØ
ÓØƒNØÓØÓØÔr4   r   )r/  r(   Ú	audit_logÚnowc               óà  — 	 t        | ||||¬«      S # t        $ rÒ}|�Êt        | t        «      r| ni }|j	                  t
        j                  ddt        |j                  d«      xs d«      t        j                  t        |«      d«      d|j                  t        |«      t        |j                  d«      «      t        |j                  d	«      «      |�|j                  ndd
œ¬«       ‚ d}~ww xY w)a.  Reconstruct an argv from a declared intent, or refuse.

    Args:
        intent: The declared intent. Only ``tool``, ``target``, ``args`` and
            ``level`` are read; any other key is ignored rather than trusted, so
            a payload cannot smuggle a pre-built command line past the catalog.
        engagement: The signed artifact. ``None`` is a refusal, never a
            default engagement.
        scope: Whitelist to check the target against; defaults to the scope
            derived from ``engagement.targets``.
        workspace: Host path of the writable workspace this call may use.
        audit_log: Log that receives the authorization decision and, for every
            refusal, a record naming the reason.
        now: Override for the engagement's time window, for tests.

    Returns:
        The authorized call. The caller executes ``result.argv`` and nothing else.

    Raises:
        PentestRefusal: For every refusal, with a ``reason_code`` suitable for
            the audit log. Each one is recorded there before it is raised.
    )Ú
engagementr/  r(   r6  NÚ	pentesterÚtask_idr}   Úpentest_toolÚrefusedr%  r.  )Údetailr%  r.  r4  )ÚactorÚagent_idr:  r  ÚresultÚerrorÚmetadata)Ú_authorize_tool_callr   r  r   Úrecordr   ÚPERMISSION_CHECKr5   r  r   Ú_safe_levelr/   Ú
_safe_textÚdigest)Úintentr8  r/  r(   r5  r6  ÚrefusalÚreadables           r3   r   r   ©  sì   € ð>Ü#ØØ!ØØØô
ð 	
øô ò ØÐ ô
 8BÀ&Ì'Ô7R©VÐXZˆHØ×ÑÜ×/Ñ/Ø!Ø$Ü˜HŸL™L¨Ó3Ò9°rÓ:Ü&×*Ñ*¬;°xÓ+@À.ÓQØ Ø×)Ñ)ä! '›lÜ& x§|¡|°FÓ';Ó<Ü(¨¯©°hÓ)?Ó@Ø>HÐ>T¨×):Ò):ÐZ\ñ	ð ô ð 	ûð-ús   ‚ ’	C-›CC(Ã(C-c                ój   — | j                  d«      }t        |t        «      st        |t        «      sy|S )z>Return the declared level as an int, or -1 when it is not one.rŠ   éÿÿÿÿ)r  r  ÚboolrC   )rI  rŠ   s     r3   rF  rF  é  s+   € à�J‰J�wÓ€EÜ�%œÔ¤j°¼Ô&<ØØ€Lr4   c                ó<   — t        | t        «      r| S t        | «      S r,   )r  r5   Úrepr)rm   s    r3   rG  rG  ñ  s   € Ü˜u¤cÔ*ˆ5Ð;´°U³Ð;r4   c               óü  — |€t        dd«      ‚t        | t        «      s"t        ddt        | «      j                  › �«      ‚|j                  |«      st        dd|j                  dd › d	�«      ‚t        | j                  d
«      «      }| j                  d«      }|€|j                  }n1t        |t        «      st        |t        «      st        dd|›�«      ‚|}|dk  s|dkD  rt        dd|›d�«      ‚||j                  k  r)t        dd|j                  ›d|j                  › d|› �«      ‚|j                  |«      sOt        dd|j                  dd › d|j                  › dt        |j                   «      › d|› dt#        |«      › d�«      ‚|�|n|j$                  }|�'t'        |«      j)                  «       j+                  «       nd}	|j,                  dk(  r|	€t        dd|j                  ›d�«      ‚t/        || j                  d«      ||	¬ «      }
| j                  d!«      }|€d"}t        |t0        t2        f«      st        |t4        «      s"t        d#d$t        |«      j                  › �«      ‚t7        |«      t8        kD  rt        d%d&t8        › d'�«      ‚g }|D ]œ  }t        |t0        «      s"t        d(d)t        |«      j                  › �«      ‚|j;                  «       }|st        d(d*«      ‚t7        |«      t<        kD  rt        d+d,t<        › d-�«      ‚t?        ||||	¬.«      }|jA                  |�|n|«       Œž |jB                  g|jD                  ¢|¢}|jF                  �|jI                  |jF                  |
f«       n|jA                  |
«       |jI                  |jJ                  «       tM        ||
|tO        |«      tQ        |«      tS        jT                  |«      |jV                  |jX                  |j                  ¬/«	      S )0zLBuild the authorized call. See :func:`authorize_tool_call` for the contract.NÚno_engagementzMan engagement authorization is required; without one the tool call is refusedÚintent_malformedzintent must be a mapping, got Úengagement_window_closedzengagement é   z& is outside its authorised time windowr%  rŠ   Úlevel_malformedzlevel must be an integer, got r   r#   zlevel z is outside 0-3Útool_above_levelr  z requires level z, the call declared level Úlevel_not_engagedz permits at most level z and tool class z, which does not cover level z (ú)r(   rd   r)  r.  )r/  r(   Úargsr@   Úargs_malformedz0args must be a sequence of argument tokens, got Útoo_many_argumentszat most z arguments are acceptedÚargument_malformedz%every argument must be a string, got zan argument must not be emptyÚargument_too_longzan argument must not exceed z characters)rŠ   r(   )	r%  r.  rŠ   r  r2  r3  r‹   rŒ   r4  )-r   r  r   r  r8   Ú	is_activerH  r   r  Ú	max_levelrN  rC   rŠ   rˆ   Úengages_levelrž   Úallowed_tool_classesr   r/  r   Ú
expanduserr�   r�   r0  r5   Úbytesr   rk   r   r  r&   r'  Úappendr‰   r‘   r�   Úextendr�   r   r   ÚtupleÚshlexÚjoinr‹   rŒ   )rI  r8  r/  r(   r6  r%  Údeclared_levelrŠ   Úresolved_scoperc   Útarget_tokenÚraw_argsÚtokensÚrawr›   Ú	validatedr2  s                    r3   rC  rC  õ  s*  € ð ÐÜØØ[ó
ð 	
ô �fœgÔ&ÜÐ/Ð3QÔRVÐW]ÓR^×RgÑRgÐQhÐ1iÓjÐjØ×Ñ Ô$ÜØ&Ø˜*×+Ñ+¨C¨RÐ0Ð1Ð1WÐXó
ð 	
ô
 ˜Ÿ™ FÓ+Ó,€Dà—Z‘Z Ó(€NØÐØ×$Ñ$‰Ü	�N¤DÔ	)´¸NÌCÔ1PÜÐ.Ð2PÐQ_ÐPbÐ0cÓdÐdàˆØˆq‚y�E˜A’IÜÐ.°&¸¸	ÀÐ0QÓRÐRàˆt�z‰zÒÜØØ�D—I‘I�=Ð 0°·±°Ð<VÐW\ÐV]Ð^ó
ð 	
ð ×#Ñ# EÔ*ÜØØ˜*×+Ñ+¨C¨RÐ0Ð1Ð1HØ×#Ñ#Ð$Ð$4´V¸J×<[Ñ<[Ó5\Ð4]ð ^*Ø*/¨°Ô3GÈÓ3NÐ2OÈqðRó
ð 	
ð $Ð/‘U°Z×5EÑ5E€NØ?HÐ?T”T˜)“_×/Ñ/Ó1×9Ñ9Ô;ÐZ^€NØ×Ñ˜;Ò&¨>Ð+AÜØØ�D—I‘I�=Ð [Ð\ó
ð 	
ô
 # 4¨¯©°HÓ)=À^Ð_mÔn€Là�z‰z˜&Ó!€HØÐØˆÜ�(œS¤%˜LÔ)´¸HÄhÔ1OÜØØ>¼tÀH»~×?VÑ?VÐ>WÐXó
ð 	
ô ˆ8ƒ}”}Ò$ÜØ  H¬]¨OÐ;RÐ"Só
ð 	
ð €FØò EˆÜ˜#œsÔ#Ü Ø$Ø7¼¸S»	×8JÑ8JÐ7KÐLóð ð —	‘	“ˆÙÜ Ð!5Ð7VÓWÐWÜˆu‹:Ô+Ò+Ü Ø#Ø.Ô/BÐ.CÀ;ÐOóð ô % T¨5¸ÈÔXˆ	Ø�‰ 9Ð#8‘i¸eÕDðEð" �K‰KÐ4˜$×*Ñ*Ð4¨VÐ4€DØ×ÑÐ%Ø�‰�T×'Ñ'¨Ð6Õ7à�‰�LÔ!Ø‡K�K�×$Ñ$Ô%äØØØÜ Ó&Ü�4‹[Ü—*‘*˜TÓ"Ø×,Ñ,Ø×.Ñ.Ø$×+Ñ+ô
ð 
r4   c                 óT  — t        t        j                  «       d„ ¬«      D � cg c]ú  } | j                  | j                  t        j                  | j                  d«      | j                  | j                  | j                  | j                  t        | j                  «      t        | j                  «      z   t        | j                  «      z   t        d„ | j                  j                  «       D «       «      t        d„ | j                  j                  «       D «       «      z   dœ	‘Œü c} S c c} w )zPReturn a JSON-compatible view of the catalog, for ``cyberbrain pentest --list``.c                ó2   — | j                   | j                  fS r,   )rŠ   rˆ   )Úitems    r3   ú<lambda>z"describe_catalog.<locals>.<lambda>x  s   € ÀÇ
Á
ÈDÏIÉIÐ?V€ r4   )Úkeyr}   c              3  ó.   K  — | ]  }|D ]  }|–— Œ Œ y ­wr,   r@   )rT   r’   Úflags      r3   rW   z#describe_catalog.<locals>.<genexpr>o  s'   è ø€ ò ,ØÈuò,ØGK”ð,Øñ,ùó   ‚c              3  ó.   K  — | ]  }|D ]  }|–— Œ Œ y ­wr,   r@   )rT   Úoptionsr&  s      r3   rW   z#describe_catalog.<locals>.<genexpr>r  s-   è ø€ ò àØ%òð ô ðØñùrx  )	r%  rŠ   r!  r‰   r�   r‹   rŒ   Úallowed_argumentsÚlevel_gated_arguments)rž   r   r¡   rˆ   rŠ   r   r  r‰   r�   r‹   rŒ   r’   r”   r‘   r—   r˜   )r  s    r3   r   r   a  sþ   € ô. œGŸN™NÓ,Ñ2VÔWö+ð* ð' —J‘JØ—[‘[Ü-×1Ñ1°%·+±+¸rÓBØ—l‘lØ ×,Ñ,Ø$×4Ñ4Ø %× 6Ñ 6Ü!'¨¯©Ó!4Ü�U×(Ñ(Ó)ñ"*ä�U×&Ñ&Ó'ñ"(ô &,ñ ,Ø"'×"9Ñ"9×"@Ñ"@Ó"Bô,ó &ô ñ à$×8Ñ8×?Ñ?ÓAôó ñ&ó	
òð ùò s   £C?D%)rV   r   rm   r5   r(   úPath | Noner6   rŽ   )rm   r5   r(   r   r6   r5   )rˆ   Úobjectr6   r   )rŠ   rC   r6   r5   )
r%  r   r›   r5   rŠ   rC   r(   r}  r6   rŽ   )
r%  r   r.  r~  r/  r   r(   r}  r6   r5   )rI  úMapping[str, object]r8  úEngagementAuthorization | Noner/  úTargetScope | Noner(   ústr | Path | Noner5  zAuditLog | Noner6  úfloat | Noner6   r   )rI  r  r6   rC   )rm   r~  r6   r5   )rI  r  r8  r€  r/  r�  r(   r‚  r6  rƒ  r6   r   )r6   zlist[dict[str, Any]]);r;   Ú
__future__r   Úrerh  Úcollections.abcr   r   Údataclassesr   r   Úpathlibr   Útypingr	   r
   Úcyberbrain26.agents.engagementr   r   r   Ú!cyberbrain26.security_plane.auditr   r   Ú&cyberbrain26.security_plane.permissionr   Ú__all__r   rF   r   r&   rª   r)   r   r   ÚcompilerG   rH   rI   rJ   rK   rL   rM   rs   rl   r   Ú_WORKSPACE_PATHÚ
_PORT_SPECr   r   r   r   r'  r0  r   r   rF  rG  rC  r   r@   r4   r3   ú<module>r‘     s»  ðò.õ` #ã 	Û ß -ß (Ý ß ÷ñ ÷
 GÝ @ò€ð& ØØØñ	*€Ð&ó ð €ˆzÓ Ø"%Ð �ZÓ %á'0°)¸[Ð1IÓ'J€Ð$Ó Jô
'�]ô 
'ñ �$Ô÷ð ó ðð( )3¨¯
©
Ð3qÓ(r€Ð%Ó rØ)3¨¯©Ð4NÓ)O€Ð&Ó OØ#- 2§:¡:Ð.RÓ#S€Ð
 Ó SØ(2¨¯
©
Ð3UÓ(V€Ð%Ó VØ(2¨¯
©
Ð3GÓ(H€Ð%Ó HØ", "§*¡*¨_Ó"=€Ð	Ó =Ø$. B§J¡JÐ/MÓ$N€	Ð!Ó NóWót#/ñL �$Ô÷^ð ^ó ð^ñN Ð!1Ô2€Ù˜KÔ(€
ñ
 ØØØØØØÙ˜˜yÐ)Ó*ð	
ôñ( ØØØØØ"ØÙÒJÓKàÙ Ð1JÔKñ
ð
ô,ñZ ØØØØØ ØØÙÒbÓcá#¨¸aÈÔMÙ!*°ÀQÐPRÔ!SÙ  k¸1ÀaÔHÙ Ô-ñ  Ð1KÔLñ
ð#
ô%6ñn ØØØØØ ØØÙÐ*¨EÐ2Ó3à!Ù +°sÀCÔHÙ +°qÀ'ÔJÙ °aÀÔDÙ! {¸AÀrÔJÙ! {¸AÀtÔLÙ K¸ÀDÔIñ
ð
ô%#ñH ØØØØØ ØØÙÒ7Ó8á °aÀÔDÙ! {¸AÀrÔJÙ +°qÀ$ÔGÙ +°sÀCÔHÙ! {¸AÀqÔIñ
ð
ô!"ñF ØØØØØ"ØØÙÐ)Ð*Ó+àÙ! {¸AÀrÔJÙ! {¸AÀtÔLñ
ð �	™9¨+Ô6Ð7ð
ð
ô'#ñJ ØØ ØØØ"ØØÙ˜ EÐ*Ó+á +°qÀ$ÔGÙ! {¸AÀqÔIÙ"ØØPôñ
ð
ô#*ñV ØØ ØØØ"ØØÙÒDÓEá  k¸1ÀaÔHÙ [¸!ÀQÔGÙ"¨¸QÈÔKÙ"¨¸QÈÔJÙ"¨¸QÈÔKÙØØWôñ %¨&Ð:]Ô^Ù VÔ,ñ
ð ™i¨¨
Ó3Ð4ð
ô15ñn ØØØØØ ØØ Ù˜˜Óá Ô.ð "Ù ¸À2ÔFñ
ð
ô#$ñJ ØØ#ØØØ"ØÙ˜˜Óð Fôñ !ØØ!ØØØ"ØØ Ø3ô	ñ{G*€Ð	&ó GóTó	ó	ð1Ø
ð1àð1ð ð	1ð
 ð1ð ó1ðh)Ø
ð)àð)ð ð	)ð
 ð)ð 	ó)ñX �$Ô÷ð ó ððH !%Ø#'Ø!%Øñ=Ø ð=ð /ð=ð ð	=ð
 !ð=ð ð=ð 
ð=ð ó=ó@ó<ðiØ ðið /ðið ð	ið
 !ðið 
ðið óiôXr4   