From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id qIW3H9/qSGHQYwEAgWs5BA (envelope-from ) for ; Mon, 20 Sep 2021 22:11:11 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id kDVgG9/qSGETIQAA1q6Kng (envelope-from ) for ; Mon, 20 Sep 2021 20:11:11 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id F03F0F121 for ; Mon, 20 Sep 2021 22:11:10 +0200 (CEST) Received: from localhost ([::1]:49396 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSPd7-0000u0-Vx for larch@yhetil.org; Mon, 20 Sep 2021 16:11:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48974) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSPcw-0000tc-P3 for guix-devel@gnu.org; Mon, 20 Sep 2021 16:10:58 -0400 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]:37678) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mSPcu-0001aY-Hs for guix-devel@gnu.org; Mon, 20 Sep 2021 16:10:58 -0400 Received: by mail-ed1-x529.google.com with SMTP id bx4so21341889edb.4 for ; Mon, 20 Sep 2021 13:10:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=WZseupCDnaeMEl4NkzvqN5xVpE3Vf1rfFBs0S1Rzqz4=; b=aHckWqf0F3ZqKxzChiMUJWF/u534isY5Hste0d8jIB4E0SE7zNntGqa02BPOfo5Hcw GXs0o+binaTa4FeFOabWrEt6JNsXVeF/eAHYPg+dMQzZ/XyvbkJ4pM2uKdT1fWKRs944 nK1VIYGWOMuTMiJEXnB9TPsiWEgFXg1rzOUbHq8oSGR02ZjiGMOfruocLCtCCNX7Wpoq OXXE9Un4BVH3dXf/kapJ5DF9tnq7xWJ7hPelaUdC2VwduLp4NNZKu1k7J6/SdT9qFWZz XrhPwi2vItnnH8P9NYxKqPFosMejOX6umNF4rSdr2wo+u/I2JQwfpgAwSOG3GlJhZsa0 WN7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=WZseupCDnaeMEl4NkzvqN5xVpE3Vf1rfFBs0S1Rzqz4=; b=2RIQnJWgV8Ix2JiXDuFCaZjK7GtgTBVP3BIbbUqKhJYZfeN3Rl8/wozE0H+aodp5CB WNnJVnmr2onZ55/CbfSGPPQvq4PSpIa+AH4nnKtbddoAujM1uB4qshmxiHcSdOO/DUgA bS89QxuAC9IrvGHNN/lWHqPFMbevNE8vKZEQRqhENxXTqzqPwdPDGxfP0i6ByTBkWaQm J34bXabaH+0ftQzUdgTcDO9iAmxnNjNg4HxM6Lo2w/ujnnqirrKV4cei+pvLgjAUqlRr +70CwFh28P2zwt9gUgg/NFXMcNXgAdZczOAf3jAkiRO7lvGMGvLAIDQddy2NotIiJ+iW DSRA== X-Gm-Message-State: AOAM5301W8lX2wQNOpCPfms40qV/8FqHyN8cZXBLuc1pv1Ibvf2gzm+9 FD8gOK6uEF7X9dHo26Pr+aAgSCsC36B+flQMNnW9ZIhZipiYmQ== X-Google-Smtp-Source: ABdhPJxK2XS2g+usPifw8lomEr2tzxYu1BF14ns2AXBTiYVLzDIeax1oAwANmC0j0IVC1JaifdiShrkwi0BxapU7nCI= X-Received: by 2002:a17:906:2c10:: with SMTP id e16mr29548974ejh.182.1632168654080; Mon, 20 Sep 2021 13:10:54 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Antwane Mason Date: Mon, 20 Sep 2021 16:10:42 -0400 Message-ID: Subject: Re: Python Site Package Syntax Runtime Error To: guix-devel@gnu.org Content-Type: multipart/alternative; boundary="000000000000d70f3805cc72e001" Received-SPF: pass client-ip=2a00:1450:4864:20::529; envelope-from=ad.mason1413@gmail.com; helo=mail-ed1-x529.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: "Guix-devel" X-Migadu-Flow: FLOW_IN ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1632168671; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=WZseupCDnaeMEl4NkzvqN5xVpE3Vf1rfFBs0S1Rzqz4=; b=ScRwjfd/xAo5X3Ia5SfDMWRhG+uz4CMVpVfqJL2c8IVtmtTQZMX7C8APi/jevoXuXbTAz4 O7yI8S7RBH2KM8SJ4JRXDjXTVmTO2YMiuGOKphq5JNFSNtS6C/4Vllyuke5SjUOLMZBn9w DFAuNWRzRol6twqqBI2eZlw3knpqESj6yY1df6uXC1+DZu6Yu9p8hjfL3P2uv76/R0D0+J +soBVez2q8NJmnDNbiwQbsgyBlwLg6B/zVH7EDOOdoOd/RoNC+PlRceKz37veAv7e/nFty l11UAJLU2CusfJb5nx0MCEAJ7ZFpR0GhCNQtRbz7P4r1hUw/K500Bz/KR7WuCA== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1632168671; a=rsa-sha256; cv=none; b=dMN1TUk5aNfYJ/06+qBbYBOHtmCK3tdeFgI3ZJg0OEDiOKtk9TLsSgT2g2NcRdbsB/BdUr yga2vCEePk0q03koew/wyCBpiaYcKsmScd48l4Ewinx0fZYt9VNg/ycGfoZ9+W3u+hDmtW MPT/Fw8g0pU1eaqvGg+GVPkPkVZGXSk5bTTTXbD4Ptd1aF85ebrhAOLCTWjYF8vi8s08ix yPDMcE+TQ9HaqkpEoLSqZnWrw9gCYDGpEwEKhOsPl31M+vyo2QBYw4Vo5l3sW/LyJV4OEN SEimJp1xe6uDg5TZQ/BGfaZ7+g34L4bFbMVWfbRuaUSU8/APrnQZ6WhGOz4tGw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=aHckWqf0; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (aspmx1.migadu.com: domain of guix-devel-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-devel-bounces@gnu.org X-Migadu-Spam-Score: -2.99 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=aHckWqf0; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (aspmx1.migadu.com: domain of guix-devel-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-devel-bounces@gnu.org X-Migadu-Queue-Id: F03F0F121 X-Spam-Score: -2.99 X-Migadu-Scanner: scn0.migadu.com X-TUID: loxSTuXoYSC9 --000000000000d70f3805cc72e001 Content-Type: text/plain; charset="UTF-8" On Sun, Sep 19, 2021 at 1:59 PM Maxime Devos wrote: > Anyway, to prevent onlykey_agent.py from being wrapped, you can replace > the 'wrap' phase with a custom 'wrap' phase adjusted for onlykey-agent > pecularities: > > (package > (name "python-onlykey-agent") > ... > (arguments > `(#:phases > (modify-phases %standard-phases > (replace 'wrap > (lambda* (#:key outputs #:allow-other-keys) > (define bin (string-append (assoc-ref outputs "out") "/bin") > ;; Replace ??? with something appropriate for onlykey-agent > (wrap-program (string-append bin "/onlykey-agent) > `("PYTHONPATH" '??? '???)) > 'maybe-wrap-other-things > '???)))))) > > Maxime, thank you for the suggestion! I ended up with the following which worked somewhat better but was running into runtime issues. Wanted to post my code snippet here in case this is helpful to someone else. This is a slight modification of code for wrap phase from guix/build/python-build-system.scm. --8<---------------cut here---------------start------------->8--- (arguments '(#:phases (modify-phases %standard-phases ;; prevents runtime error where shell wrapper for onlykey_agent.py is loaded as module (replace 'wrap (lambda* (#:key inputs outputs #:allow-other-keys) (define (list-of-files dir) (find-files dir (lambda (file stat) (and (eq? 'regular (stat:type stat)) (not (wrapper? file)) (not ((file-name-predicate "onlykey_agent.py") file stat)))))) (define bindirs (let ((out (assoc-ref outputs "out"))) (list (string-append out "/bin") (string-append out "/sbin")))) (let* ((out (assoc-ref outputs "out")) (python (assoc-ref inputs "python")) (var `("PYTHONPATH" prefix ,(cons (string-append out "/lib/python" (python-version python) "/site-packages") (search-path-as-string->list (or (getenv "PYTHONPATH") "")))))) (for-each (lambda (dir) (let ((files (list-of-files dir))) (for-each (lambda (file) (wrap-program file var)) files))) bindirs) #t)))))) --8<---------------cut here---------------end--------------->8--- Regards, Antwane On Mon, Sep 20, 2021 at 4:09 PM Antwane Mason wrote: > > On Sun, Sep 19, 2021 at 1:59 PM Maxime Devos > wrote: > >> Anyway, to prevent onlykey_agent.py from being wrapped, you can replace >> the 'wrap' phase with a custom 'wrap' phase adjusted for onlykey-agent >> pecularities: >> >> (package >> (name "python-onlykey-agent") >> ... >> (arguments >> `(#:phases >> (modify-phases %standard-phases >> (replace 'wrap >> (lambda* (#:key outputs #:allow-other-keys) >> (define bin (string-append (assoc-ref outputs "out") "/bin") >> ;; Replace ??? with something appropriate for onlykey-agent >> (wrap-program (string-append bin "/onlykey-agent) >> `("PYTHONPATH" '??? '???)) >> 'maybe-wrap-other-things >> '???)))))) >> >> > Thank you for the suggestion! I ended up with the following which worked > somewhat better but was running into runtime issues. Wanted to post my code > snippet here in case this is helpful to someone else. > This is a slight modification of code for wrap phase from > guix/build/python-build-system.scm. > > --8<---------------cut here---------------start------------->8--- > (arguments > '(#:phases > (modify-phases %standard-phases > ;; prevents runtime error where shell wrapper for > onlykey_agent.py is loaded as module > (replace 'wrap > (lambda* (#:key inputs outputs #:allow-other-keys) > (define (list-of-files dir) > (find-files dir (lambda (file stat) > (and (eq? 'regular (stat:type stat)) > (not (wrapper? file)) > (not ((file-name-predicate > "onlykey_agent.py") > file > stat)))))) > > (define bindirs > (let ((out (assoc-ref outputs "out"))) > (list (string-append out "/bin") > (string-append out "/sbin")))) > > (let* ((out (assoc-ref outputs "out")) > (python (assoc-ref inputs "python")) > (var `("PYTHONPATH" prefix > ,(cons (string-append out "/lib/python" > (python-version python) > "/site-packages") > (search-path-as-string->list > (or (getenv "PYTHONPATH") "")))))) > (for-each (lambda (dir) > (let ((files (list-of-files dir))) > (for-each (lambda (file) (wrap-program file > var)) > files))) > bindirs) > #t)))))) > --8<---------------cut here---------------end--------------->8--- > --000000000000d70f3805cc72e001 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxzcGFuIGNsYXNzPSJnbWFp bC1pbSI+PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9uIFN1biwgU2VwIDE5LCAy MDIxIGF0IDE6NTkgUE0gTWF4aW1lIERldm9zICZsdDs8YSBocmVmPSJtYWlsdG86bWF4aW1lZGV2 b3NAdGVsZW5ldC5iZSIgdGFyZ2V0PSJfYmxhbmsiPm1heGltZWRldm9zQHRlbGVuZXQuYmU8L2E+ Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHls ZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0 LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPkFueXdheSwgdG8gcHJldmVudCBvbmx5a2V5X2Fn ZW50LnB5IGZyb20gYmVpbmcgd3JhcHBlZCwgeW91IGNhbiByZXBsYWNlPGJyPg0KdGhlICYjMzk7 d3JhcCYjMzk7IHBoYXNlIHdpdGggYSBjdXN0b20gJiMzOTt3cmFwJiMzOTsgcGhhc2UgYWRqdXN0 ZWQgZm9yIG9ubHlrZXktYWdlbnQgcGVjdWxhcml0aWVzOjxicj4NCjxicj4NCihwYWNrYWdlPGJy Pg0KwqAgKG5hbWUgJnF1b3Q7cHl0aG9uLW9ubHlrZXktYWdlbnQmcXVvdDspPGJyPg0KwqAgLi4u PGJyPg0KwqAgKGFyZ3VtZW50czxicj4NCsKgIMKgIGAoIzpwaGFzZXM8YnI+DQrCoCDCoCDCoCAo bW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzPGJyPg0KwqAgwqAgwqAgwqAgKHJlcGxhY2Ug JiMzOTt3cmFwPGJyPg0KwqAgwqAgwqAgwqAgwqAgKGxhbWJkYSogKCM6a2V5IG91dHB1dHMgIzph bGxvdy1vdGhlci1rZXlzKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIChkZWZpbmUgYmluIChzdHJp bmctYXBwZW5kIChhc3NvYy1yZWYgb3V0cHV0cyAmcXVvdDtvdXQmcXVvdDspICZxdW90Oy9iaW4m cXVvdDspPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgOzsgUmVwbGFjZSA/Pz8gd2l0aCBzb21ldGhp bmcgYXBwcm9wcmlhdGUgZm9yIG9ubHlrZXktYWdlbnQgPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg KHdyYXAtcHJvZ3JhbSAoc3RyaW5nLWFwcGVuZCBiaW4gJnF1b3Q7L29ubHlrZXktYWdlbnQpPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBgKCZxdW90O1BZVEhPTlBBVEgmcXVvdDsgJiMzOTs/ Pz8gJiMzOTs/Pz8pKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgICYjMzk7bWF5YmUtd3JhcC1vdGhl ci10aGluZ3M8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCAmIzM5Oz8/PykpKSkpKTxicj4NCjxicj48 L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9zcGFuPjxkaXY+TWF4aW1lLCB0aGFuayB5b3Ug Zm9yIHRoZSANCnN1Z2dlc3Rpb24hIEkgZW5kZWQgdXAgd2l0aCB0aGUgZm9sbG93aW5nIHdoaWNo IHdvcmtlZCBzb21ld2hhdCBiZXR0ZXIgDQpidXQgd2FzIHJ1bm5pbmcgaW50byBydW50aW1lIGlz c3Vlcy4gV2FudGVkIHRvIHBvc3QgbXkgY29kZSBzbmlwcGV0IGhlcmUNCiBpbiBjYXNlIHRoaXMg aXMgaGVscGZ1bCB0byBzb21lb25lIGVsc2UuPC9kaXY+PGRpdj5UaGlzIGlzIGEgc2xpZ2h0IG1v ZGlmaWNhdGlvbiBvZiBjb2RlIGZvciB3cmFwIHBoYXNlIGZyb20gZ3VpeC9idWlsZC9weXRob24t YnVpbGQtc3lzdGVtLnNjbS4gPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+LS04 Jmx0Oy0tLS0tLS0tLS0tLS0tLWN1dCBoZXJlLS0tLS0tLS0tLS0tLS0tc3RhcnQtLS0tLS0tLS0t LS0tJmd0OzgtLS08L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj48c3BhbiBjbGFzcz0iZ21haWwtaW0i Pihhcmd1bWVudHM8YnI+wqAgwqAgwqAmIzM5OygjOnBoYXNlczxicj7CoCDCoCDCoCDCoChtb2Rp ZnktcGhhc2VzICVzdGFuZGFyZC1waGFzZXM8YnI+PC9zcGFuPsKgIMKgIMKgIMKgIMKgOzsgcHJl dmVudHMgcnVudGltZSBlcnJvciB3aGVyZSBzaGVsbCB3cmFwcGVyIGZvciBvbmx5a2V5X2FnZW50 LnB5IGlzIGxvYWRlZCBhcyBtb2R1bGU8YnI+wqAgwqAgwqAgwqAgwqAocmVwbGFjZSAmIzM5O3dy YXA8YnI+wqAgwqAgwqAgwqAgwqAgwqAobGFtYmRhKiAoIzprZXkgaW5wdXRzIG91dHB1dHMgIzph bGxvdy1vdGhlci1rZXlzKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoChkZWZpbmUgKGxpc3Qtb2Yt ZmlsZXMgZGlyKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChmaW5kLWZpbGVzIGRpciAobGFt YmRhIChmaWxlIHN0YXQpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgKGFuZCAoZXE/ICYjMzk7cmVndWxhciAoc3RhdDp0eXBlIHN0YXQpKTxicj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAo bm90ICh3cmFwcGVyPyBmaWxlKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKG5vdCAoKGZpbGUtbmFtZS1wcmVkaWNhdGUgJnF1b3Q7 b25seWtleV9hZ2VudC5weSZxdW90OykgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGZpbGUgPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0 YXQpKSkpKSk8YnI+PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgKGRlZmluZSBiaW5kaXJzPGJyPsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgKGxldCAoKG91dCAoYXNzb2MtcmVmIG91dHB1dHMgJnF1b3Q7 b3V0JnF1b3Q7KSkpIDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChsaXN0IChzdHJpbmct YXBwZW5kIG91dCAmcXVvdDsvYmluJnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoChzdHJpbmctYXBwZW5kIG91dCAmcXVvdDsvc2JpbiZxdW90OykpKSk8YnI+PGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgKGxldCogKChvdXQgwqAoYXNzb2MtcmVmIG91dHB1dHMgJnF1 b3Q7b3V0JnF1b3Q7KSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKHB5dGhvbiAo YXNzb2MtcmVmIGlucHV0cyAmcXVvdDtweXRob24mcXVvdDspKTxicj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAodmFyIGAoJnF1b3Q7UFlUSE9OUEFUSCZxdW90OyBwcmVmaXg8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAsKGNvbnMgKHN0cmluZy1hcHBl bmQgb3V0ICZxdW90Oy9saWIvcHl0aG9uJnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHB5dGhv bi12ZXJzaW9uIHB5dGhvbik8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDsvc2l0ZS1wYWNrYWdl cyZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgKHNlYXJjaC1wYXRoLWFzLXN0cmluZy0mZ3Q7bGlzdDxicj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChvciAoZ2V0ZW52ICZxdW90O1BZ VEhPTlBBVEgmcXVvdDspICZxdW90OyZxdW90OykpKSkpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoChmb3ItZWFjaCAobGFtYmRhIChkaXIpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgKGxldCAoKGZpbGVzIChsaXN0LW9mLWZpbGVzIGRpcikpKTxicj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChmb3ItZWFjaCAobGFtYmRh IChmaWxlKSAod3JhcC1wcm9ncmFtIGZpbGUgdmFyKSkgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZmlsZXMpKSk8YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW5kaXJzKTxicj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCN0KSkpKSkpPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+PHNwYW4+LS04Jmx0Oy0t LS0tLS0tLS0tLS0tLWN1dCBoZXJlLS0tLS0tLS0tLS0tLS0tZW5kLS0tLS0tLS0tLS0tLS0tJmd0 OzgtLS08L3NwYW4+PC9zcGFuPjwvZGl2PjwvZGl2PjxkaXY+PGRpdiBkaXI9Imx0ciIgY2xhc3M9 ImdtYWlsX3NpZ25hdHVyZSIgZGF0YS1zbWFydG1haWw9ImdtYWlsX3NpZ25hdHVyZSI+PGRpdiBk aXI9Imx0ciI+PGRpdj48ZGl2IGRpcj0ibHRyIj48YnI+PC9kaXY+PGRpdiBkaXI9Imx0ciI+UmVn YXJkcyw8ZGl2PkFudHdhbmU8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48YnI+ PC9kaXY+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0i Z21haWxfYXR0ciI+T24gTW9uLCBTZXAgMjAsIDIwMjEgYXQgNDowOSBQTSBBbnR3YW5lIE1hc29u ICZsdDs8YSBocmVmPSJtYWlsdG86YWQubWFzb24xNDEzQGdtYWlsLmNvbSI+YWQubWFzb24xNDEz QGdtYWlsLmNvbTwvYT4mZ3Q7IHdyb3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21h aWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4 IHNvbGlkIHJnYigyMDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+PGRpdiBkaXI9Imx0ciI+ PGRpdiBkaXI9Imx0ciI+PGJyPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRp cj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gU3VuLCBTZXAgMTksIDIwMjEgYXQgMTo1OSBQ TSBNYXhpbWUgRGV2b3MgJmx0OzxhIGhyZWY9Im1haWx0bzptYXhpbWVkZXZvc0B0ZWxlbmV0LmJl IiB0YXJnZXQ9Il9ibGFuayI+bWF4aW1lZGV2b3NAdGVsZW5ldC5iZTwvYT4mZ3Q7IHdyb3RlOjxi cj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4 IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigyMDQsMjA0LDIwNCk7cGFk ZGluZy1sZWZ0OjFleCI+QW55d2F5LCB0byBwcmV2ZW50IG9ubHlrZXlfYWdlbnQucHkgZnJvbSBi ZWluZyB3cmFwcGVkLCB5b3UgY2FuIHJlcGxhY2U8YnI+DQp0aGUgJiMzOTt3cmFwJiMzOTsgcGhh c2Ugd2l0aCBhIGN1c3RvbSAmIzM5O3dyYXAmIzM5OyBwaGFzZSBhZGp1c3RlZCBmb3Igb25seWtl eS1hZ2VudCBwZWN1bGFyaXRpZXM6PGJyPg0KPGJyPg0KKHBhY2thZ2U8YnI+DQrCoCAobmFtZSAm cXVvdDtweXRob24tb25seWtleS1hZ2VudCZxdW90Oyk8YnI+DQrCoCAuLi48YnI+DQrCoCAoYXJn dW1lbnRzPGJyPg0KwqAgwqAgYCgjOnBoYXNlczxicj4NCsKgIMKgIMKgIChtb2RpZnktcGhhc2Vz ICVzdGFuZGFyZC1waGFzZXM8YnI+DQrCoCDCoCDCoCDCoCAocmVwbGFjZSAmIzM5O3dyYXA8YnI+ DQrCoCDCoCDCoCDCoCDCoCAobGFtYmRhKiAoIzprZXkgb3V0cHV0cyAjOmFsbG93LW90aGVyLWtl eXMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgKGRlZmluZSBiaW4gKHN0cmluZy1hcHBlbmQgKGFz c29jLXJlZiBvdXRwdXRzICZxdW90O291dCZxdW90OykgJnF1b3Q7L2JpbiZxdW90Oyk8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCA7OyBSZXBsYWNlID8/PyB3aXRoIHNvbWV0aGluZyBhcHByb3ByaWF0 ZSBmb3Igb25seWtleS1hZ2VudCA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCAod3JhcC1wcm9ncmFt IChzdHJpbmctYXBwZW5kIGJpbiAmcXVvdDsvb25seWtleS1hZ2VudCk8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGAoJnF1b3Q7UFlUSE9OUEFUSCZxdW90OyAmIzM5Oz8/PyAmIzM5Oz8/Pykp PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgJiMzOTttYXliZS13cmFwLW90aGVyLXRoaW5nczxicj4N CsKgIMKgIMKgIMKgIMKgIMKgICYjMzk7Pz8/KSkpKSkpPGJyPg0KPGJyPjwvYmxvY2txdW90ZT48 ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rIHlvdSBmb3IgdGhlIHN1Z2dlc3Rpb24hIEkgZW5kZWQg dXAgd2l0aCB0aGUgZm9sbG93aW5nIHdoaWNoIHdvcmtlZCBzb21ld2hhdCBiZXR0ZXIgYnV0IHdh cyBydW5uaW5nIGludG8gcnVudGltZSBpc3N1ZXMuIFdhbnRlZCB0byBwb3N0IG15IGNvZGUgc25p cHBldCBoZXJlIGluIGNhc2UgdGhpcyBpcyBoZWxwZnVsIHRvIHNvbWVvbmUgZWxzZS48L2Rpdj48 ZGl2PlRoaXMgaXMgYSBzbGlnaHQgbW9kaWZpY2F0aW9uIG9mIGNvZGUgZm9yIHdyYXAgcGhhc2Ug ZnJvbSBndWl4L2J1aWxkL3B5dGhvbi1idWlsZC1zeXN0ZW0uc2NtLiA8YnI+PC9kaXY+PGRpdj48 YnI+PC9kaXY+PGRpdj48c3Bhbj4tLTgmbHQ7LS0tLS0tLS0tLS0tLS0tY3V0IGhlcmUtLS0tLS0t LS0tLS0tLS1zdGFydC0tLS0tLS0tLS0tLS0mZ3Q7OC0tLTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFu Pihhcmd1bWVudHM8YnI+wqAgwqAgwqAmIzM5OygjOnBoYXNlczxicj7CoCDCoCDCoCDCoChtb2Rp ZnktcGhhc2VzICVzdGFuZGFyZC1waGFzZXM8YnI+wqAgwqAgwqAgwqAgwqA7OyBwcmV2ZW50cyBy dW50aW1lIGVycm9yIHdoZXJlIHNoZWxsIHdyYXBwZXIgZm9yIG9ubHlrZXlfYWdlbnQucHkgaXMg bG9hZGVkIGFzIG1vZHVsZTxicj7CoCDCoCDCoCDCoCDCoChyZXBsYWNlICYjMzk7d3JhcDxicj7C oCDCoCDCoCDCoCDCoCDCoChsYW1iZGEqICgjOmtleSBpbnB1dHMgb3V0cHV0cyAjOmFsbG93LW90 aGVyLWtleXMpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgKGRlZmluZSAobGlzdC1vZi1maWxlcyBk aXIpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGZpbmQtZmlsZXMgZGlyIChsYW1iZGEgKGZp bGUgc3RhdCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAoYW5kIChlcT8gJiMzOTtyZWd1bGFyIChzdGF0OnR5cGUgc3RhdCkpPGJyPsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChub3QgKHdy YXBwZXI/IGZpbGUpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAobm90ICgoZmlsZS1uYW1lLXByZWRpY2F0ZSAmcXVvdDtvbmx5a2V5 X2FnZW50LnB5JnF1b3Q7KSA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZmlsZSA8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3RhdCkpKSkp KTxicj48YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAoZGVmaW5lIGJpbmRpcnM8YnI+wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAobGV0ICgob3V0IChhc3NvYy1yZWYgb3V0cHV0cyAmcXVvdDtvdXQmcXVv dDspKSkgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGxpc3QgKHN0cmluZy1hcHBlbmQg b3V0ICZxdW90Oy9iaW4mcXVvdDspPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKHN0cmluZy1hcHBlbmQgb3V0ICZxdW90Oy9zYmluJnF1b3Q7KSkpKTxicj48YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAobGV0KiAoKG91dCDCoChhc3NvYy1yZWYgb3V0cHV0cyAmcXVvdDtvdXQm cXVvdDspKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAocHl0aG9uIChhc3NvYy1y ZWYgaW5wdXRzICZxdW90O3B5dGhvbiZxdW90OykpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgICh2YXIgYCgmcXVvdDtQWVRIT05QQVRIJnF1b3Q7IHByZWZpeDxicj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCwoY29ucyAoc3RyaW5nLWFwcGVuZCBvdXQg JnF1b3Q7L2xpYi9weXRob24mcXVvdDs8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAocHl0aG9uLXZlcnNp b24gcHl0aG9uKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90Oy9zaXRlLXBhY2thZ2VzJnF1b3Q7 KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAo c2VhcmNoLXBhdGgtYXMtc3RyaW5nLSZndDtsaXN0PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKG9yIChnZXRlbnYgJnF1b3Q7UFlUSE9OUEFU SCZxdW90OykgJnF1b3Q7JnF1b3Q7KSkpKSkpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGZv ci1lYWNoIChsYW1iZGEgKGRpcik8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAobGV0ICgoZmlsZXMgKGxpc3Qtb2YtZmlsZXMgZGlyKSkpPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGZvci1lYWNoIChsYW1iZGEgKGZpbGUp ICh3cmFwLXByb2dyYW0gZmlsZSB2YXIpKSA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmaWxlcykpKTxicj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJpbmRpcnMpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgI3QpKSkpKSk8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj48c3Bhbj4tLTgmbHQ7LS0tLS0tLS0t LS0tLS0tY3V0IGhlcmUtLS0tLS0tLS0tLS0tLS1lbmQtLS0tLS0tLS0tLS0tLS0mZ3Q7OC0tLTwv c3Bhbj48L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+DQo= --000000000000d70f3805cc72e001--