🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: gmane.emacs.devel
59 messages
59 total messages Page 1 of 2 Started by Thierry Volpiatt Mon, 07 Aug 2023 07:57
Page 1 of 2 • 59 total messages
Changes to make in elpa-packages file for nongnu elpa
#306373
Author: Thierry Volpiatt
Date: Mon, 07 Aug 2023 07:57
62 lines
2325 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


I see that Helm installation from nongnu elpa doesn't include
emacs-helm.sh script, would it be possible to modify this?

        diff --git a/elpa-packages b/elpa-packages
        index 77d7a5409e..0923724b62 100644
        --- a/elpa-packages
        +++ b/elpa-packages
        @@ -312,11 +312,11 @@
           :ignored-files "COPYING")
         
          (helm			:url "https://github.com/emacs-helm/helm"
        -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
        +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
         		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
         
          (helm-core		:url "https://github.com/emacs-helm/helm"
        -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
        +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
         		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
         		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
         		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"

Also I asked here about a new dependency for Helm called wfnames and had
no answer (2 times), so I ask again differently now:
When a package is available in Melpa do we have to add it in nongnu as
well to satisfy dependencies for a package already in nongnu?

Thanks.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTQpeoTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk326C/wMJWMxsX3aY04IZVMN9YNv/wk9Ry+c
4q7hzjrkpcKVpMuNxWKA/2FXvhwLhKu8kZrZAHh4+60DymLqXrPGQbG+Nv8wiYw3
k/1+TXhAbiyUwOFU5q6YwrSxRZ3quDDtpS584zymqSOp7RrrhHyuzx14eYrnUh8P
yti9kG0GL7R7Fnu5xxRhuo4kq1qg3gLCZk/68m5mvZKxoQaZ4Jvm5YYPQ+gvzwTc
p1a3FfTkMKDEZs4t3osH8u/v87UjuAE2r22jTTwU9is+VuBsZWkPrTsqTkA80jSg
RTpDJEDQNyUcGHxQo3C1HuvbT3X4iZdfDKvrSU7CBcptvIIGWzrlHcw0ZymwBAAE
xlA2q3E5nIcXihH82j5V9KBxos7Eg1RRhCxjn7Ty70AsVQEMrlpOGPcXlCPHmlBN
dvbJil8lpZ122OlD0q87dXQrMRZTCEW4SMCE+FlqvbxMomlWEc+oDFNpPTkwoDlZ
NnMIvWTFPdSbHv6VZDjM0CN1n5f0Ab3X5tU=la8Y
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306384
Author: Philip Kaluderci
Date: Mon, 07 Aug 2023 13:30
48 lines
2203 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> I see that Helm installation from nongnu elpa doesn't include
> emacs-helm.sh script, would it be possible to modify this?
>
>         diff --git a/elpa-packages b/elpa-packages
>         index 77d7a5409e..0923724b62 100644
>         --- a/elpa-packages
>         +++ b/elpa-packages
>         @@ -312,11 +312,11 @@
>            :ignored-files "COPYING")
>
>           (helm			:url "https://github.com/emacs-helm/helm"
>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>
>           (helm-core		:url "https://github.com/emacs-helm/helm"
>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"

There shouldn't be any issue in applying this patch, but could you
explain the propose of this script?  I see something involving
straight.el, which is a package.el-incompatible package manager, at
which point I am confused why this should be distributed along with a
"package.el"-package.

> Also I asked here about a new dependency for Helm called wfnames and had
> no answer (2 times),

Sorry about that, you can always feel free to CC me if you have specific
questions that might get lost on the mailing list.  I suppose Stefan
Monnier wouldn't object to be mentioned either.

>                      so I ask again differently now:
>
> When a package is available in Melpa do we have to add it in nongnu as
> well to satisfy dependencies for a package already in nongnu?

Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
ELPA wouldn't be able to install the package due to a missing dependency
and that is obviously not intended.

> Thanks.

Re: Changes to make in elpa-packages file for nongnu elpa
#306392
Author: Thierry Volpiatt
Date: Mon, 07 Aug 2023 18:19
102 lines
4077 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> I see that Helm installation from nongnu elpa doesn't include
>> emacs-helm.sh script, would it be possible to modify this?
>>
>>         diff --git a/elpa-packages b/elpa-packages
>>         index 77d7a5409e..0923724b62 100644
>>         --- a/elpa-packages
>>         +++ b/elpa-packages
>>         @@ -312,11 +312,11 @@
>>            :ignored-files "COPYING")
>>          
>>           (helm			:url "https://github.com/emacs-helm/helm"
>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>          
>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>
> There shouldn't be any issue in applying this patch, but could you
> explain the propose of this script?

It is used specially for reproducing bugs in a clean environment, see it
as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
with only Helm loaded, this ensure the bug if one comes from Helm and
not another package. This is important especially nowaday people are
using "Emacs distribution" with the world list of packages installed.
Apart that the script is useful to quickly launch Emacs with helm, one
can use it from the Helm directory or symlinked to e.g. ~/bin. 

> I see something involving straight.el, which is a
> package.el-incompatible package manager, at which point I am confused
> why this should be distributed along with a "package.el"-package.

The script doesn't need straight, but it ensures the script is usable for
somebody using straight (to find package directory etc...).

>> Also I asked here about a new dependency for Helm called wfnames and had
>> no answer (2 times), 
>
> Sorry about that, you can always feel free to CC me if you have specific
> questions that might get lost on the mailing list.  I suppose Stefan
> Monnier wouldn't object to be mentioned either.

Ok thanks, I will next time now I know you and Stefan are in charge of
this.

>>                      so I ask again differently now:
>>
>> When a package is available in Melpa do we have to add it in nongnu as
>> well to satisfy dependencies for a package already in nongnu?
>
> Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
> ELPA wouldn't be able to install the package due to a missing dependency
> and that is obviously not intended.

Ok, it's what I thought, so yes it would be nice to install wfnames
package in Nongnu.
Here is the link: https://github.com/thierryvolpiatto/wfnames

Thanks.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTROSQTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk7x+DACrsERauQLhmK6GlkLr9I3tKpd02ElL
7fiPUHOOvuSBw+DBj/XG6D6C0P9bOO9B7SNPs6ZTqAEyv6UnWC7CLAevnBkiH8NI
WnCOJkSRzhjI9Xa5dg3rqm0oLqB/3k/VueCrUdSvxgR5MrdebuOitPDdJFKY1zHz
uTrHtt2kfZucCGICNIMYO7aGXTPqa3VwstvUeYp9ak8eLkqVHZAu9xYrcakLLWn/
oRBbuZJdTzAeKnw0ZFj5fjKuetKHRZqAIRRI+wj0V9qxHpqY9v6eRL2r9zuim3rm
k7gG/+Qtb0Xv2Im2PEmkTI+6nnM3eQE2w4ItVis5QyyF6/LjNPa1dAzuvtHdsUZm
wHEbpYp4H/hTy0fZg141pl5rauTrDjQijseC8v1hWTmKFHrnivbfucujD1UazgrF
WPZJu/JNcQyzhn9yUhBqFDFisECWmsYXyw7lkgIhsTG+tfSHWYl5LYL5It9F96hA
80tPD0bjbHgbeH5w9rr+4X54Uf3Lv3UTpvw=NJ4P
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306394
Author: Philip Kaluderci
Date: Mon, 07 Aug 2023 20:33
260 lines
10474 bytes
--=-=-=
Content-Type: text/plain

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> I see that Helm installation from nongnu elpa doesn't include
>>> emacs-helm.sh script, would it be possible to modify this?
>>>
>>>         diff --git a/elpa-packages b/elpa-packages
>>>         index 77d7a5409e..0923724b62 100644
>>>         --- a/elpa-packages
>>>         +++ b/elpa-packages
>>>         @@ -312,11 +312,11 @@
>>>            :ignored-files "COPYING")
>>>          
>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>          
>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>
>> There shouldn't be any issue in applying this patch, but could you
>> explain the propose of this script?
>
> It is used specially for reproducing bugs in a clean environment, see it
> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
> with only Helm loaded, this ensure the bug if one comes from Helm and
> not another package. This is important especially nowaday people are
> using "Emacs distribution" with the world list of packages installed.
> Apart that the script is useful to quickly launch Emacs with helm, one
> can use it from the Helm directory or symlinked to e.g. ~/bin. 

I see.  In that case is there any reason you implement this as a shell
script?  (It might be interesting to provide something like this for
package.el, to test packages in a generic way.)

>> I see something involving straight.el, which is a
>> package.el-incompatible package manager, at which point I am confused
>> why this should be distributed along with a "package.el"-package.
>
> The script doesn't need straight, but it ensures the script is usable for
> somebody using straight (to find package directory etc...).

Ah OK my bad.

>>> Also I asked here about a new dependency for Helm called wfnames and had
>>> no answer (2 times), 
>>
>> Sorry about that, you can always feel free to CC me if you have specific
>> questions that might get lost on the mailing list.  I suppose Stefan
>> Monnier wouldn't object to be mentioned either.
>
> Ok thanks, I will next time now I know you and Stefan are in charge of
> this.

I am sort of an unofficial co-maintainer, without access to any
server-side infrastructure, but other than that I'm glad to help within
my possibilities.

>>>                      so I ask again differently now:
>>>
>>> When a package is available in Melpa do we have to add it in nongnu as
>>> well to satisfy dependencies for a package already in nongnu?
>>
>> Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
>> ELPA wouldn't be able to install the package due to a missing dependency
>> and that is obviously not intended.
>
> Ok, it's what I thought, so yes it would be nice to install wfnames
> package in Nongnu.
> Here is the link: https://github.com/thierryvolpiatto/wfnames

Sure, but could you first take a look at these comments, suggestions and
questions I have made while skimming over the source?


--=-=-=
Content-Type: text/plain
Content-Disposition: inline

diff --git a/wfnames.el b/wfnames.el
index e5a83b5..a61a18d 100644
--- a/wfnames.el
+++ b/wfnames.el
@@ -34,20 +34,20 @@
 
 ;; Usage:
 ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to
-;; save your changes. You have completion on filenames and directories
+;; save your changes.  You have completion on filenames and directories
 ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=.
 
 ;;; Code:
 
-(require 'cl-lib)
+(eval-when-compile (require 'cl-lib))	;you are only using macros, so this should be OK
 
 ;; Internal.
-(defvar wfnames-buffer "*Wfnames*")
-(defvar wfnames--modified nil)
+(defvar wfnames-buffer "*Wfnames*")	;perhaps `defconst'
+(defvar-local wfnames--modified nil)
 
 (defgroup wfnames nil
   "A mode to edit filenames."
-  :group 'wfnames)
+  :group 'wfnames)			;watch out, this is a recursive group
 
 (defcustom wfnames-create-parent-directories t
   "Create parent directories when non nil."
@@ -57,16 +57,21 @@
   "Ask confirmation when overwriting."
   :type 'boolean)
 
-(defvar wfnames-after-commit-hook nil)
+(defcustom wfnames-after-commit-hook nil
+  "Hook to run after `wfnames-commit-buffer'." ;rephrase this
+  :type 'hook)
 
 (defcustom wfnames-after-commit-function #'kill-buffer
   "A function to call on `wfnames-buffer' when done."
   :type 'function)
 
 (defcustom wfnames-make-backup nil
-  "Backup files before overwriting when non nil."
+  "Non-nil means files are backed up before overwriting."
   :type 'boolean)
 
+;; instead of defining new faces and colours, do you think it would be
+;; possible to inherit from existing faces?
+
 (defface wfnames-modified
     '((t :background "LightBlue" :foreground "black"))
   "Face used when filename is modified.")
@@ -104,27 +109,27 @@
   "Provide filename completion in wfnames buffer."
   (let ((beg (line-beginning-position))
         (end (point)))
+    ;; Does it make sense to extend beyond END to allow completing
+    ;; file names mid-string?
     (list beg end #'completion-file-name-table
           :exit-function (lambda (str _status)
                              (when (and (stringp str)
                                         (eq (char-after) ?/))
                                (delete-char -1))))))
 
-(define-derived-mode wfnames-mode
-    text-mode "wfnames"
+(define-derived-mode wfnames-mode text-mode "wfnames"
     "Major mode to edit filenames.
 
 Special commands:
 \\{wfnames-mode-map}"
   (add-hook 'after-change-functions #'wfnames-after-change-hook nil t)
-  (make-local-variable 'wfnames--modified)
-  (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf)
-  (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes))
+  (setq-local completion-at-point-functions #'wfnames-capf)
+  (setq-local revert-buffer-function #'wfnames-revert-changes))
 
 (defun wfnames-abort ()
   "Quit and kill wfnames buffer."
   (interactive)
-  (quit-window t))
+  (quit-window t))			;isn't this `kill-buffer-and-window'
 
 (defun wfnames-after-change-hook (beg end _len)
   "Put overlay on current line when modified.
@@ -137,9 +142,10 @@ Args BEG and END delimit changes on line."
                (eol (line-end-position))
                (old (get-text-property bol 'old-name))
                (new (buffer-substring-no-properties bol eol))
-               ov face)
-          (setq face (if (file-exists-p new)
-                         'wfnames-modified-exists 'wfnames-modified))
+               (face (if (file-exists-p new)
+                         'wfnames-modified-exists
+		       'wfnames-modified))
+	       ov)
           (setq-local wfnames--modified
                       (cons old (delete old wfnames--modified)))
           (cl-loop for o in (overlays-in bol eol)
@@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
                                          "* "
                                          'face 'wfnames-prefix))
                           "\n"))
-      (when append (delete-duplicate-lines (point-min) (point-max))))
+      (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4
     (unless append
       ;; Go to beginning of basename on first line.
-      (while (re-search-forward "/" (line-end-position) t))
+      (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)
       (wfnames-mode)
       (funcall display-fn wfnames-buffer))))
 
@@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
   "Backup FILE."
   (when wfnames-make-backup
     (with-current-buffer (find-file-noselect file)
-      (let ((backup-by-copying t))
+      (let ((backup-by-copying t))	;why is this bound?  isn't this a user preference?
         (backup-buffer))
       (kill-buffer))))
 
@@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
                                    (let ((basedir (file-name-directory
                                                    (directory-file-name new))))
                                      (unless (file-directory-p basedir)
-                                       (mkdir basedir 'parents))))
+                                       (make-directory basedir 'parents))))
                                  (if (and ow (wfnames-ask-for-overwrite new))
                                      ;; Direct overwrite i.e. first loop.
                                      (progn
@@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines."
     (wfnames-revert-current-line-1)
     (when (eobp) (forward-line -1))
     (goto-char (line-beginning-position))
-    (while (re-search-forward "/" (line-end-position) t))))
+    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
 
 (defun wfnames-revert-changes (_ignore-auto _no-confirm)
   "Revert wfnames buffer to its initial state.
 
 This is used as `revert-buffer-function' for `wfnames-mode'."
   (with-current-buffer wfnames-buffer
-    (cl-loop for o in (overlays-in (point-min) (point-max))
-             when (overlay-get o 'hff-changed)
-             do (delete-overlay o))
+    (dolist (o (overlays-in (point-min) (point-max)))
+      (when (overlay-get o 'hff-changed)
+	(delete-overlay o)))
     (goto-char (point-min))
     (save-excursion
       (while (not (eobp))
         (wfnames-revert-current-line-1)))
-    (while (re-search-forward "/" (line-end-position) t))))
+    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
+
 
 (provide 'wfnames)
 

--=-=-=
Content-Type: text/plain


> Thanks.

--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306401
Author: Thierry Volpiatt
Date: Tue, 08 Aug 2023 04:33
333 lines
11375 bytes
--=-=-=
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Hello Philip,

Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> I see that Helm installation from nongnu elpa doesn't include
>>>> emacs-helm.sh script, would it be possible to modify this?
>>>>
>>>>         diff --git a/elpa-packages b/elpa-packages
>>>>         index 77d7a5409e..0923724b62 100644
>>>>         --- a/elpa-packages
>>>>         +++ b/elpa-packages
>>>>         @@ -312,11 +312,11 @@
>>>>            :ignored-files "COPYING")
>>>>=20=20=20=20=20=20=20=20=20=20
>>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" =
"helm-core.el" "helm.el"
>>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>>=20=20=20=20=20=20=20=20=20=20
>>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" =
"helm-adaptive.el"
>>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-a=
daptive.el"
>>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "hel=
m-comint.el"
>>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "hel=
m-easymenu.el"
>>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "he=
lm-eshell.el"
>>>
>>> There shouldn't be any issue in applying this patch, but could you
>>> explain the propose of this script?
>>
>> It is used specially for reproducing bugs in a clean environment, see it
>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>> with only Helm loaded, this ensure the bug if one comes from Helm and
>> not another package. This is important especially nowaday people are
>> using "Emacs distribution" with the world list of packages installed.
>> Apart that the script is useful to quickly launch Emacs with helm, one
>> can use it from the Helm directory or symlinked to e.g. ~/bin.=20
>
> I see.  In that case is there any reason you implement this as a shell
> script?

Well when I wrote the script, packages where not existing and from
outside emacs it is actually the only way to run a package isolated.

> (It might be interesting to provide something like this for
> package.el, to test packages in a generic way.)

Yes, this would be interesting, it would be something like this:

Emacs -Q
M-x <A command that run a package alone, isolated from other
packages nuisances>

> I am sort of an unofficial co-maintainer, without access to any
> server-side infrastructure, but other than that I'm glad to help within
> my possibilities.

Ok thanks.

>> Ok, it's what I thought, so yes it would be nice to install wfnames
>> package in Nongnu.
>> Here is the link: https://github.com/thierryvolpiatto/wfnames
>
> Sure, but could you first take a look at these comments, suggestions and
> questions I have made while skimming over the source?
>
> diff --git a/wfnames.el b/wfnames.el
> index e5a83b5..a61a18d 100644
> --- a/wfnames.el
> +++ b/wfnames.el
> @@ -34,20 +34,20 @@
>=20=20
>  ;; Usage:
>  ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to
> -;; save your changes. You have completion on filenames and directories
> +;; save your changes.  You have completion on filenames and directories
>  ;; with TAB but if you are using Iedit package and it is in action use =
=3DM-TAB=3D.
>=20=20
>  ;;; Code:
>=20=20
> -(require 'cl-lib)
> +(eval-when-compile (require 'cl-lib))	;you are only using macros, so thi=
s should be OK

Ok done.
=20=20
>  ;; Internal.
> -(defvar wfnames-buffer "*Wfnames*")
> -(defvar wfnames--modified nil)
> +(defvar wfnames-buffer "*Wfnames*")	;perhaps `defconst'
> +(defvar-local wfnames--modified nil)

Ok done.

>  
>  (defgroup wfnames nil
>    "A mode to edit filenames."
> -  :group 'wfnames)
> +  :group 'wfnames)			;watch out, this is a recursive group

Good catch, done.

>  (defcustom wfnames-create-parent-directories t
>    "Create parent directories when non nil."
> @@ -57,16 +57,21 @@
>    "Ask confirmation when overwriting."
>    :type 'boolean)
>=20=20
> -(defvar wfnames-after-commit-hook nil)
> +(defcustom wfnames-after-commit-hook nil
> +  "Hook to run after `wfnames-commit-buffer'." ;rephrase this

Not sure how to rephrase this:

"Hook that run after `wfnames-commit-buffer'."?

>=20
> + :type 'hook)

Othewise defcustom make sense, done.

>  (defcustom wfnames-after-commit-function #'kill-buffer
>    "A function to call on `wfnames-buffer' when done."
>    :type 'function)
>=20=20
>  (defcustom wfnames-make-backup nil
> -  "Backup files before overwriting when non nil."
> +  "Non-nil means files are backed up before overwriting."

Ok done.

>=20
>    :type 'boolean)
>  
> +;; instead of defining new faces and colours, do you think it would be
> +;; possible to inherit from existing faces?

Apart requiring a package just for the faces no, font-lock family
doesn't provide :background faces.

>  (defface wfnames-modified
>      '((t :background "LightBlue" :foreground "black"))
>    "Face used when filename is modified.")
> @@ -104,27 +109,27 @@
>    "Provide filename completion in wfnames buffer."
>    (let ((beg (line-beginning-position))
>          (end (point)))
> +    ;; Does it make sense to extend beyond END to allow completing
> +    ;; file names mid-string?

This one for now I don't know, I transformed your comment with a FIXME.

>=20
>      (list beg end #'completion-file-name-table :exit-function (lambda
> (str _status) (when (and (stringp str) (eq (char-after) ?/))
> (delete-char -1))))))
>=20=20
> -(define-derived-mode wfnames-mode
> -    text-mode "wfnames"
> +(define-derived-mode wfnames-mode text-mode "wfnames"
>      "Major mode to edit filenames.

Ok.

>  Special commands:
>  \\{wfnames-mode-map}"
>    (add-hook 'after-change-functions #'wfnames-after-change-hook nil t)
> -  (make-local-variable 'wfnames--modified)
> -  (set (make-local-variable 'completion-at-point-functions) #'wfnames-ca=
pf)
> -  (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-ch=
anges))
> +  (setq-local completion-at-point-functions #'wfnames-capf)
> +  (setq-local revert-buffer-function #'wfnames-revert-changes))

Yes done.
=20=20
>  (defun wfnames-abort ()
>    "Quit and kill wfnames buffer."
>    (interactive)
> -  (quit-window t))
> +  (quit-window t))			;isn't this `kill-buffer-and-window'

Yes, but quit-window is fine as well (I am used to it).
=20=20
>  (defun wfnames-after-change-hook (beg end _len)
>    "Put overlay on current line when modified.
> @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line."
>                 (eol (line-end-position))
>                 (old (get-text-property bol 'old-name))
>                 (new (buffer-substring-no-properties bol eol))
> -               ov face)
> -          (setq face (if (file-exists-p new)
> -                         'wfnames-modified-exists 'wfnames-modified))
> +               (face (if (file-exists-p new)
> +                         'wfnames-modified-exists
> +		       'wfnames-modified))
> +	       ov)

Ok.

>            (setq-local wfnames--modified
>                        (cons old (delete old wfnames--modified)))
>            (cl-loop for o in (overlays-in bol eol)
> @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing =
`wfnames-buffer'."
>                                           "* "
>                                           'face 'wfnames-prefix))
>                            "\n"))
> -      (when append (delete-duplicate-lines (point-min) (point-max))))
> +      (when append (delete-duplicate-lines (point-min) (point-max)))) ;t=
his requires Emacs 24.4
>      (unless append
>        ;; Go to beginning of basename on first line.
> -      (while (re-search-forward "/" (line-end-position) t))
> +      (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)

Ok.

>        (wfnames-mode)
>        (funcall display-fn wfnames-buffer))))
>  
> @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `w=
fnames-buffer'."
>    "Backup FILE."
>    (when wfnames-make-backup
>      (with-current-buffer (find-file-noselect file)
> -      (let ((backup-by-copying t))
> +      (let ((backup-by-copying t))	;why is this bound?  isn't this
>        a user preference?

Yes removed.

>=20
>          (backup-buffer)) (kill-buffer))))
>=20=20
> @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `w=
fnames-buffer'."
>                                     (let ((basedir (file-name-directory
>                                                     (directory-file-name =
new))))
>                                       (unless (file-directory-p basedir)
> -                                       (mkdir basedir 'parents))))
> +                                       (make-directory basedir
> 'parents))))

Ok, make sense.

>                                   (if (and ow (wfnames-ask-for-overwrite =
new))
>                                       ;; Direct overwrite i.e. first loop.
>                                       (progn
> @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next line=
s."
>      (wfnames-revert-current-line-1)
>      (when (eobp) (forward-line -1))
>      (goto-char (line-beginning-position))
> -    (while (re-search-forward "/" (line-end-position) t))))
> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))

Ok, same as above.
=20=20
>  (defun wfnames-revert-changes (_ignore-auto _no-confirm)
>    "Revert wfnames buffer to its initial state.
>=20=20
>  This is used as `revert-buffer-function' for `wfnames-mode'."
>    (with-current-buffer wfnames-buffer
> -    (cl-loop for o in (overlays-in (point-min) (point-max))
> -             when (overlay-get o 'hff-changed)
> -             do (delete-overlay o))
> +    (dolist (o (overlays-in (point-min) (point-max)))
> +      (when (overlay-get o 'hff-changed)
> +	(delete-overlay o)))

If you want ;-) done.

>      (goto-char (point-min))
>      (save-excursion
>        (while (not (eobp))
>          (wfnames-revert-current-line-1)))
> -    (while (re-search-forward "/" (line-end-position) t))))
> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
> +

Ok same as above.
=20=20
>  (provide 'wfnames)
>=20=20
>
>
>> Thanks.

Thanks.

=2D-=20
Thierry

--=-=-=
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTRyqATHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk2BXC/93c6ercbsQrAuMaXJ16uAfhNuk3e+/
m1pyY+7fFjBM5VSnM/UFwMIaotLUaFWK9Myhrtq4k95f3LtiR8fX3gOUfGrknoWO
dW88ypmqb+zBQ7whUtSyiXZQ4as6XGLo5DYRQyIa3jbRwunzIXaPSo1XVCigxNVe
NU9AezNTFtE/K2wxeCYK01nC2Goq7crRvlmAie8zy3FzmAPXrTEWefeUcQayosMw
m+ajQP3+RjFEXWE/3TRYGKR28dyRX6wE320sBftMhITULX+cFCs+bWla817OLUs+
0qH3b4vwu8LR/FbFZN01SLBkUXQIkh18GR/0ytyFYCFXAZqqKtR7Q13dfH4/VDuB
NpYCV+odA0cRjOOKkR4C8GVH2OZaM4qZS8L/Mk8dH/QTlkToE08RJggk5n8eXVTb
BzUalRzJ6qmnupdTreQkNyt15wJb4QmxjZisUAoa6dIbtzHGOVMLx+o2ZlBhG95q
DiO4B5p6K1WTSiCybrTQMBGBV0rqcppjZko=
=PhrU
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306404
Author: Philip Kaluderci
Date: Tue, 08 Aug 2023 05:52
372 lines
12396 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> Hello Philip,
>
> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>>
>>>>> I see that Helm installation from nongnu elpa doesn't include
>>>>> emacs-helm.sh script, would it be possible to modify this?
>>>>>
>>>>>         diff --git a/elpa-packages b/elpa-packages
>>>>>         index 77d7a5409e..0923724b62 100644
>>>>>         --- a/elpa-packages
>>>>>         +++ b/elpa-packages
>>>>>         @@ -312,11 +312,11 @@
>>>>>            :ignored-files "COPYING")
>>>>>          
>>>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>>>          
>>>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>>>
>>>> There shouldn't be any issue in applying this patch, but could you
>>>> explain the propose of this script?
>>>
>>> It is used specially for reproducing bugs in a clean environment, see it
>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>> not another package. This is important especially nowaday people are
>>> using "Emacs distribution" with the world list of packages installed.
>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>
>> I see.  In that case is there any reason you implement this as a shell
>> script?
>
> Well when I wrote the script, packages where not existing and from
> outside emacs it is actually the only way to run a package isolated.
>
>> (It might be interesting to provide something like this for
>> package.el, to test packages in a generic way.)
>
> Yes, this would be interesting, it would be something like this:
>
> Emacs -Q
> M-x <A command that run a package alone, isolated from other
> packages nuisances>

I was actually thinking of a command like

M-x package-isolate RET foo,bar,baz RET

and a new instance of Emacs using -Q is spun up, with all the packages
you have listed loaded, and nothing else... Sounds like a fun little
weekend project ;^)

>> I am sort of an unofficial co-maintainer, without access to any
>> server-side infrastructure, but other than that I'm glad to help within
>> my possibilities.
>
> Ok thanks.
>
>>> Ok, it's what I thought, so yes it would be nice to install wfnames
>>> package in Nongnu.
>>> Here is the link: https://github.com/thierryvolpiatto/wfnames
>>
>> Sure, but could you first take a look at these comments, suggestions and
>> questions I have made while skimming over the source?
>>
>> diff --git a/wfnames.el b/wfnames.el
>> index e5a83b5..a61a18d 100644
>> --- a/wfnames.el
>> +++ b/wfnames.el
>> @@ -34,20 +34,20 @@
>>  
>>  ;; Usage:
>>  ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to
>> -;; save your changes. You have completion on filenames and directories
>> +;; save your changes.  You have completion on filenames and directories
>>  ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=.
>>  
>>  ;;; Code:
>>  
>> -(require 'cl-lib)
>> +(eval-when-compile (require 'cl-lib))	;you are only using macros, so this should be OK
>
> Ok done.
>   
>>  ;; Internal.
>> -(defvar wfnames-buffer "*Wfnames*")
>> -(defvar wfnames--modified nil)
>> +(defvar wfnames-buffer "*Wfnames*")	;perhaps `defconst'
>> +(defvar-local wfnames--modified nil)
>
> Ok done.
>
>>  
>>  (defgroup wfnames nil
>>    "A mode to edit filenames."
>> -  :group 'wfnames)
>> +  :group 'wfnames)			;watch out, this is a recursive group
>
> Good catch, done.
>
>>  (defcustom wfnames-create-parent-directories t
>>    "Create parent directories when non nil."
>> @@ -57,16 +57,21 @@
>>    "Ask confirmation when overwriting."
>>    :type 'boolean)
>>  
>> -(defvar wfnames-after-commit-hook nil)
>> +(defcustom wfnames-after-commit-hook nil
>> +  "Hook to run after `wfnames-commit-buffer'." ;rephrase this
>
> Not sure how to rephrase this:
>
> "Hook that run after `wfnames-commit-buffer'."?

If it is OK the way it is, then you can keep it, I just wasn't sure if
you would have a more descriptive name for it.

>> + :type 'hook)
>
> Othewise defcustom make sense, done.
>
>>  (defcustom wfnames-after-commit-function #'kill-buffer
>>    "A function to call on `wfnames-buffer' when done."
>>    :type 'function)
>>  
>>  (defcustom wfnames-make-backup nil
>> -  "Backup files before overwriting when non nil."
>> +  "Non-nil means files are backed up before overwriting."
>
> Ok done.
>
>> 
>>    :type 'boolean)
>>  
>> +;; instead of defining new faces and colours, do you think it would be
>> +;; possible to inherit from existing faces?
>
> Apart requiring a package just for the faces no, font-lock family
> doesn't provide :background faces.

I wasn't thinking just of font-lock, you could pick any face,
eg. wfnames-modified could inherit from diff-refine-changed.  That way
themes don't have to add extra support, and the package looks more
"native" without any additional effort.

>>  (defface wfnames-modified
>>      '((t :background "LightBlue" :foreground "black"))
>>    "Face used when filename is modified.")
>> @@ -104,27 +109,27 @@
>>    "Provide filename completion in wfnames buffer."
>>    (let ((beg (line-beginning-position))
>>          (end (point)))
>> +    ;; Does it make sense to extend beyond END to allow completing
>> +    ;; file names mid-string?
>
> This one for now I don't know, I transformed your comment with a FIXME.

That is fine, this is just a general thing I wonder about with CAP
functions.

>> 
>>      (list beg end #'completion-file-name-table :exit-function (lambda
>> (str _status) (when (and (stringp str) (eq (char-after) ?/))
>> (delete-char -1))))))
>>  
>> -(define-derived-mode wfnames-mode
>> -    text-mode "wfnames"
>> +(define-derived-mode wfnames-mode text-mode "wfnames"
>>      "Major mode to edit filenames.
>
> Ok.
>
>>  Special commands:
>>  \\{wfnames-mode-map}"
>>    (add-hook 'after-change-functions #'wfnames-after-change-hook nil t)
>> -  (make-local-variable 'wfnames--modified)
>> -  (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf)
>> -  (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes))
>> +  (setq-local completion-at-point-functions #'wfnames-capf)
>> +  (setq-local revert-buffer-function #'wfnames-revert-changes))
>
> Yes done.
>   
>>  (defun wfnames-abort ()
>>    "Quit and kill wfnames buffer."
>>    (interactive)
>> -  (quit-window t))
>> +  (quit-window t))			;isn't this `kill-buffer-and-window'
>
> Yes, but quit-window is fine as well (I am used to it).
>   
>>  (defun wfnames-after-change-hook (beg end _len)
>>    "Put overlay on current line when modified.
>> @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line."
>>                 (eol (line-end-position))
>>                 (old (get-text-property bol 'old-name))
>>                 (new (buffer-substring-no-properties bol eol))
>> -               ov face)
>> -          (setq face (if (file-exists-p new)
>> -                         'wfnames-modified-exists 'wfnames-modified))
>> +               (face (if (file-exists-p new)
>> +                         'wfnames-modified-exists
>> +		       'wfnames-modified))
>> +	       ov)
>
> Ok.
>
>>            (setq-local wfnames--modified
>>                        (cons old (delete old wfnames--modified)))
>>            (cl-loop for o in (overlays-in bol eol)
>> @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>>                                           "* "
>>                                           'face 'wfnames-prefix))
>>                            "\n"))
>> -      (when append (delete-duplicate-lines (point-min) (point-max))))
>> +      (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4
>>      (unless append
>>        ;; Go to beginning of basename on first line.
>> -      (while (re-search-forward "/" (line-end-position) t))
>> +      (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)
>
> Ok.
>
>>        (wfnames-mode)
>>        (funcall display-fn wfnames-buffer))))
>>  
>> @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>>    "Backup FILE."
>>    (when wfnames-make-backup
>>      (with-current-buffer (find-file-noselect file)
>> -      (let ((backup-by-copying t))
>> +      (let ((backup-by-copying t))	;why is this bound?  isn't this
>>        a user preference?
>
> Yes removed.
>
>> 
>>          (backup-buffer)) (kill-buffer))))
>>  
>> @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>>                                     (let ((basedir (file-name-directory
>>                                                     (directory-file-name new))))
>>                                       (unless (file-directory-p basedir)
>> -                                       (mkdir basedir 'parents))))
>> +                                       (make-directory basedir
>> 'parents))))
>
> Ok, make sense.
>
>>                                   (if (and ow (wfnames-ask-for-overwrite new))
>>                                       ;; Direct overwrite i.e. first loop.
>>                                       (progn
>> @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines."
>>      (wfnames-revert-current-line-1)
>>      (when (eobp) (forward-line -1))
>>      (goto-char (line-beginning-position))
>> -    (while (re-search-forward "/" (line-end-position) t))))
>> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
>
> Ok, same as above.
>   
>>  (defun wfnames-revert-changes (_ignore-auto _no-confirm)
>>    "Revert wfnames buffer to its initial state.
>>  
>>  This is used as `revert-buffer-function' for `wfnames-mode'."
>>    (with-current-buffer wfnames-buffer
>> -    (cl-loop for o in (overlays-in (point-min) (point-max))
>> -             when (overlay-get o 'hff-changed)
>> -             do (delete-overlay o))
>> +    (dolist (o (overlays-in (point-min) (point-max)))
>> +      (when (overlay-get o 'hff-changed)
>> +	(delete-overlay o)))
>
> If you want ;-) done.

I am totally indifferent, they expand to almost the same code anyway:

--8<---------------cut here---------------start------------->8---
(disassemble
 (byte-compile
  '(cl-loop for o in olist
	    when (foo)
	    do (bar))))

byte code:
  args: nil
0	varref	  olist
1	constant  nil
2:1	stack-ref 1
3	consp	  
4	goto-if-nil 3
7	discard	  
8	dup	  
9	car	  
10	constant  foo
11	call	  0
12	goto-if-nil 2
15	constant  bar
16	call	  0
17	discard	  
18:2	stack-ref 1
19	cdr	  
20	stack-set 2
22	goto	  1
25:3	constant  nil
26	return	  


(disassemble
 (byte-compile
  '(dolist (o olist)
     (when (foo)
       (bar)))))

byte code:
  args: nil
0	varref	  olist
1:1	dup	  
2	goto-if-nil-else-pop 3
5	dup	  
6	car	  
7	discard	  
8	constant  nil
9	constant  foo
10	call	  0
11	goto-if-nil 2
14	constant  bar
15	call	  0
16	discard	  
17:2	discard	  
18	cdr	  
19	goto	  1
22:3	return	  
--8<---------------cut here---------------end--------------->8---


>>      (goto-char (point-min))
>>      (save-excursion
>>        (while (not (eobp))
>>          (wfnames-revert-current-line-1)))
>> -    (while (re-search-forward "/" (line-end-position) t))))
>> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
>> +
>
> Ok same as above.
>   
>>  (provide 'wfnames)
>>  
>>
>>
>>> Thanks.
>
> Thanks.

Great, I'll add the package then.

Re: Changes to make in elpa-packages file for nongnu elpa
#306405
Author: Thierry Volpiatt
Date: Tue, 08 Aug 2023 06:01
55 lines
1913 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Ok I commited your changes with some corrections from my previous post,
see below.

Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>    (let ((beg (line-beginning-position))
>          (end (point)))
> +    ;; Does it make sense to extend beyond END to allow completing
> +    ;; file names mid-string?
>      (list beg end #'completion-file-name-table
>            :exit-function (lambda (str _status)
>                               (when (and (stringp str)
>                                          (eq (char-after) ?/))
>                                 (delete-char -1))))))

Yes, we want to complete from bol to point:

     START and END delimit the text to complete (which should enclose
     point).  COLLECTION is a completion table for completing that text,

> -      (let ((backup-by-copying t))
> +      (let ((backup-by-copying t))	;why is this bound?

We want to backup by copying, not renaming, so ensure it is done by copying.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTR2/ITHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvkx0qC/9KfbgRcd9+OITFJnxggVpA/GFarWQw
CtiWY6uaFsmE00gQ8O1tqgg8uahDEWx6r+HiToPByO1cm8THWVKyJa9LuP9sp4YP
cOmTv/z6TQHVl8wF6rdYxk0pb/1xym8/DelCN3hk/msYyVK4wBIUsVbgcPiSXId8
Wi0fo2WXMRbFVMEWC43VfC7pCVSgItGRqwz5wZZXxuIId1V+bfeHCpsM61Aleblp
aVb2mHaaJsyhlBJo5lkXz3LIo/CBqhlAjAgvnhjadpchssAL5zOSq5jzUS+N9EEI
jfjKBV165B5NWGSS2soSFf/8X1OF4O3fmrLRLm1+i2jw5qKu8id+JnjdxJ9zbt53
BuDWJtuhql0d5C9VIRSPg+/Rnz700V5jiE9q2GOCAk4ioRNTdN08CLLzS/E0rTMm
Ka/JDBoEYIwsd2Isu4qoI5Tq8dyk+lXYyMW7MtS65gZA407e4nJzb7wPxAbfbLvD
bZLpt99O/AHnBIOFJJeZnadWeoJMz6cIfK8=nCPD
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306406
Author: Thierry Volpiatt
Date: Tue, 08 Aug 2023 06:17
167 lines
6018 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Hello Philip,
>>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>>>
>>>>>> I see that Helm installation from nongnu elpa doesn't include
>>>>>> emacs-helm.sh script, would it be possible to modify this?
>>>>>>
>>>>>>         diff --git a/elpa-packages b/elpa-packages
>>>>>>         index 77d7a5409e..0923724b62 100644
>>>>>>         --- a/elpa-packages
>>>>>>         +++ b/elpa-packages
>>>>>>         @@ -312,11 +312,11 @@
>>>>>>            :ignored-files "COPYING")
>>>>>>          
>>>>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>>>>          
>>>>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>>>>
>>>>> There shouldn't be any issue in applying this patch, but could you
>>>>> explain the propose of this script?
>>>>
>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>> not another package. This is important especially nowaday people are
>>>> using "Emacs distribution" with the world list of packages installed.
>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>
>>> I see.  In that case is there any reason you implement this as a shell
>>> script?
>>
>> Well when I wrote the script, packages where not existing and from
>> outside emacs it is actually the only way to run a package isolated.
>>
>>> (It might be interesting to provide something like this for
>>> package.el, to test packages in a generic way.)
>>
>> Yes, this would be interesting, it would be something like this:
>>
>> Emacs -Q
>> M-x <A command that run a package alone, isolated from other
>> packages nuisances>
>
> I was actually thinking of a command like
>
> M-x package-isolate RET foo,bar,baz RET

Then you want completion on packages and return a list of packages, you
can involve helm without requiring it by using completing-read if
helm-mode is enabled otherwise fallback to completing-read-multiple.
You will have to let-bound (and declare it on top of your file)
helm-comp-read-use-marked.

Example from mu4e:

    (cond
       ((bound-and-true-p helm-mode)
        ;; tweaks for "helm"; it's not nice to have to special-case for
        ;; completion frameworks, but this has been supported for while.
        ;; basically, with helm, helm-comp-read-use-marked + completing-read
        ;; is preferred over completing-read-multiple
        (let ((helm-comp-read-use-marked t))
          (completing-read prompt candidates)))
       (multi
        (completing-read-multiple prompt candidates))
       (t
        (completing-read prompt candidates)))


> and a new instance of Emacs using -Q is spun up,

Yes much better.

> with all the packages you have listed loaded, and nothing
> else... Sounds like a fun little weekend project ;^)

Yes, nice.

>> Apart requiring a package just for the faces no, font-lock family
>> doesn't provide :background faces.
>
> I wasn't thinking just of font-lock, you could pick any face,
> eg. wfnames-modified could inherit from diff-refine-changed.

Yes, but I will have to require diff, right?

> That way themes don't have to add extra support, and the package looks
> more "native" without any additional effort.

Of course that would be nice.

>>>    "Provide filename completion in wfnames buffer."
>>>    (let ((beg (line-beginning-position))
>>>          (end (point)))
>>> +    ;; Does it make sense to extend beyond END to allow completing
>>> +    ;; file names mid-string?
>>
>> This one for now I don't know, I transformed your comment with a FIXME.
>
> That is fine, this is just a general thing I wonder about with CAP
> functions.

So yes, as explained in previous post it is what we want, i.e. get the
completion of the part of the line from bol to point.

> I am totally indifferent, they expand to almost the same code anyway:

Yes, I have no problems either to use dolist here.

> Great, I'll add the package then.

Great thanks!

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTR4eYTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1+OC/9VI+upmNCVwpv7n+nVfkz27UguPb7u
UfuHF6giuQ2I4v68B5vHMcF5Gpckx58UTV2qECDtETgge2GiqNd1Q7l/DreXxvAm
8vDgHDOvfw0PsGIn51eX0EJw71hQtAjr+ez9VgMuCj+0eQkbu6O7iK8lW1Nal6r/
ppXghYbwq/KvsPpsofH00fRwIDpAUBWBefXGCMU/lF9iaqmDsAGIKYtqmL8WeaXK
0BFBrDEBKOdDBX4wWhgOXRWwe0MQXGS1F/ycwNlPmFRmUPmMm8i5zVosJpQpKuzV
UH3ojajsuQaJRbIaICYU//+p9AcA1pKxPCSFhjzyEecrpU11fQutQnCdKVsXlBFn
7cRkbuvjrKwzQ+BNnVYiOxuWMq/BhQu7ZIl16aE6rKQc9upvN/T8jVvrGlYXLXV8
o2aISzQHOEsIV0jeI4ytGMYuI9MyPYaOc2uQNm4t1uBF0S95uvvMRZzzrRac9mpP
7+mLQf0RuK3LDpQe8T79Qd0PWCPYPQLC76g=EwEx
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306407
Author: Michael Albinus
Date: Tue, 08 Aug 2023 08:34
19 lines
594 bytes
Philip Kaludercic <philipk@posteo.net> writes:

Hi Philip,

>>> Sorry about that, you can always feel free to CC me if you have specific
>>> questions that might get lost on the mailing list.  I suppose Stefan
>>> Monnier wouldn't object to be mentioned either.
>>
>> Ok thanks, I will next time now I know you and Stefan are in charge of
>> this.
>
> I am sort of an unofficial co-maintainer, without access to any
> server-side infrastructure, but other than that I'm glad to help within
> my possibilities.

Perhaps it is worth to mention this in admin/MAINTAINERS?

Best regards, Michael.

Re: Changes to make in elpa-packages file for nongnu elpa
#306415
Author: Philip Kaluderci
Date: Tue, 08 Aug 2023 16:37
23 lines
729 bytes
Michael Albinus <michael.albinus@gmx.de> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
> Hi Philip,
>
>>>> Sorry about that, you can always feel free to CC me if you have specific
>>>> questions that might get lost on the mailing list.  I suppose Stefan
>>>> Monnier wouldn't object to be mentioned either.
>>>
>>> Ok thanks, I will next time now I know you and Stefan are in charge of
>>> this.
>>
>> I am sort of an unofficial co-maintainer, without access to any
>> server-side infrastructure, but other than that I'm glad to help within
>> my possibilities.
>
> Perhaps it is worth to mention this in admin/MAINTAINERS?

There seems to be no information on ELPA in admin/MAINTAINERS.

> Best regards, Michael.

Re: Changes to make in elpa-packages file for nongnu elpa
#306416
Author: Michael Albinus
Date: Tue, 08 Aug 2023 18:41
17 lines
465 bytes
Philip Kaludercic <philipk@posteo.net> writes:

Hi Philip,

>>> I am sort of an unofficial co-maintainer, without access to any
>>> server-side infrastructure, but other than that I'm glad to help within
>>> my possibilities.
>>
>> Perhaps it is worth to mention this in admin/MAINTAINERS?
>
> There seems to be no information on ELPA in admin/MAINTAINERS.

Yes, the file is incomplete. So it is time to say something about GNU
ELPA, IMHO.

Best regards, Michael.

Re: Changes to make in elpa-packages file for nongnu elpa
#306422
Author: Richard Stallman
Date: Tue, 08 Aug 2023 23:47
24 lines
924 bytes
[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > When a package is available in Melpa do we have to add it in nongnu as
  > > well to satisfy dependencies for a package already in nongnu?

  > Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
  > ELPA wouldn't be able to install the package due to a missing dependency
  > and that is obviously not intended.

Our policy for Emacs is that we do not refer to MELPA for any reason.
That is because MELPA does not follow our policies about promoting
only free sofware.


--
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)



Re: Changes to make in elpa-packages file for nongnu elpa
#306428
Author: Philip Kaluderci
Date: Wed, 09 Aug 2023 07:06
24 lines
680 bytes
Michael Albinus <michael.albinus@gmx.de> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
> Hi Philip,
>
>>>> I am sort of an unofficial co-maintainer, without access to any
>>>> server-side infrastructure, but other than that I'm glad to help within
>>>> my possibilities.
>>>
>>> Perhaps it is worth to mention this in admin/MAINTAINERS?
>>
>> There seems to be no information on ELPA in admin/MAINTAINERS.
>
> Yes, the file is incomplete. So it is time to say something about GNU
> ELPA, IMHO.

In that case I'd like to request access to elpa.gnu.org, and ideally
also the list of users who have signed the CA.

I've CC'ed Eli and Stefan.

> Best regards, Michael.

Re: Changes to make in elpa-packages file for nongnu elpa
#306450
Author: Philip Kaluderci
Date: Wed, 09 Aug 2023 14:53
31 lines
1026 bytes
Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: emacs-devel@gnu.org, "'Eli Zaretskii'" <eliz@gnu.org>, Stefan Monnier
>>  <monnier@iro.umontreal.ca>
>> Date: Wed, 09 Aug 2023 07:06:30 +0000
>>
>> >>> Perhaps it is worth to mention this in admin/MAINTAINERS?
>> >>
>> >> There seems to be no information on ELPA in admin/MAINTAINERS.
>> >
>> > Yes, the file is incomplete. So it is time to say something about GNU
>> > ELPA, IMHO.
>>
>> In that case I'd like to request access to elpa.gnu.org
>
> You mean you cannot access it now?

I can access it as a user, but I cannot access it to fix something.

>> and ideally also the list of users who have signed the CA.
>
> No can do, for privacy reasons.  You can always ask me or Stefan to
> check a name for you, though.

OK, but most of the time I don't have to check a single user but would
like to see check a set of names to see how many have or haven't signed
the CA.  Is that still a manageable effort on your end?

> Thanks.

Re: Changes to make in elpa-packages file for nongnu elpa
#306438
Author: Eli Zaretskii
Date: Wed, 09 Aug 2023 14:53
23 lines
695 bytes
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: emacs-devel@gnu.org, "'Eli Zaretskii'" <eliz@gnu.org>, Stefan Monnier
>  <monnier@iro.umontreal.ca>
> Date: Wed, 09 Aug 2023 07:06:30 +0000
>
> >>> Perhaps it is worth to mention this in admin/MAINTAINERS?
> >>
> >> There seems to be no information on ELPA in admin/MAINTAINERS.
> >
> > Yes, the file is incomplete. So it is time to say something about GNU
> > ELPA, IMHO.
>
> In that case I'd like to request access to elpa.gnu.org

You mean you cannot access it now?

> and ideally also the list of users who have signed the CA.

No can do, for privacy reasons.  You can always ask me or Stefan to
check a name for you, though.

Thanks.

Re: Changes to make in elpa-packages file for nongnu elpa
#306452
Author: Philip Kaluderci
Date: Wed, 09 Aug 2023 15:24
34 lines
1164 bytes
Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: michael.albinus@gmx.de,  emacs-devel@gnu.org,  monnier@iro.umontreal.ca
>> Date: Wed, 09 Aug 2023 14:53:12 +0000
>>
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>> >> In that case I'd like to request access to elpa.gnu.org
>> >
>> > You mean you cannot access it now?
>>
>> I can access it as a user, but I cannot access it to fix something.
>
> Maybe I'm misremembering, but AFAIR if you have write access to the
> Emacs Git repository, you also have write access to the ELPA Git
> repository.

No I have access to emacs.git, elpa.git and nongnu.git, what I was
referent to was the server associated with elpa.gnu.org.

>> >> and ideally also the list of users who have signed the CA.
>> >
>> > No can do, for privacy reasons.  You can always ask me or Stefan to
>> > check a name for you, though.
>>
>> OK, but most of the time I don't have to check a single user but would
>> like to see check a set of names to see how many have or haven't signed
>> the CA.  Is that still a manageable effort on your end?
>
> Yes, feel free.

OK, thank you for the clarification.

Re: Changes to make in elpa-packages file for nongnu elpa
#306451
Author: Eli Zaretskii
Date: Wed, 09 Aug 2023 17:55
27 lines
934 bytes
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: michael.albinus@gmx.de,  emacs-devel@gnu.org,  monnier@iro.umontreal.ca
> Date: Wed, 09 Aug 2023 14:53:12 +0000
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> >> In that case I'd like to request access to elpa.gnu.org
> >
> > You mean you cannot access it now?
>
> I can access it as a user, but I cannot access it to fix something.

Maybe I'm misremembering, but AFAIR if you have write access to the
Emacs Git repository, you also have write access to the ELPA Git
repository.

> >> and ideally also the list of users who have signed the CA.
> >
> > No can do, for privacy reasons.  You can always ask me or Stefan to
> > check a name for you, though.
>
> OK, but most of the time I don't have to check a single user but would
> like to see check a set of names to see how many have or haven't signed
> the CA.  Is that still a manageable effort on your end?

Yes, feel free.

Re: Changes to make in elpa-packages file for nongnu elpa
#306456
Author: Eli Zaretskii
Date: Wed, 09 Aug 2023 19:23
16 lines
572 bytes
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: michael.albinus@gmx.de,  emacs-devel@gnu.org,  monnier@iro.umontreal.ca
> Date: Wed, 09 Aug 2023 15:24:30 +0000
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > Maybe I'm misremembering, but AFAIR if you have write access to the
> > Emacs Git repository, you also have write access to the ELPA Git
> > repository.
>
> No I have access to emacs.git, elpa.git and nongnu.git, what I was
> referent to was the server associated with elpa.gnu.org.

Oh, you mean the server itself?  Then I think only Stefan can help
you.

Re: Changes to make in elpa-packages file for nongnu elpa
#306734
Author: Philip Kaluderci
Date: Tue, 15 Aug 2023 16:55
192 lines
7182 bytes
--=-=-=
Content-Type: text/plain

Philip Kaludercic <philipk@posteo.net> writes:

>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>> not another package. This is important especially nowaday people are
>>>> using "Emacs distribution" with the world list of packages installed.
>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>
>>> I see.  In that case is there any reason you implement this as a shell
>>> script?
>>
>> Well when I wrote the script, packages where not existing and from
>> outside emacs it is actually the only way to run a package isolated.
>>
>>> (It might be interesting to provide something like this for
>>> package.el, to test packages in a generic way.)
>>
>> Yes, this would be interesting, it would be something like this:
>>
>> Emacs -Q
>> M-x <A command that run a package alone, isolated from other
>> packages nuisances>
>
> I was actually thinking of a command like
>
> M-x package-isolate RET foo,bar,baz RET
>
> and a new instance of Emacs using -Q is spun up, with all the packages
> you have listed loaded, and nothing else... Sounds like a fun little
> weekend project ;^)

Here is my first attempt at providing this kind of a command.  Any
comments?


--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=0002-Add-command-to-start-Emacs-with-specific-packages.patch

From ae254f69f789ab4fa2b83bcf2cdc64291ae8aff6 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH 2/2] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package-isolate): Add command.
* etc/NEWS: Announce it.
---
 etc/NEWS                   |  6 +++++
 lisp/emacs-lisp/package.el | 50 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..c374695a571 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start Emacs only with specific packages
+The command 'package-isolate' is equivalent to starting Emacs with the
+-Q flag and loading specific packages (and their dependencies)
+manually.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..c0bbdacec84 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2625,6 +2625,56 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages)
+  "Start a new instance of Emacs and load only PACKAGES."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=))
+                  current-prefix-arg)))
+  (cl-assert (cl-every #'package-desc-p packages))
+  (let* ((name (concat "package-isolate-" (mapconcat #'package-desc-full-name
+                                                     packages ",")))
+         (tmp-init (make-temp-file name t))
+         (elpa (expand-file-name "elpa" tmp-init))
+         args)
+    (make-directory elpa)
+    (dolist (package packages)
+      ;; We need to recursively expand all the dependencies of the
+      ;; requested packages and all of them to `load-path'.
+      (dolist (package (named-let loop ((pkg-desc package))
+                         (let (deps)
+                           (dolist (req (package-desc-reqs pkg-desc))
+                             (setq deps (nconc
+                                         (catch 'found
+                                           (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                             (when (and (string= (car req) (package-desc-name p))
+                                                        (version-list-<= (cadr req) (package-desc-version p)))
+                                               (throw 'found (loop p)))))
+                                         deps)))
+                           (cons pkg-desc deps))))
+        (let* ((real (package-desc-dir package))
+               (link (expand-file-name (file-name-nondirectory real) elpa)))
+          (make-symbolic-link real link t)
+          (push (format "--directory=%s" link) args))
+        (let* ((load-suffixes '(".el" ".elc"))
+               (autoload (locate-library (package--autoloads-file-name package))))
+          (push (format "--load=%s" autoload) args))))
+    (apply #'start-process (concat "*" name "*") nil
+           (append (list (or (emacs-executable) "emacs")
+                         (format "--eval=%S"
+                                 '(progn
+                                    (require 'warnings)
+                                    (add-to-list 'warning-suppress-log-types 'initialization)))
+                         "--quick" "--debug-init"
+                         "--init-directory" tmp-init)
+                   args))))
+
 
 ;;;; Package description buffer.
 
-- 
2.39.2


--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=0001-Add-a-function-to-query-the-Emacs-executable.patch

From bc9ee566cb9fee337f94870aa718d9b5e57c007b Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:37:59 +0200
Subject: [PATCH 1/2] Add a function to query the Emacs executable

* src/emacs.c (Femacs_executable): Add new function.
(syms_of_emacs): Announce it.
---
 src/emacs.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/emacs.c b/src/emacs.c
index 687b8c7f81f..4869093ce09 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -3039,6 +3039,18 @@ DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 2, "P",
   exit (exit_code);
 }
 
+DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
+       doc: /* Return a string with the file name of the Emacs executable.
+If this is not known, nil will be returned instead. */)
+  (void)
+{
+  static Lisp_Object *string;
+  if (string)
+    return string;
+  if (initial_emacs_executable)
+    return string = build_string(initial_emacs_executable);
+  return Qnil;
+}
 
 /* Perform an orderly shutdown of Emacs.  Autosave any modified
    buffers, kill any child processes, clean up the terminal modes (if
@@ -3566,6 +3578,7 @@ syms_of_emacs (void)
 #endif
 
   defsubr (&Skill_emacs);
+  defsubr (&Semacs_executable);
 
   defsubr (&Sinvocation_name);
   defsubr (&Sinvocation_directory);
-- 
2.39.2


--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306738
Author: Eshel Yaron
Date: Tue, 15 Aug 2023 19:34
50 lines
1632 bytes
Hi Philip,

Philip Kaludercic <philipk@posteo.net> writes:

> Here is my first attempt at providing this kind of a command.  Any
> comments?

I haven't followed the thread very closely, but this looks quite useful!
A few minor suggestions:

> diff --git a/etc/NEWS b/etc/NEWS
> index 57f04609679..c374695a571 100644
> --- a/etc/NEWS
> +++ b/etc/NEWS
> @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
>  When non-nil, package specifications with side-effects for building
>  software will be used when building a package.
>
> +---
> +*** New command to start Emacs only with specific packages

This should probably end with a period.

> +The command 'package-isolate' is equivalent to starting Emacs with the
> +-Q flag and loading specific packages (and their dependencies)
> +manually.

I'd rephrase this as: "The command 'package-isolate' starts a new Emacs
instance with minimum customizations (similar to 'emacs -Q') and a given
set of packages (with their dependencies)."

> +(defun package-isolate (packages)
> +  "Start a new instance of Emacs and load only PACKAGES."

I'd clarify that the new instance disregards the user's
config/customizations, how about "Start a new Emacs instance with
minimum customizations and load PACKAGES."

> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
> +       doc: /* Return a string with the file name of the Emacs executable.
> +If this is not known, nil will be returned instead. */)

Maybe say "Return the file name of the Emacs executable, or nil if
unknown." to steer clear of the passive voice.


Best,

Eshel

Proposal for 'package-isolate' command
#306742
Author: Philip Kaluderci
Date: Tue, 15 Aug 2023 19:39
58 lines
1995 bytes
Eshel Yaron <me@eshelyaron.com> writes:

> Hi Philip,
>
> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Here is my first attempt at providing this kind of a command.  Any
>> comments?
>
> I haven't followed the thread very closely, but this looks quite useful!
> A few minor suggestions:

This is mostly a tangent, so the previous discussion is not that
relevant.  I've changed the subject accordingly.

>> diff --git a/etc/NEWS b/etc/NEWS
>> index 57f04609679..c374695a571 100644
>> --- a/etc/NEWS
>> +++ b/etc/NEWS
>> @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
>>  When non-nil, package specifications with side-effects for building
>>  software will be used when building a package.
>>
>> +---
>> +*** New command to start Emacs only with specific packages
>
> This should probably end with a period.
>
>> +The command 'package-isolate' is equivalent to starting Emacs with the
>> +-Q flag and loading specific packages (and their dependencies)
>> +manually.
>
> I'd rephrase this as: "The command 'package-isolate' starts a new Emacs
> instance with minimum customizations (similar to 'emacs -Q') and a given
> set of packages (with their dependencies)."
>
>> +(defun package-isolate (packages)
>> +  "Start a new instance of Emacs and load only PACKAGES."
>
> I'd clarify that the new instance disregards the user's
> config/customizations, how about "Start a new Emacs instance with
> minimum customizations and load PACKAGES."
>
>> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
>> +       doc: /* Return a string with the file name of the Emacs executable.
>> +If this is not known, nil will be returned instead. */)
>
> Maybe say "Return the file name of the Emacs executable, or nil if
> unknown." to steer clear of the passive voice.

Thanks, I obviously cannot write documentation.  I've addressed the
changes locally, and will send an updated patch in response to Eli's
message.

> Best,
>
> Eshel

Proposal for 'package-isolate' command
#306743
Author: Philip Kaluderci
Date: Tue, 15 Aug 2023 19:52
160 lines
6490 bytes
--=-=-=
Content-Type: text/plain

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: emacs-devel@gnu.org
>> Date: Tue, 15 Aug 2023 16:55:03 +0000
>> 
>> +*** New command to start Emacs only with specific packages
>> +The command 'package-isolate' is equivalent to starting Emacs with the
>> +-Q flag and loading specific packages (and their dependencies)
>> +manually.
>
> Seems strange to me to have a command to start another Emacs.  Why not
> implement this as a command-line option instead?  That would be
> consistent with the several options we already have, like -q, -Q, -D,
> which already contrl what happens at startup.

Mainly because this wouldn't support a completing-read interface, that
simplifies prompting the user for a set of packages.

But perhaps the bulk of this command could be implemented as a CLI
option, that this command could wrap?

>> +        (let* ((real (package-desc-dir package))
>> +               (link (expand-file-name (file-name-nondirectory real) elpa)))
>> +          (make-symbolic-link real link t)
>
> Using symbolic links makes the program less portable, so it is best to
> avoid them.

The reason I used them here, instead of just adding the directories
under ~/.config/emacs/elpa/ is that startup.el issues a warning along
the lines of

  Your `load-path' seems to contain your `user-emacs-directory' ...

My previous patch actually included the code that suppresses all
warnings during initialisation, so I've removed this hack.

>> +    (apply #'start-process (concat "*" name "*") nil
>> +           (append (list (or (emacs-executable) "emacs")
>
> I don't think it's a good idea to invoke just "emacs", it could be a
> completely different version of Emacs.
>
>> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
>> +       doc: /* Return a string with the file name of the Emacs executable.
>> +If this is not known, nil will be returned instead. */)
>> +  (void)
>
> I don't understand why you need this primitive.  What's wrong with the
> usual paradigm we use everywhere else:
>
>   (expand-file-name invocation-name invocation-directory)

Because I failed to remember it.  This also appears to not have the risk
of returning nil, as my proposed command could have.  I've applies these
and related changes below:


--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch

From 47dde2be5732ec9dfa153813649e385e0227751e Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package-isolate): Add command.
* etc/NEWS: Announce it.
---
 etc/NEWS                   |  6 +++++
 lisp/emacs-lisp/package.el | 47 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..c374695a571 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start Emacs only with specific packages
+The command 'package-isolate' is equivalent to starting Emacs with the
+-Q flag and loading specific packages (and their dependencies)
+manually.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..838b2823466 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2625,6 +2625,53 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages)
+  "Start an uncustomised Emacs and only load a set of PACKAGES."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=)))))
+  (cl-assert (cl-every #'package-desc-p packages))
+  (let* ((name (concat "package-isolate-" (mapconcat #'package-desc-full-name
+                                                     packages ",")))
+         (tmp-init (make-temp-file name t))
+         (elpa (expand-file-name "elpa" tmp-init))
+         args)
+    (make-directory elpa)
+    (dolist (package packages)
+      ;; We need to recursively expand all the dependencies of the
+      ;; requested packages and all of them to `load-path'.
+      (dolist (package (named-let loop ((pkg-desc package))
+                         (let (deps)
+                           (dolist (req (package-desc-reqs pkg-desc))
+                             (setq deps (nconc
+                                         (catch 'found
+                                           (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                             (when (and (string= (car req) (package-desc-name p))
+                                                        (version-list-<= (cadr req) (package-desc-version p)))
+                                               (throw 'found (loop p)))))
+                                         deps)))
+                           (cons pkg-desc deps))))
+        (push (format "--directory=%s" (package-desc-dir package)) args)
+        (let* ((load-suffixes '(".el" ".elc"))
+               (autoload (locate-library (package--autoloads-file-name package))))
+          (push (format "--load=%s" autoload) args))))
+    (apply #'start-process (concat "*" name "*") nil
+           (append (list (expand-file-name invocation-name invocation-directory)
+                         "--quick" "--debug-init"
+                         (format "--eval=%S"
+                                 '(progn
+                                    (require 'warnings)
+                                    (add-to-list 'warning-suppress-log-types 'initialization)))
+                         "--init-directory" tmp-init)
+                   args))
+    (message "Started Emacs with the init directory: %s" tmp-init)))
+
 
 ;;;; Package description buffer.
 
-- 
2.39.2


--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306740
Author: Eli Zaretskii
Date: Tue, 15 Aug 2023 21:56
37 lines
1471 bytes
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: emacs-devel@gnu.org
> Date: Tue, 15 Aug 2023 16:55:03 +0000
>
> +*** New command to start Emacs only with specific packages
> +The command 'package-isolate' is equivalent to starting Emacs with the
> +-Q flag and loading specific packages (and their dependencies)
> +manually.

Seems strange to me to have a command to start another Emacs.  Why not
implement this as a command-line option instead?  That would be
consistent with the several options we already have, like -q, -Q, -D,
which already contrl what happens at startup.

> +        (let* ((real (package-desc-dir package))
> +               (link (expand-file-name (file-name-nondirectory real) elpa)))
> +          (make-symbolic-link real link t)

Using symbolic links makes the program less portable, so it is best to
avoid them.

> +    (apply #'start-process (concat "*" name "*") nil
> +           (append (list (or (emacs-executable) "emacs")

I don't think it's a good idea to invoke just "emacs", it could be a
completely different version of Emacs.

> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
> +       doc: /* Return a string with the file name of the Emacs executable.
> +If this is not known, nil will be returned instead. */)
> +  (void)

I don't understand why you need this primitive.  What's wrong with the
usual paradigm we use everywhere else:

  (expand-file-name invocation-name invocation-directory)

Re: Changes to make in elpa-packages file for nongnu elpa
#306770
Author: Thierry Volpiatt
Date: Wed, 16 Aug 2023 06:51
106 lines
4079 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>> not another package. This is important especially nowaday people are
>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>
>>>> I see.  In that case is there any reason you implement this as a shell
>>>> script?
>>>
>>> Well when I wrote the script, packages where not existing and from
>>> outside emacs it is actually the only way to run a package isolated.
>>>
>>>> (It might be interesting to provide something like this for
>>>> package.el, to test packages in a generic way.)
>>>
>>> Yes, this would be interesting, it would be something like this:
>>>
>>> Emacs -Q
>>> M-x <A command that run a package alone, isolated from other
>>> packages nuisances>
>>
>> I was actually thinking of a command like
>>
>> M-x package-isolate RET foo,bar,baz RET
>>
>> and a new instance of Emacs using -Q is spun up, with all the packages
>> you have listed loaded, and nothing else... Sounds like a fun little
>> weekend project ;^)
>
> Here is my first attempt at providing this kind of a command.  Any
> comments?

Why not reusing package.el functions?
Why do you want to start in an isolated elpa directory?
Isn't something like this suffice? (just missing to fallback to CRM when
helm is not available)

    (defun package-isolate (packages)
      "Start an uncustomised Emacs and only load a set of PACKAGES."
      (interactive
       (list (let ((helm-comp-read-use-marked t))
               (completing-read "Packages: " (mapcar #'car (package--alist))))))
      (let* ((name (concat "package-isolate-" (mapconcat #'identity
                                                         packages ",")))
             (deps (cl-loop for p in packages
                            for sym = (intern p)
                            append (package--dependencies sym))))
        (apply #'start-process (concat "*" name "*") nil
               (list (file-truename (expand-file-name invocation-name invocation-directory))
                     "--quick" "--debug-init"
                     (format "--eval=%S"
                             `(progn
                               (require 'warnings)
                               (add-to-list 'warning-suppress-log-types 'initialization)
                               (require 'package)
                               (setq package-load-list
                                ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
                                          (mapcar (lambda (p) (list p t)) deps)))
                               (package-initialize)))))))

> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>
> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...


-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTccvATHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1ygDACQjOkhf/kbIQqywOFimox8EeTue3xD
PbQrnPWhcVPq803EYsvKlvAzaGOxR573DwHAvMHYVcocAh+GCBsGLli9bPqM/jVz
eNMl42Smf4tjiz4jInzTL3O9Uc+FezmJPl8kQ2NceD4IdztO9EbAYiKSztllD1II
/20MhQunhoJndvEyeX0iJta4Q7LyB+dixbKprMT0AYw1swOtMcAPOrsYWsv7HVzV
Q3W+VW/JrPi420mhpPCqvYOJVdU/Ep+vJ+u+mCGT/uISQo9fjjeODLVH8+YXj/6V
0lcX5NuWuoC025g7OSHPtUcinhKc9HLXzDZhyrR/REq3I1t/GwmxpBwrwPP8zRvh
HgSzH7JQJjKgj2t7VkECgq1BTReXpufdRZ684a4q6Ww4kl6xCWs9uagqUmE/TPGi
cJj8xw6TUUWrZJ99jQ1H2YNMtpd0zwdv5u9j7E998k8wjfZ3MhD7Ty2s5HCQpqLe
Q6CTG9X1vJ25H5PkHfj+8eCFuOoE1oJo3tY=yVjR
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306775
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 10:10
238 lines
10586 bytes
--=-=-=
Content-Type: text/plain

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>> not another package. This is important especially nowaday people are
>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>
>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>> script?
>>>>
>>>> Well when I wrote the script, packages where not existing and from
>>>> outside emacs it is actually the only way to run a package isolated.
>>>>
>>>>> (It might be interesting to provide something like this for
>>>>> package.el, to test packages in a generic way.)
>>>>
>>>> Yes, this would be interesting, it would be something like this:
>>>>
>>>> Emacs -Q
>>>> M-x <A command that run a package alone, isolated from other
>>>> packages nuisances>
>>>
>>> I was actually thinking of a command like
>>>
>>> M-x package-isolate RET foo,bar,baz RET
>>>
>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>> you have listed loaded, and nothing else... Sounds like a fun little
>>> weekend project ;^)
>>
>> Here is my first attempt at providing this kind of a command.  Any
>> comments?
>
> Why not reusing package.el functions?
> Why do you want to start in an isolated elpa directory?
> Isn't something like this suffice? (just missing to fallback to CRM when
> helm is not available)

I don't know much about Helm, but does it not support CRM?

>     (defun package-isolate (packages)
>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>       (interactive
>        (list (let ((helm-comp-read-use-marked t))
>                (completing-read "Packages: " (mapcar #'car (package--alist))))))

This doesn't allow selecting specific package versions, in case multiple
are installed (which might easily happen if you use package-vc).  I
stole the code in my patch from package-delete, and I guess it would be
possible to generalise it into a utility function.

>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>                                                          packages ",")))

This doesn't work, because the above returns a string, not a list of strings.

>              (deps (cl-loop for p in packages
>                             for sym = (intern p)
>                             append (package--dependencies sym))))
>         (apply #'start-process (concat "*" name "*") nil
>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>                      "--quick" "--debug-init"
>                      (format "--eval=%S"
>                              `(progn
>                                (require 'warnings)
>                                (add-to-list 'warning-suppress-log-types 'initialization)
>                                (require 'package)
>                                (setq package-load-list
>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>                                           (mapcar (lambda (p) (list p t)) deps)))
>                                (package-initialize)))))))

This is actually a good idea, assuming there are no issues with lexical
scoping that might arise from --eval.  I didn't think of using
package-load-list here, but it seems that this only works if we don't
add --init-directory, because otherwise the elpa/ directory is not
populated.  It seems to me, that for a proper isolated environment, we
should add a --init-directory option.  This is easy to fix though, we
just need to specify `package-user-dir' at startup.  Here is my updated
patch, merging our approaches:


--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch

From 6ae48d6d28112d487ea09ca905814da47c2a26cf Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package--dependencies): Extend function
to handle and return package descriptors.
(package-isolate): Add new command.
* etc/NEWS: Announce new command.
---
 etc/NEWS                   |  6 ++++
 lisp/emacs-lisp/package.el | 57 ++++++++++++++++++++++++++++++++++----
 2 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..c374695a571 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start Emacs only with specific packages
+The command 'package-isolate' is equivalent to starting Emacs with the
+-Q flag and loading specific packages (and their dependencies)
+manually.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..9e969ce1024 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2330,12 +2330,26 @@ package-upgrade-all
       (mapc #'package-upgrade upgradeable))))
 
 (defun package--dependencies (pkg)
-  "Return a list of all dependencies PKG has.
-This is done recursively."
-  ;; Can we have circular dependencies?  Assume "nope".
-  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
-              (deps (mapcar #'car (package-desc-reqs desc))))
-    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
+  "Return a list of all recursive dependencies of PKG.
+If PKG is a package descriptor, the return value will consist of
+a list of package descriptors.  If PKG is a symbol, designating a
+package, the return value will be a list of symbols designating
+packages."
+  (when-let* ((desc (if (package-desc-p pkg) pkg
+                      (cadr (assq pkg package-archive-contents)))))
+    ;; Can we have circular dependencies?  Assume "nope".
+    (let ((all (named-let more ((pkg-desc desc))
+                 (let (deps)
+                   (dolist (req (package-desc-reqs pkg-desc))
+                     (setq deps (nconc
+                                 (catch 'found
+                                   (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                     (when (and (string= (car req) (package-desc-name p))
+                                                (version-list-<= (cadr req) (package-desc-version p)))
+                                       (throw 'found (more p)))))
+                                 deps)))
+                   (delete-dups (cons pkg-desc deps))))))
+      (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all)))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.
@@ -2625,6 +2639,37 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages)
+  "Start an uncustomised Emacs and only load a set of PACKAGES."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=)))))
+  (let* ((name (concat "package-isolate-"
+                       (mapconcat #'package-desc-full-name packages ",")))
+         package-load-list)
+    (dolist (package (append packages (mapcan #'package--dependencies packages)))
+      (push (list (package-desc-name package)
+                  (package-version-join (package-desc-version package)))
+              package-load-list))
+    (apply #'start-process (concat "*" name "*") nil
+           (list (expand-file-name invocation-name invocation-directory)
+                 "--quick" "--debug-init"
+                 "--init-directory" (make-temp-file name t)
+                 (format "--eval=%S"
+                         `(progn
+                            (require 'warnings)
+                            (add-to-list 'warning-suppress-log-types 'initialization)
+                            (require 'package)
+                            (setq package-user-dir ,(expand-file-name package-user-dir)
+                                  package-load-list ',package-load-list)
+                            (package-initialize)))))))
+
 
 ;;;; Package description buffer.
 
-- 
2.39.2


--=-=-=
Content-Type: text/plain


>> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>
>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...

I have slightly modified your version, fixing issues I had, in case
anyone else wants to try it out:

        (defun package-isolate (packages)
          "Start an uncustomised Emacs and only load a set of PACKAGES."
          (interactive
           (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
          (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
                 (deps (mapcan #'package--dependencies packages)))
            (apply #'start-process (concat "*" name "*") nil
                   (list (file-truename (expand-file-name invocation-name invocation-directory))
                         "--quick" "--debug-init"
                         (format "--eval=%S"
                                 `(progn
                                    (require 'warnings)
                                    (add-to-list 'warning-suppress-log-types 'initialization)
                                    (require 'package)
                                    (setq package-load-list
                                          ',(mapcar (lambda (p) (list p t)) (append packages deps)))
                                    (package-initialize)))))))

--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306777
Author: Thierry Volpiatt
Date: Wed, 16 Aug 2023 10:14
182 lines
7038 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>>> not another package. This is important especially nowaday people are
>>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>>
>>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>>> script?
>>>>>
>>>>> Well when I wrote the script, packages where not existing and from
>>>>> outside emacs it is actually the only way to run a package isolated.
>>>>>
>>>>>> (It might be interesting to provide something like this for
>>>>>> package.el, to test packages in a generic way.)
>>>>>
>>>>> Yes, this would be interesting, it would be something like this:
>>>>>
>>>>> Emacs -Q
>>>>> M-x <A command that run a package alone, isolated from other
>>>>> packages nuisances>
>>>>
>>>> I was actually thinking of a command like
>>>>
>>>> M-x package-isolate RET foo,bar,baz RET
>>>>
>>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>>> you have listed loaded, and nothing else... Sounds like a fun little
>>>> weekend project ;^)
>>>
>>> Here is my first attempt at providing this kind of a command.  Any
>>> comments?
>>
>> Why not reusing package.el functions?
>> Why do you want to start in an isolated elpa directory?
>> Isn't something like this suffice? (just missing to fallback to CRM when
>> helm is not available)
>
> I don't know much about Helm, but does it not support CRM?

It does, but this is a much better interface than CRM.

>>     (defun package-isolate (packages)
>>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>>       (interactive
>>        (list (let ((helm-comp-read-use-marked t))
>>                (completing-read "Packages: " (mapcar #'car (package--alist))))))
>
> This doesn't allow selecting specific package versions, in case multiple
> are installed (which might easily happen if you use package-vc).  I
> stole the code in my patch from package-delete, and I guess it would be
> possible to generalise it into a utility function.

Ok, I don't know much how package-vc works.

>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>                                                          packages ",")))
>
> This doesn't work, because the above returns a string, not a list of strings.

No, it works, the above returns a list of strings (the completing-read
allows marking and returns always a list).

>>              (deps (cl-loop for p in packages
>>                             for sym = (intern p)
>>                             append (package--dependencies sym))))
>>         (apply #'start-process (concat "*" name "*") nil
>>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>>                      "--quick" "--debug-init"
>>                      (format "--eval=%S"
>>                              `(progn
>>                                (require 'warnings)
>>                                (add-to-list 'warning-suppress-log-types 'initialization)
>>                                (require 'package)
>>                                (setq package-load-list
>>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>>                                           (mapcar (lambda (p) (list p t)) deps)))
>>                                (package-initialize)))))))
>
> This is actually a good idea, assuming there are no issues with lexical
> scoping that might arise from --eval.  I didn't think of using
> package-load-list here, but it seems that this only works if we don't
> add --init-directory, because otherwise the elpa/ directory is not
> populated.

Yes of course.

> It seems to me, that for a proper isolated environment, we should add
> a --init-directory option.

Why as long as other directories in elpa are not in load-path?

> This is easy to fix though, we just need to specify `package-user-dir'
> at startup.  Here is my updated patch, merging our approaches:
>
> [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
>
>
>>> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>
>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...
>
> I have slightly modified your version, fixing issues I had, in case
> anyone else wants to try it out:

Thanks, sorry to not provide the CRM, I quickly wrote this.

>         (defun package-isolate (packages)
>           "Start an uncustomised Emacs and only load a set of PACKAGES."
>           (interactive
>            (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
>           (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
>                  (deps (mapcan #'package--dependencies packages)))
>             (apply #'start-process (concat "*" name "*") nil
>                    (list (file-truename (expand-file-name invocation-name invocation-directory))
>                          "--quick" "--debug-init"
>                          (format "--eval=%S"
>                                  `(progn
>                                     (require 'warnings)
>                                     (add-to-list 'warning-suppress-log-types 'initialization)
>                                     (require 'package)
>                                     (setq package-load-list
>                                           ',(mapcar (lambda (p) (list p t)) (append packages deps)))
>                                     (package-initialize)))))))


-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTcpb8THHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1PWC/9k5VNP9khVxozlrzHaX7LcdgNgaqV4
eTygQ84ucVAQC0tG/tdprxY5FKyfyOTqBGOr6oGEvMRszEMGz66T1lqQXvZFMwl9
4YAwLavrns5qYgsw4UFbppsEjfJnzV4HwYBW304vMRz93xWXPkuvwhUp0r1Ja1N+
l4GYHX0gFNGFO8EIwiyyX5njAkMMAtPdED1Xg1PCgkLFvR+zIvOwE45azhmp6mE9
zz8hgWam3el9+lTvVVGydqqeXIYGk3FLBBPNaiFL9gTTwffqOOsrJiBNJuoPnqou
vG6DSkmC2Sjz9DWZXVkNLa6ocvUZsT7J4iRg+V7G8Ye7Fa0awNbccp3KkmuH6/v+
bIwdmHPwFw1SPd1gZ1wg5jYZmYJ03evohvQK/iecreErwTbDs0P1dl/JXR9qI0Hx
627s8deL/7kOEr+yEpD8WdPkQA7+Pg9t+bJzapH/S01Giu8SnCqwGtXH13k82dV8
a5fHCImiR0MKELHQIHUOuTqhZ6kWppCe5Ik=+DMA
-----END PGP SIGNATURE-----
--=-=-=--

Re: Changes to make in elpa-packages file for nongnu elpa
#306780
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 11:03
163 lines
7283 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>>>> not another package. This is important especially nowaday people are
>>>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin.
>>>>>>>
>>>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>>>> script?
>>>>>>
>>>>>> Well when I wrote the script, packages where not existing and from
>>>>>> outside emacs it is actually the only way to run a package isolated.
>>>>>>
>>>>>>> (It might be interesting to provide something like this for
>>>>>>> package.el, to test packages in a generic way.)
>>>>>>
>>>>>> Yes, this would be interesting, it would be something like this:
>>>>>>
>>>>>> Emacs -Q
>>>>>> M-x <A command that run a package alone, isolated from other
>>>>>> packages nuisances>
>>>>>
>>>>> I was actually thinking of a command like
>>>>>
>>>>> M-x package-isolate RET foo,bar,baz RET
>>>>>
>>>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>>>> you have listed loaded, and nothing else... Sounds like a fun little
>>>>> weekend project ;^)
>>>>
>>>> Here is my first attempt at providing this kind of a command.  Any
>>>> comments?
>>>
>>> Why not reusing package.el functions?
>>> Why do you want to start in an isolated elpa directory?
>>> Isn't something like this suffice? (just missing to fallback to CRM when
>>> helm is not available)
>>
>> I don't know much about Helm, but does it not support CRM?
>
> It does, but this is a much better interface than CRM.

I don't think it makes sense to add support like this in the core, but
is there something we should keep in mind to not hinder integration with
Helm?

>>>     (defun package-isolate (packages)
>>>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>>>       (interactive
>>>        (list (let ((helm-comp-read-use-marked t))
>>>                (completing-read "Packages: " (mapcar #'car (package--alist))))))
>>
>> This doesn't allow selecting specific package versions, in case multiple
>> are installed (which might easily happen if you use package-vc).  I
>> stole the code in my patch from package-delete, and I guess it would be
>> possible to generalise it into a utility function.
>
> Ok, I don't know much how package-vc works.

I can have a classical tarball package installed next to a VC package,
just like you can have a built-in package or a system package, and it
makes sense to be able to decide which one to isolate.

>>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>>                                                          packages ",")))
>>
>> This doesn't work, because the above returns a string, not a list of strings.
>
> No, it works, the above returns a list of strings (the completing-read
> allows marking and returns always a list).

Not in my case, I got a type error.

>>>              (deps (cl-loop for p in packages
>>>                             for sym = (intern p)
>>>                             append (package--dependencies sym))))
>>>         (apply #'start-process (concat "*" name "*") nil
>>>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>>>                      "--quick" "--debug-init"
>>>                      (format "--eval=%S"
>>>                              `(progn
>>>                                (require 'warnings)
>>>                                (add-to-list 'warning-suppress-log-types 'initialization)
>>>                                (require 'package)
>>>                                (setq package-load-list
>>>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>>>                                           (mapcar (lambda (p) (list p t)) deps)))
>>>                                (package-initialize)))))))
>>
>> This is actually a good idea, assuming there are no issues with lexical
>> scoping that might arise from --eval.  I didn't think of using
>> package-load-list here, but it seems that this only works if we don't
>> add --init-directory, because otherwise the elpa/ directory is not
>> populated.
>
> Yes of course.
>
>> It seems to me, that for a proper isolated environment, we should add
>> a --init-directory option.
>
> Why as long as other directories in elpa are not in load-path?

Mainly to avoid issues with packages that might place files in the
configuration directory, which might hinder the reproduction of bugs.

Upon reflection, my approach might have an issue if the user wishes to
install a package, for the sake of testing within the isolated
environment.  Perhaps it would be better to set `package-directory-list'
instead?

Also, would it make sense to have some visual/textual indication that
this is a testing environment?  Perhaps the *scratch* buffer string
could be modified or the default background colour could be set to
something else.

>> This is easy to fix though, we just need to specify `package-user-dir'
>> at startup.  Here is my updated patch, merging our approaches:
>>
>> [2. text/x-diff;
>> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>
>>
>>>> [2. text/x-diff;
>>>> 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>>
>>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...
>>
>> I have slightly modified your version, fixing issues I had, in case
>> anyone else wants to try it out:
>
> Thanks, sorry to not provide the CRM, I quickly wrote this.

np.

>>         (defun package-isolate (packages)
>>           "Start an uncustomised Emacs and only load a set of PACKAGES."
>>           (interactive
>>            (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
>>           (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
>>                  (deps (mapcan #'package--dependencies packages)))
>>             (apply #'start-process (concat "*" name "*") nil
>>                    (list (file-truename (expand-file-name invocation-name invocation-directory))
>>                          "--quick" "--debug-init"
>>                          (format "--eval=%S"
>>                                  `(progn
>>                                     (require 'warnings)
>>                                     (add-to-list 'warning-suppress-log-types 'initialization)
>>                                     (require 'package)
>>                                     (setq package-load-list
>>                                           ',(mapcar (lambda (p) (list p t)) (append packages deps)))
>>                                     (package-initialize)))))))

Re: Changes to make in elpa-packages file for nongnu elpa
#306783
Author: Thierry Volpiatt
Date: Wed, 16 Aug 2023 11:55
240 lines
9037 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>>
>>>>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>>>>> not another package. This is important especially nowaday people are
>>>>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>>>>
>>>>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>>>>> script?
>>>>>>>
>>>>>>> Well when I wrote the script, packages where not existing and from
>>>>>>> outside emacs it is actually the only way to run a package isolated.
>>>>>>>
>>>>>>>> (It might be interesting to provide something like this for
>>>>>>>> package.el, to test packages in a generic way.)
>>>>>>>
>>>>>>> Yes, this would be interesting, it would be something like this:
>>>>>>>
>>>>>>> Emacs -Q
>>>>>>> M-x <A command that run a package alone, isolated from other
>>>>>>> packages nuisances>
>>>>>>
>>>>>> I was actually thinking of a command like
>>>>>>
>>>>>> M-x package-isolate RET foo,bar,baz RET
>>>>>>
>>>>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>>>>> you have listed loaded, and nothing else... Sounds like a fun little
>>>>>> weekend project ;^)
>>>>>
>>>>> Here is my first attempt at providing this kind of a command.  Any
>>>>> comments?
>>>>
>>>> Why not reusing package.el functions?
>>>> Why do you want to start in an isolated elpa directory?
>>>> Isn't something like this suffice? (just missing to fallback to CRM when
>>>> helm is not available)
>>>
>>> I don't know much about Helm, but does it not support CRM?
>>
>> It does, but this is a much better interface than CRM.
>
> I don't think it makes sense to add support like this in the core,

Perhaps yes. However it doesn't requires helm:

     (let ((helm-comp-read-use-marked t))
        (if (and (boundp 'helm-mode) helm-mode)
            (completing-read ...)
          (completing-read-multiple ...)

> but is there something we should keep in mind to not hinder
> integration with Helm?

No don't worry, helm will work in any cases, thanks.

>>>>     (defun package-isolate (packages)
>>>>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>>>>       (interactive
>>>>        (list (let ((helm-comp-read-use-marked t))
>>>>                (completing-read "Packages: " (mapcar #'car (package--alist))))))
>>>
>>> This doesn't allow selecting specific package versions, in case multiple
>>> are installed (which might easily happen if you use package-vc).  I
>>> stole the code in my patch from package-delete, and I guess it would be
>>> possible to generalise it into a utility function.
>>
>> Ok, I don't know much how package-vc works.
>
> I can have a classical tarball package installed next to a VC package,
> just like you can have a built-in package or a system package, and it
> makes sense to be able to decide which one to isolate.

Ok, I understand.

>>>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>>>                                                          packages ",")))
>>>
>>> This doesn't work, because the above returns a string, not a list of strings.
>>
>> No, it works, the above returns a list of strings (the completing-read
>> allows marking and returns always a list).
>
> Not in my case, I got a type error.

Yes, because the let-bounded var had no effect in your case, otherwise
when helm is installed and helm-mode enabled the completing-read will
always return a list.

>>>>              (deps (cl-loop for p in packages
>>>>                             for sym = (intern p)
>>>>                             append (package--dependencies sym))))
>>>>         (apply #'start-process (concat "*" name "*") nil
>>>>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>>>>                      "--quick" "--debug-init"
>>>>                      (format "--eval=%S"
>>>>                              `(progn
>>>>                                (require 'warnings)
>>>>                                (add-to-list 'warning-suppress-log-types 'initialization)
>>>>                                (require 'package)
>>>>                                (setq package-load-list
>>>>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>>>>                                           (mapcar (lambda (p) (list p t)) deps)))
>>>>                                (package-initialize)))))))
>>>
>>> This is actually a good idea, assuming there are no issues with lexical
>>> scoping that might arise from --eval.  I didn't think of using
>>> package-load-list here, but it seems that this only works if we don't
>>> add --init-directory, because otherwise the elpa/ directory is not
>>> populated.
>>
>> Yes of course.
>>
>>> It seems to me, that for a proper isolated environment, we should add
>>> a --init-directory option.
>>
>> Why as long as other directories in elpa are not in load-path?
>
> Mainly to avoid issues with packages that might place files in the
> configuration directory, which might hinder the reproduction of bugs.

Hmm, maybe, I don't have an example in mind though.

> Upon reflection, my approach might have an issue if the user wishes to
> install a package, for the sake of testing within the isolated
> environment.

Yes, one more reason to use the original elpa dir ;-)

> Perhaps it would be better to set `package-directory-list' instead?

Don't know yet.

> Also, would it make sense to have some visual/textual indication that
> this is a testing environment?  Perhaps the *scratch* buffer string
> could be modified or the default background colour could be set to
> something else.

No particular opinions about this.

>>> This is easy to fix though, we just need to specify `package-user-dir'
>>> at startup.  Here is my updated patch, merging our approaches:
>>>
>>> [2. text/x-diff;
>>> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>
>>>
>>>>> [2. text/x-diff;
>>>>> 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>>>
>>>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...
>>>
>>> I have slightly modified your version, fixing issues I had, in case
>>> anyone else wants to try it out:
>>
>> Thanks, sorry to not provide the CRM, I quickly wrote this.
>
> np.
>
>>>         (defun package-isolate (packages)
>>>           "Start an uncustomised Emacs and only load a set of PACKAGES."
>>>           (interactive
>>>            (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
>>>           (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
>>>                  (deps (mapcan #'package--dependencies packages)))
>>>             (apply #'start-process (concat "*" name "*") nil
>>>                    (list (file-truename (expand-file-name invocation-name invocation-directory))
>>>                          "--quick" "--debug-init"
>>>                          (format "--eval=%S"
>>>                                  `(progn
>>>                                     (require 'warnings)
>>>                                     (add-to-list 'warning-suppress-log-types 'initialization)
>>>                                     (require 'package)
>>>                                     (setq package-load-list
>>>                                           ',(mapcar (lambda (p) (list p t)) (append packages deps)))
>>>                                     (package-initialize)))))))


-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTcvDYTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1THC/wNxzRzRcWKSOX2gG+BOJ/nt7KxcZsw
1giKsjmiBeSR1v1oHaSfZB6Khb1/o08/XwXi0IC9aTfPrrPBy+drqDC0zBA2qLUW
p06PJIpeLOv/Dqbale8+Y4tfJFQ8h9vqc5if9hZ/5/iHY77jTq3ZO8GXaUODdjZi
T74xUqjwcHCebMQA9us1yWynvMUCPj9ZSXSXRLGg7Z5W0rKODmbYs3gwSiP1e/Ym
xQJ0AJg85kFamRPh7WiemiG5sBPQozdcLQWGUXy+vixop3csjVUu8lSNM9ubchZO
TV2bYOIhiBPZaDMEU4nCml0H+OUEEYr5BAm8tLcr82AM2YdrCzjPvIdUH2KXbBJ8
PHDFsNIqJeR0ndhCwy8B1fxe4y8TWKQeLTYGo/Jp9IGA3Gb2SCbfPln/q7Z3V9eO
koB3RxtmvvBQlaLKZl1jEfC4P3TV+MeLVfqr4ImhceR+ioCikHkzwoimiaBfKOLd
BvJOaiEVMhRiQqj7VnidVCkmUmjQf/dOy8o=vWve
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306781
Author: Eli Zaretskii
Date: Wed, 16 Aug 2023 14:25
47 lines
2022 bytes
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: thievol@posteo.net,  emacs-devel@gnu.org
> Date: Tue, 15 Aug 2023 19:52:32 +0000
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > Seems strange to me to have a command to start another Emacs.  Why not
> > implement this as a command-line option instead?  That would be
> > consistent with the several options we already have, like -q, -Q, -D,
> > which already contrl what happens at startup.
>
> Mainly because this wouldn't support a completing-read interface, that
> simplifies prompting the user for a set of packages.

Shells can complete as well, right?  And once you typed the command
once, shells have features to help you invoke commands from history,
so you won't need to retype it more than once.

> But perhaps the bulk of this command could be implemented as a CLI
> option, that this command could wrap?

Maybe.  But again, it's strange to have to launch another process from
Emacs for such a simple functionality.  And if the number of packages
to load is large, typing them manually would be annoying anyway, so
people will probably store the list in a file or something?  So maybe
we should allow specifying a file with the list of packages as well?

> >> +          (make-symbolic-link real link t)
> >
> > Using symbolic links makes the program less portable, so it is best to
> > avoid them.
>
> The reason I used them here, instead of just adding the directories
> under ~/.config/emacs/elpa/ is that startup.el issues a warning along
> the lines of
>
>   Your `load-path' seems to contain your `user-emacs-directory' ...
>
> My previous patch actually included the code that suppresses all
> warnings during initialisation, so I've removed this hack.

I don't understand how this is different from a "normal" startup of
Emacs with all the packages.  Here, you just want to load part of the
packages that are loaded normally, so why does this warning pop up in
this case, but not when Emacs starts "normally"?  I'm probably missing
something.

Re: Changes to make in elpa-packages file for nongnu elpa
#306792
Author: Eli Zaretskii
Date: Wed, 16 Aug 2023 17:10
22 lines
931 bytes
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: emacs-devel@gnu.org
> Date: Wed, 16 Aug 2023 10:10:46 +0000
>
> +---
> +*** New command to start Emacs only with specific packages
> +The command 'package-isolate' is equivalent to starting Emacs with the
> +-Q flag and loading specific packages (and their dependencies)
> +manually.

If this is how this feature is going to be implemented, I suggest to
reword this NEWS entry to make the intent and the feature easier to
understand:

  *** New command to start an inferior Emacs loading only specific packages.
  The new command 'package-isolate' will start a new Emacs process, as
  a sub-process of Emacs where you invoke the command, in a way that
  causes the new process to load only some of the installed packages.
  The command prompts for the packages to activate in this
  sub-process, and is intended for testing Emacs and/or the packages
  in a clean environment.

Proposal for 'package-isolate' command
#306802
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 18:34
92 lines
3061 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

>>>> I don't know much about Helm, but does it not support CRM?
>>>
>>> It does, but this is a much better interface than CRM.
>>
>> I don't think it makes sense to add support like this in the core,
>
> Perhaps yes. However it doesn't requires helm:
>
>      (let ((helm-comp-read-use-marked t))
>         (if (and (boundp 'helm-mode) helm-mode)
>             (completing-read ...)
>           (completing-read-multiple ...)
>
>> but is there something we should keep in mind to not hinder
>> integration with Helm?
>
> No don't worry, helm will work in any cases, thanks.

OK, in that case I'd prefer to keep it the way it is.


[...]

>>>>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>>>>                                                          packages ",")))
>>>>
>>>> This doesn't work, because the above returns a string, not a list of strings.
>>>
>>> No, it works, the above returns a list of strings (the completing-read
>>> allows marking and returns always a list).
>>
>> Not in my case, I got a type error.
>
> Yes, because the let-bounded var had no effect in your case, otherwise
> when helm is installed and helm-mode enabled the completing-read will
> always return a list.

Right, but that is the issue here, because using completing-read,
especially in the core, shouldn't make any assumptions like that.  In
the end this boils down to the fact that completing-read and co. are a
over-burned interface...

[...]

>>>> It seems to me, that for a proper isolated environment, we should add
>>>> a --init-directory option.
>>>
>>> Why as long as other directories in elpa are not in load-path?
>>
>> Mainly to avoid issues with packages that might place files in the
>> configuration directory, which might hinder the reproduction of bugs.
>
> Hmm, maybe, I don't have an example in mind though.

It might not be the best example, but my package autocrypt generates a
file in the `user-emacs-directory'.  If we don't use --init-directory,
the existing file would be re-used.

>> Upon reflection, my approach might have an issue if the user wishes to
>> install a package, for the sake of testing within the isolated
>> environment.
>
> Yes, one more reason to use the original elpa dir ;-)

No, because in that case the package installed in the temporary
environment would be retained in the original elpa/ directory, which I
think we /don't/ want.

>> Perhaps it would be better to set `package-directory-list' instead?
>
> Don't know yet.

Even better, I have added all directories that
`package-load-all-descriptors' would load to `package-directory-list',
which should be more robust.

>> Also, would it make sense to have some visual/textual indication that
>> this is a testing environment?  Perhaps the *scratch* buffer string
>> could be modified or the default background colour could be set to
>> something else.
>
> No particular opinions about this.

I guess this is too controversial.  Perhaps just adjusting
`frame-title-format' would be enough.


[...]


Re: Proposal for 'package-isolate' command
#306803
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 18:48
69 lines
2861 bytes
Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: thievol@posteo.net,  emacs-devel@gnu.org
>> Date: Tue, 15 Aug 2023 19:52:32 +0000
>>
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>> > Seems strange to me to have a command to start another Emacs.  Why not
>> > implement this as a command-line option instead?  That would be
>> > consistent with the several options we already have, like -q, -Q, -D,
>> > which already contrl what happens at startup.
>>
>> Mainly because this wouldn't support a completing-read interface, that
>> simplifies prompting the user for a set of packages.
>
> Shells can complete as well, right?  And once you typed the command
> once, shells have features to help you invoke commands from history,
> so you won't need to retype it more than once.

Each shell requires individual completion support, and figuring out what
packages are installed outside of Emacs to ensure input like
"magit-3.3.0,corfu-0.37" is well formed, seems too much work to me.

What would be reasonable, might be a function that could be invoked from
batch mode.

  emacs -Q --batch -f package-isolate-batch magit corfu

>> But perhaps the bulk of this command could be implemented as a CLI
>> option, that this command could wrap?
>
> Maybe.  But again, it's strange to have to launch another process from
> Emacs for such a simple functionality.  And if the number of packages
> to load is large, typing them manually would be annoying anyway, so
> people will probably store the list in a file or something?  So maybe
> we should allow specifying a file with the list of packages as well?

I don't know how this package would be used, but the way I imagine it is
that a package maintainer asks the user to run

  M-x package-isolate RET foo-1.2.3 RET

with only a few packages, to make the reproduction of bugs easier, as
is the case with Helm, which is what prompted this tangent.

>> >> +          (make-symbolic-link real link t)
>> >
>> > Using symbolic links makes the program less portable, so it is best to
>> > avoid them.
>>
>> The reason I used them here, instead of just adding the directories
>> under ~/.config/emacs/elpa/ is that startup.el issues a warning along
>> the lines of
>>
>>   Your `load-path' seems to contain your `user-emacs-directory' ...
>>
>> My previous patch actually included the code that suppresses all
>> warnings during initialisation, so I've removed this hack.
>
> I don't understand how this is different from a "normal" startup of
> Emacs with all the packages.  Here, you just want to load part of the
> packages that are loaded normally, so why does this warning pop up in
> this case, but not when Emacs starts "normally"?  I'm probably missing
> something.

The point is moot anyway, since the approach that Thierry proposed
circumvents the issue to begin with.

Re: Changes to make in elpa-packages file for nongnu elpa
#306805
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 18:52
26 lines
1059 bytes
Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: emacs-devel@gnu.org
>> Date: Wed, 16 Aug 2023 10:10:46 +0000
>>
>> +---
>> +*** New command to start Emacs only with specific packages
>> +The command 'package-isolate' is equivalent to starting Emacs with the
>> +-Q flag and loading specific packages (and their dependencies)
>> +manually.
>
> If this is how this feature is going to be implemented, I suggest to
> reword this NEWS entry to make the intent and the feature easier to
> understand:
>
>   *** New command to start an inferior Emacs loading only specific packages.
>   The new command 'package-isolate' will start a new Emacs process, as
>   a sub-process of Emacs where you invoke the command, in a way that
>   causes the new process to load only some of the installed packages.
>   The command prompts for the packages to activate in this
>   sub-process, and is intended for testing Emacs and/or the packages
>   in a clean environment.

As usual, I prefer your phrasing.  Will update the patch.

Re: Proposal for 'package-isolate' command
#306806
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 19:00
148 lines
6198 bytes
--=-=-=
Content-Type: text/plain

Stefan Kangas <stefankangas@gmail.com> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> I guess this is too controversial.  Perhaps just adjusting
>> `frame-title-format' would be enough.
>
> Would it be controversial to print a message in the scratch buffer?

That is also a good idea, this patch integrates that approach:


--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch

From ecc6b37a2a1cb9b3629521fc92b2d9af5c5ea653 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package--dependencies): Extend function
to handle and return package descriptors.
(package-isolate): Add new command.
* etc/NEWS: Announce new command.
---
 etc/NEWS                   |  9 +++++
 lisp/emacs-lisp/package.el | 70 ++++++++++++++++++++++++++++++++++----
 2 files changed, 73 insertions(+), 6 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..dc213dcee42 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,15 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start an inferior Emacs loading only specific packages.
+The new command 'package-isolate' will start a new Emacs process, as
+a sub-process of Emacs where you invoke the command, in a way that
+causes the new process to load only some of the installed packages.
+The command prompts for the packages to activate in this
+sub-process, and is intended for testing Emacs and/or the packages
+in a clean environment.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..76cd39cc263 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2330,12 +2330,26 @@ package-upgrade-all
       (mapc #'package-upgrade upgradeable))))
 
 (defun package--dependencies (pkg)
-  "Return a list of all dependencies PKG has.
-This is done recursively."
-  ;; Can we have circular dependencies?  Assume "nope".
-  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
-              (deps (mapcar #'car (package-desc-reqs desc))))
-    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
+  "Return a list of all recursive dependencies of PKG.
+If PKG is a package descriptor, the return value will consist of
+a list of package descriptors.  If PKG is a symbol, designating a
+package, the return value will be a list of symbols designating
+packages."
+  (when-let* ((desc (if (package-desc-p pkg) pkg
+                      (cadr (assq pkg package-archive-contents)))))
+    ;; Can we have circular dependencies?  Assume "nope".
+    (let ((all (named-let more ((pkg-desc desc))
+                 (let (deps)
+                   (dolist (req (package-desc-reqs pkg-desc))
+                     (setq deps (nconc
+                                 (catch 'found
+                                   (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                     (when (and (string= (car req) (package-desc-name p))
+                                                (version-list-<= (cadr req) (package-desc-version p)))
+                                       (throw 'found (more p)))))
+                                 deps)))
+                   (delete-dups (cons pkg-desc deps))))))
+      (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all)))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.
@@ -2625,6 +2639,50 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages)
+  "Start an uncustomised Emacs and only load a set of PACKAGES."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=)))))
+  (let* ((name (concat "package-isolate-"
+                       (mapconcat #'package-desc-full-name packages ",")))
+         initial-scratch-message package-load-list)
+    (with-temp-buffer
+      (insert ";; Emacs has been started by `package-isolate' without any configuration, and\n"
+              ";; only the following packages have been loaded:\n;;\n")
+
+      (dolist (package (append packages (mapcan #'package--dependencies packages)))
+        (push (list (package-desc-name package)
+                    (package-version-join (package-desc-version package)))
+              package-load-list)
+        (insert ";; - " (package-desc-full-name package))
+        (unless (memq package packages)
+          (insert " (dependency)"))
+        (insert "\n"))
+      (insert "\n")
+      (setq initial-scratch-message (buffer-string)))
+    (apply #'start-process (concat "*" name "*") nil
+           (list (expand-file-name invocation-name invocation-directory)
+                 "--quick" "--debug-init"
+                 "--init-directory" (make-temp-file name t)
+                 (format "--eval=%S"
+                         `(progn
+                            (setq initial-scratch-message ,initial-scratch-message)
+
+                            (require 'package)
+                            ,@(mapcar
+                               (lambda (dir)
+                                 `(add-to-list 'package-directory-list ,dir))
+                               (cons package-user-dir package-directory-list))
+                            (setq package-load-list ',package-load-list)
+                            (package-initialize)))))))
+
 
 ;;;; Package description buffer.
 
-- 
2.39.2


--=-=-=--

Re: Proposal for 'package-isolate' command
#306804
Author: Stefan Kangas
Date: Wed, 16 Aug 2023 20:49
7 lines
219 bytes
Philip Kaludercic <philipk@posteo.net> writes:

> I guess this is too controversial.  Perhaps just adjusting
> `frame-title-format' would be enough.

Would it be controversial to print a message in the scratch buffer?

Re: Proposal for 'package-isolate' command
#306817
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 05:30
52 lines
1916 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

>> No don't worry, helm will work in any cases, thanks.
>
> OK, in that case I'd prefer to keep it the way it is.

Ok, fair enough.

>>> Mainly to avoid issues with packages that might place files in the
>>> configuration directory, which might hinder the reproduction of bugs.
>>
>> Hmm, maybe, I don't have an example in mind though.
>
> It might not be the best example, but my package autocrypt generates a
> file in the `user-emacs-directory'.  If we don't use --init-directory,
> the existing file would be re-used.

Ok, for such case it is easy to either rename the file temporarily to
foo_ori or foo_save or to set the variable handling the file (generally
it is not harcoded) to something else. But another issue is if your
isolated package needs the history file or tramp file or whatever file
~/.emacs.d is handling; e.g. a package providing completion on history.
I still think it is more handy to reuse user-emacs-directory and its
elpa directory where the packages are already installed.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTdsxMTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk8cODAC/GKhgKenWOJ6Ac++UVz3IIrxTtICP
V4OrpbQJG18jCGdEu9vX/PTzhsKc28qzkHAZG6+pC+hVo7w1xikXd3Fc2iLs7aT3
OXTFMPYgoJhmG9OeI9Gse5hQml+WUzfGWaXF82w+PsaERXOnUfUMImZELbabfhS5
XKRSUU2xFdgC2SoS2jtoI0dceuJHAfO9LpnLHukFUmNO0xjfsdcBNDQwah9Nvkvo
4RY3wOSVkZ7Xir6QQLP4rWeahO7XX5nwPeJHdABZWEu0B63tfYdbLE5gb7PBxZFW
QPeOHhbJ6sF82ySO7dz5waKU/7jQ7BaFYKvt0wO0opiD7Dmqqi+xD32Un42AG/hk
F0s+2Nl+pSvCbupZAo6N8lW1DSbpUqipeBeu81Gv8OHOlLUNZqKle+8bgCeLEX6n
1FOGKdn5LIidcsdEHYEi9E3NeLRoETFpyeUWluFwbHuSSYaqDaZWe6FG65VI+AMq
vXe4L1f62WkjyzPcu0aY6YangeOVZi6WB1w=Ni+H
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306820
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 08:34
176 lines
7660 bytes
--=-=-=
Content-Type: text/plain

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>>> No don't worry, helm will work in any cases, thanks.
>>
>> OK, in that case I'd prefer to keep it the way it is.
>
> Ok, fair enough.
>
>>>> Mainly to avoid issues with packages that might place files in the
>>>> configuration directory, which might hinder the reproduction of bugs.
>>>
>>> Hmm, maybe, I don't have an example in mind though.
>>
>> It might not be the best example, but my package autocrypt generates a
>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>> the existing file would be re-used.
>
> Ok, for such case it is easy to either rename the file temporarily to
> foo_ori or foo_save or to set the variable handling the file (generally
> it is not harcoded) to something else. But another issue is if your
> isolated package needs the history file or tramp file or whatever file
> ~/.emacs.d is handling; e.g. a package providing completion on history.
> I still think it is more handy to reuse user-emacs-directory and its
> elpa directory where the packages are already installed.

How about this patch, that will use a temporary directory when
`package-isolate' is invoked with a prefix argument (not sure what the
default should be, I guess reusing `user-emacs-directory' is less
surprising):


--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch

From dd5da3d2f64f89994084012a3b7379aa78ae33f2 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package--dependencies): Extend function
to handle and return package descriptors.
(package-isolate): Add new command.
* etc/NEWS: Announce new command.
---
 etc/NEWS                   |  9 +++++
 lisp/emacs-lisp/package.el | 77 +++++++++++++++++++++++++++++++++++---
 2 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..dc213dcee42 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,15 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start an inferior Emacs loading only specific packages.
+The new command 'package-isolate' will start a new Emacs process, as
+a sub-process of Emacs where you invoke the command, in a way that
+causes the new process to load only some of the installed packages.
+The command prompts for the packages to activate in this
+sub-process, and is intended for testing Emacs and/or the packages
+in a clean environment.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..169d0d1360d 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2330,12 +2330,26 @@ package-upgrade-all
       (mapc #'package-upgrade upgradeable))))
 
 (defun package--dependencies (pkg)
-  "Return a list of all dependencies PKG has.
-This is done recursively."
-  ;; Can we have circular dependencies?  Assume "nope".
-  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
-              (deps (mapcar #'car (package-desc-reqs desc))))
-    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
+  "Return a list of all recursive dependencies of PKG.
+If PKG is a package descriptor, the return value will consist of
+a list of package descriptors.  If PKG is a symbol, designating a
+package, the return value will be a list of symbols designating
+packages."
+  (when-let* ((desc (if (package-desc-p pkg) pkg
+                      (cadr (assq pkg package-archive-contents)))))
+    ;; Can we have circular dependencies?  Assume "nope".
+    (let ((all (named-let more ((pkg-desc desc))
+                 (let (deps)
+                   (dolist (req (package-desc-reqs pkg-desc))
+                     (setq deps (nconc
+                                 (catch 'found
+                                   (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                     (when (and (string= (car req) (package-desc-name p))
+                                                (version-list-<= (cadr req) (package-desc-version p)))
+                                       (throw 'found (more p)))))
+                                 deps)))
+                   (delete-dups (cons pkg-desc deps))))))
+      (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all)))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.
@@ -2625,6 +2639,57 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages &optional temp-init)
+  "Start an uncustomised Emacs and only load a set of PACKAGES.
+If TEMP-INIT is non-nil, or when invoked with a prefix argument,
+the Emacs user directory is set to a temporary directory."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=))
+                  current-prefix-arg)))
+  (let* ((name (concat "package-isolate-"
+                       (mapconcat #'package-desc-full-name packages ",")))
+         (all-packages (delete-consecutive-dups
+                        (sort (append packages (mapcan #'package--dependencies packages))
+                              (lambda (p0 p1)
+                                (string< (package-desc-name p0) (package-desc-name p1))))))
+         initial-scratch-message package-load-list)
+    (with-temp-buffer
+      (insert ";; This is an isolated testing environment, with these packages enabled:\n\n")
+      (dolist (package all-packages)
+        (push (list (package-desc-name package)
+                    (package-version-join (package-desc-version package)))
+              package-load-list)
+        (insert ";; - " (package-desc-full-name package))
+        (unless (memq package packages)
+          (insert " (dependency)"))
+        (insert "\n"))
+      (insert "\n")
+      (setq initial-scratch-message (buffer-string)))
+    (apply #'start-process (concat "*" name "*") nil
+           (list (expand-file-name invocation-name invocation-directory)
+                 "--quick" "--debug-init"
+                 "--init-directory" (if temp-init
+                                        (make-temp-file name t)
+                                      user-emacs-directory)
+                 (format "--eval=%S"
+                         `(progn
+                            (setq initial-scratch-message ,initial-scratch-message)
+
+                            (require 'package)
+                            ,@(mapcar
+                               (lambda (dir)
+                                 `(add-to-list 'package-directory-list ,dir))
+                               (cons package-user-dir package-directory-list))
+                            (setq package-load-list ',package-load-list)
+                            (package-initialize)))))))
+
 
 ;;;; Package description buffer.
 
-- 
2.39.2


--=-=-=--

Re: Proposal for 'package-isolate' command
#306821
Author: Eshel Yaron
Date: Thu, 17 Aug 2023 11:07
43 lines
1700 bytes
Hi Philip,

Philip Kaludercic <philipk@posteo.net> writes:

> How about this patch, that will use a temporary directory when
> `package-isolate' is invoked with a prefix argument (not sure what the
> default should be, I guess reusing `user-emacs-directory' is less
> surprising):

I'm again looking forward to trying this out, I think it could be
helpful for testing the Compat integration I'm working on for a package
of mine.  I also again have a couple of minor suggestions around
documentation:

>  (defun package--dependencies (pkg)
> -  "Return a list of all dependencies PKG has.
> -This is done recursively."
> -  ;; Can we have circular dependencies?  Assume "nope".
> -  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
> -              (deps (mapcar #'car (package-desc-reqs desc))))
> -    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
> +  "Return a list of all recursive dependencies of PKG.

I'd say "transitive" rather than "recursive" dependencies, because I
think a recursive dependency is more commonly used to refer to a case in
which a package (or library, etc.) depends on itself.

> +If PKG is a package descriptor, the return value will consist of
> +a list of package descriptors.  If PKG is a symbol, designating a
> +package, the return value will be a list of symbols designating
> +packages."

Personally, I find the future tense less clear than the present tense
when describing deterministic software behavior.  So usually I prefer it
when the docs say what the program "does", not what it "will do".  In
this case that be "if PKG is a package descriptor, the return value is a
list of package descriptors..."


Best,

Eshel

Re: Proposal for 'package-isolate' command
#306831
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 13:32
94 lines
3453 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Hello Philip,

Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>>> No don't worry, helm will work in any cases, thanks.
>>>
>>> OK, in that case I'd prefer to keep it the way it is.
>>
>> Ok, fair enough.
>>
>>>>> Mainly to avoid issues with packages that might place files in the
>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>
>>>> Hmm, maybe, I don't have an example in mind though.
>>>
>>> It might not be the best example, but my package autocrypt generates a
>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>> the existing file would be re-used.
>>
>> Ok, for such case it is easy to either rename the file temporarily to
>> foo_ori or foo_save or to set the variable handling the file (generally
>> it is not harcoded) to something else. But another issue is if your
>> isolated package needs the history file or tramp file or whatever file
>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>> I still think it is more handy to reuse user-emacs-directory and its
>> elpa directory where the packages are already installed.
>
> How about this patch, that will use a temporary directory when
> `package-isolate' is invoked with a prefix argument (not sure what the
> default should be, I guess reusing `user-emacs-directory' is less
> surprising):

Yes.

Isn't these two loop the same? (save one loop)

    (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
    	 unless (package-built-in-p p)
    	 collect (cons (package-desc-full-name p) p) into table
    	 finally return
    	 (list (cl-loop for c in (completing-read-multiple
                                      "Isolate packages: " table
                                      nil t)
    		        collect (alist-get c table nil nil #'string=))
                   current-prefix-arg))

    (cl-loop for p in (package--alist)
             for desc = (cadr p)
             for name = (car p)
             unless (package-built-in-p desc)
             collect (cons (package-desc-full-name desc) p) into table
             finally return
             (list (cl-loop for c in (completing-read-multiple
                                      "Isolate packages: " table
                                      nil t)
    		            append (cdr (alist-get c table nil nil #'string=)))
                   current-prefix-arg))


> [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...


-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeJPITHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk9FNC/9W8oUsxV687mMnsSdpqjQhh0qooj0G
1gZAgeUz8UlZyYco2NVtMSm0HkRALtIGhcDlNOYVPx3MA/C/AXQCeFTU6Tk9OLFP
L30srAkJfMB/O0xTidaGChQg0WV3tNX0ANr7tyZR12q/0Aw7fZEaOmTmn8LTOY3c
auTpcts9kvmwUxhH+oaD1h8kSjClZqMrVRbrv3TZVDVYYYqNDVylawKK8NkXQVXk
4UFYm6mu8DWy6hU3XQ6kQwaN2PGMXGQqUoURWleCClYdTuKEoCrB3815AaYOX7EB
ZkkK31/qE7RNvaOoFa7fgm3d5esswPGRGOsDRFEaAwElVBsnvy9VcIUXc3E23ieX
BPHT0xwfA3mSQW13Zrfg4CV+5/fnFaiiRQWcBb9E+Rkq/iqEgnwN2EMlEyjfWPLL
FzjEc8GJMYL+fgluPLTEMyZDe0nXyv3k/cbCeA+OXR+Tt749hGwOi/k8h8D8DJL6
Fss1NYRkLoLYoyVBI8ItMae7QXNyKDLfO8M=uA2i
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306832
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 13:56
101 lines
3832 bytes
--=-=-Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>>> No don't worry, helm will work in any cases, thanks.
>>>
>>> OK, in that case I'd prefer to keep it the way it is.
>>
>> Ok, fair enough.
>>
>>>>> Mainly to avoid issues with packages that might place files in the
>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>
>>>> Hmm, maybe, I don't have an example in mind though.
>>>
>>> It might not be the best example, but my package autocrypt generates a
>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>> the existing file would be re-used.
>>
>> Ok, for such case it is easy to either rename the file temporarily to
>> foo_ori or foo_save or to set the variable handling the file (generally
>> it is not harcoded) to something else. But another issue is if your
>> isolated package needs the history file or tramp file or whatever file
>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>> I still think it is more handy to reuse user-emacs-directory and its
>> elpa directory where the packages are already installed.
>
> How about this patch, that will use a temporary directory when
> `package-isolate' is invoked with a prefix argument (not sure what the
> default should be, I guess reusing `user-emacs-directory' is less
> surprising):

However it is not working properly:

Tried to isolate two packages, osm and w3m, and osm use compat as
dependency:

Unable to activate package ‘osm’.
Required package ‘compat-29.1.4.0’ is unavailable

With my simple version of package-isolate I have not this error, both
osm w3m are installed correctly.

(defun package-isolate (packages)
  "Start an uncustomised Emacs and only load a set of PACKAGES."
  (interactive
   (list (completing-read-multiple
          "Packages: " (mapcar #'car (package--alist)))))
  (let* ((name (concat "package-isolate-" (mapconcat #'identity packages ",")))
         (deps (cl-loop for p in packages
                        for sym = (intern p)
                        nconc (package--dependencies sym))))
    (apply #'start-process (concat "*" name "*") nil
           (list (file-truename (expand-file-name
                                 invocation-name invocation-directory))
                 "--quick" "--debug-init"
                 (format "--eval=%S"
                         `(progn
                           (require 'package)
                           (setq package-load-list
                            ',(append (mapcar (lambda (p) (list (intern p) t))
                                              packages)
                                      (mapcar (lambda (p) (list p t)) deps)))
                           (package-initialize)))))))

> [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...


-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeKBgTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk5uLDACGqGDFUQA+SqVxdrmgcxrOsFWpOufE
JZX2m+9637YMBR1KJWhdlQrI3nKunqEeeM7srLMNHv92fuAcoNRK9SSFbf1PAdBu
p7AEb6Z0GsOPPztrCO8B5dJk842zyTuR0Gl5+PCvIfxSFiEVi3u+d+tR2DSt0Bjk
D7VmfV2G70QJQdNPD0zZbb13cc6cBAJnTveBOvXEWnqtWz2TdowFYEkGEEZ/3r/m
4PIEPZSM/qDBU5iznVwFmTgZMT/kZ584YTtPNJ0DgDHhJ9OENySYvRruhyhiSpNP
jrmHMrQ9DLM4OxnAMJZb8A22VvHfKA6IW49GD+Bs0BjYoyYDpdy+9OsJ3ph6jkbc
4YaVyjF38pm3ckK1pClAkK6cbMgKZSvaP5U6pnsaK285FjwDtcbIycM5cVECSYqs
N5nx/50Env0iiN/jISaFt4crcmHrNv0zNFJF4xh0JFY1JgyHWDJt/mrsAqVtTeSW
K4vidStImzFFWbDVnXZbyRRD2SdVo4iQRHM=7kcT
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306835
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 14:04
76 lines
2965 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> Hello Philip,
>
> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>>> No don't worry, helm will work in any cases, thanks.
>>>>
>>>> OK, in that case I'd prefer to keep it the way it is.
>>>
>>> Ok, fair enough.
>>>
>>>>>> Mainly to avoid issues with packages that might place files in the
>>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>>
>>>>> Hmm, maybe, I don't have an example in mind though.
>>>>
>>>> It might not be the best example, but my package autocrypt generates a
>>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>>> the existing file would be re-used.
>>>
>>> Ok, for such case it is easy to either rename the file temporarily to
>>> foo_ori or foo_save or to set the variable handling the file (generally
>>> it is not harcoded) to something else. But another issue is if your
>>> isolated package needs the history file or tramp file or whatever file
>>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>>> I still think it is more handy to reuse user-emacs-directory and its
>>> elpa directory where the packages are already installed.
>>
>> How about this patch, that will use a temporary directory when
>> `package-isolate' is invoked with a prefix argument (not sure what the
>> default should be, I guess reusing `user-emacs-directory' is less
>> surprising):
>
> Yes.
>
> Isn't these two loop the same? (save one loop)

No, because that assumes that we are only interested in the first
package descriptor in every package--alist entry, while there might be
multiple.

>     (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
>     	 unless (package-built-in-p p)

Also, do we want this or wouldn't it be useful to be able to force a
built-in package being loaded?

>     	 collect (cons (package-desc-full-name p) p) into table
>     	 finally return
>     	 (list (cl-loop for c in (completing-read-multiple
>                                       "Isolate packages: " table
>                                       nil t)
>     		        collect (alist-get c table nil nil #'string=))
>                    current-prefix-arg))
>
>     (cl-loop for p in (package--alist)
>              for desc = (cadr p)
>              for name = (car p)
>              unless (package-built-in-p desc)
>              collect (cons (package-desc-full-name desc) p) into table
>              finally return
>              (list (cl-loop for c in (completing-read-multiple
>                                       "Isolate packages: " table
>                                       nil t)
>     		            append (cdr (alist-get c table nil nil #'string=)))
>                    current-prefix-arg))
>
>
>> [2. text/x-diff;
>> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...

Re: Proposal for 'package-isolate' command
#306837
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 14:15
90 lines
3285 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Hello Philip,
>>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>>> No don't worry, helm will work in any cases, thanks.
>>>>>
>>>>> OK, in that case I'd prefer to keep it the way it is.
>>>>
>>>> Ok, fair enough.
>>>>
>>>>>>> Mainly to avoid issues with packages that might place files in the
>>>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>>>
>>>>>> Hmm, maybe, I don't have an example in mind though.
>>>>>
>>>>> It might not be the best example, but my package autocrypt generates a
>>>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>>>> the existing file would be re-used.
>>>>
>>>> Ok, for such case it is easy to either rename the file temporarily to
>>>> foo_ori or foo_save or to set the variable handling the file (generally
>>>> it is not harcoded) to something else. But another issue is if your
>>>> isolated package needs the history file or tramp file or whatever file
>>>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>>>> I still think it is more handy to reuse user-emacs-directory and its
>>>> elpa directory where the packages are already installed.
>>>
>>> How about this patch, that will use a temporary directory when
>>> `package-isolate' is invoked with a prefix argument (not sure what the
>>> default should be, I guess reusing `user-emacs-directory' is less
>>> surprising):
>>
>> Yes.
>>
>> Isn't these two loop the same? (save one loop)
>
> No, because that assumes that we are only interested in the first
> package descriptor in every package--alist entry, while there might be
> multiple.

Ah ok.

>>     (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
>>     	 unless (package-built-in-p p)
>
> Also, do we want this or wouldn't it be useful to be able to force a
> built-in package being loaded?

Some packages seems to require a specific version of a package for their
dependency e.g. seq, by excluding it the package may not work correctly,
this is my understanding but I may be wrong. Also perhaps the package
e.g. seq is selected later when computing dependencies but maybe user
wants to select a particular version manually in the first place?

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeLTYTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk7pWDAC3uoBpuBVyH1Nwy9mKoksM6qCC2zzH
yUHyd7mHIyt4crEUIs0CFlP0vHDiEckXHRwUV6L0gEMXkqcgOmIvZH14fNsuqyer
81mHLxrPUG2Do2S7DZtPHjc8CmwHgRDzcx6mCH//xLdGDYwJmpVHrN4WTPVvyN46
MZqvkiHnW/hoOrGKGV/tYjqzPksE5oJ77Rq56xtEH53n9pEC3PXhfr9tmKPN7hpa
S7zAMAwb2AYNkVApQTJ3hb3FyaF7KfFGcYATPlD2aPMsVhYijLDo4n5TPCg27VEN
YJjKd1K6rGn9k0d7ojpCUeUBteuqMDRPjmNGIWGBJOEdzi7u9pjBQlqrpKKgr7Eg
Avr7Tr5dz9OycoZVmc7vJH8Xl4neTjZEpDaB0EaO/6NTJDH7b80yY3sUR8oKinc8
DuFQ/s/oURYaAsUOUG3BwtMWAlkC2rRDelzqwQwQSxNSkOGEFnJ0ffixu1zMIM0V
kM7dGipvk6OgAzZXimHM8TE+GHWH6htm0Bk=G+kr
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306838
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 14:18
90 lines
3679 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>>> No don't worry, helm will work in any cases, thanks.
>>>>
>>>> OK, in that case I'd prefer to keep it the way it is.
>>>
>>> Ok, fair enough.
>>>
>>>>>> Mainly to avoid issues with packages that might place files in the
>>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>>
>>>>> Hmm, maybe, I don't have an example in mind though.
>>>>
>>>> It might not be the best example, but my package autocrypt generates a
>>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>>> the existing file would be re-used.
>>>
>>> Ok, for such case it is easy to either rename the file temporarily to
>>> foo_ori or foo_save or to set the variable handling the file (generally
>>> it is not harcoded) to something else. But another issue is if your
>>> isolated package needs the history file or tramp file or whatever file
>>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>>> I still think it is more handy to reuse user-emacs-directory and its
>>> elpa directory where the packages are already installed.
>>
>> How about this patch, that will use a temporary directory when
>> `package-isolate' is invoked with a prefix argument (not sure what the
>> default should be, I guess reusing `user-emacs-directory' is less
>> surprising):
>
> However it is not working properly:
>
> Tried to isolate two packages, osm and w3m, and osm use compat as
> dependency:
>
> Unable to activate package ‘osm’.
> Required package ‘compat-29.1.4.0’ is unavailable

Sadly I cannot reproduce it, w3m is not in GNU or NonGNU ELPA, so unless
that is causing the issue, something like M-x package-isolate RET
avy-0.5.0,osm-0.13 RET shouldn't make an issue when it comes to
resolving dependencies, as the scratch message indicates:

--8<---------------cut here---------------start------------->8---
;; This is an isolated testing environment, with these packages enabled:

;; - avy-0.5.0
;; - compat-29.1.4.2 (dependency)
;; - osm-0.13
--8<---------------cut here---------------end--------------->8---

And M-x load-library RET compat RET works as well.

> With my simple version of package-isolate I have not this error, both
> osm w3m are installed correctly.
>
> (defun package-isolate (packages)
>   "Start an uncustomised Emacs and only load a set of PACKAGES."
>   (interactive
>    (list (completing-read-multiple
>           "Packages: " (mapcar #'car (package--alist)))))
>   (let* ((name (concat "package-isolate-" (mapconcat #'identity packages ",")))
>          (deps (cl-loop for p in packages
>                         for sym = (intern p)
>                         nconc (package--dependencies sym))))
>     (apply #'start-process (concat "*" name "*") nil
>            (list (file-truename (expand-file-name
>                                  invocation-name invocation-directory))
>                  "--quick" "--debug-init"
>                  (format "--eval=%S"
>                          `(progn
>                            (require 'package)
>                            (setq package-load-list
>                             ',(append (mapcar (lambda (p) (list (intern p) t))
>                                               packages)
>                                       (mapcar (lambda (p) (list p t)) deps)))
>                            (package-initialize)))))))
>
>> [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...

Re: Proposal for 'package-isolate' command
#306839
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 14:19
49 lines
1951 bytes
Eshel Yaron <me@eshelyaron.com> writes:

> Hi Philip,
>
> Philip Kaludercic <philipk@posteo.net> writes:
>
>> How about this patch, that will use a temporary directory when
>> `package-isolate' is invoked with a prefix argument (not sure what the
>> default should be, I guess reusing `user-emacs-directory' is less
>> surprising):
>
> I'm again looking forward to trying this out, I think it could be
> helpful for testing the Compat integration I'm working on for a package
> of mine.  I also again have a couple of minor suggestions around
> documentation:
>
>>  (defun package--dependencies (pkg)
>> -  "Return a list of all dependencies PKG has.
>> -This is done recursively."
>> -  ;; Can we have circular dependencies?  Assume "nope".
>> -  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
>> -              (deps (mapcar #'car (package-desc-reqs desc))))
>> -    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
>> +  "Return a list of all recursive dependencies of PKG.
>
> I'd say "transitive" rather than "recursive" dependencies, because I
> think a recursive dependency is more commonly used to refer to a case in
> which a package (or library, etc.) depends on itself.

I wouldn't say recursive but cyclical in that case, but either way I
think transitive is a better word here.  Will change it.

>> +If PKG is a package descriptor, the return value will consist of
>> +a list of package descriptors.  If PKG is a symbol, designating a
>> +package, the return value will be a list of symbols designating
>> +packages."
>
> Personally, I find the future tense less clear than the present tense
> when describing deterministic software behavior.  So usually I prefer it
> when the docs say what the program "does", not what it "will do".  In
> this case that be "if PKG is a package descriptor, the return value is a
> list of package descriptors..."

Right, makes sense as well.

> Best,
>
> Eshel

Re: Proposal for 'package-isolate' command
#306841
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 14:28
75 lines
2755 bytes
--=-=-Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable


Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>>> No don't worry, helm will work in any cases, thanks.
>>>>
>>>> OK, in that case I'd prefer to keep it the way it is.
>>>
>>> Ok, fair enough.
>>>
>>>>>> Mainly to avoid issues with packages that might place files in the
>>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>>
>>>>> Hmm, maybe, I don't have an example in mind though.
>>>>
>>>> It might not be the best example, but my package autocrypt generates a
>>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>>> the existing file would be re-used.
>>>
>>> Ok, for such case it is easy to either rename the file temporarily to
>>> foo_ori or foo_save or to set the variable handling the file (generally
>>> it is not harcoded) to something else. But another issue is if your
>>> isolated package needs the history file or tramp file or whatever file
>>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>>> I still think it is more handy to reuse user-emacs-directory and its
>>> elpa directory where the packages are already installed.
>>
>> How about this patch, that will use a temporary directory when
>> `package-isolate' is invoked with a prefix argument (not sure what the
>> default should be, I guess reusing `user-emacs-directory' is less
>> surprising):
>
> However it is not working properly:
>
> Tried to isolate two packages, osm and w3m, and osm use compat as
> dependency:
>
> Unable to activate package ‘osm’.
> Required package ‘compat-29.1.4.0’ is unavailable

Forget it, it is working properly, just forget you had modified
package--dependencies as well.
Sorry for the noise.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeLwYTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk+prC/0d5bJgEv+CbEz6Lh8uNyTaB1ppdv0H
XekGpDpFTZIbNNcB9fTI5T5w+Hhq27CD48g3J7p0GVExj9tDn1r9phxbitbaIY20
vPQ8xBvcvWwMp1KwS1P3vdfzNwv6gwAJcKjVH+ITDcb+BDvXpB8OjEACElb7M/jZ
V7wyFH4iaBXGIE5oL43KpQE2uaYK/BhzPcTMWRytK/kVnbVDCQUI08tMHwdohMrv
BL4a20mfMLhilOd4CIMFMTYTnffNIHJZCFjcAXbg/LxuKARu6Ls6vbPBLqDbmWji
PaB826zthq8AWyCLd4e/l57QAGZmPBMVs4l2lHFQsOrhEYYEEG6SDI+WDgxgKTkZ
FbsH6gjuAJvzpua1wdWlBGSR7ofUcVCSR4ZPcqyNVkU58Kkelxmq57bS74b8HI+J
dPi/UP+2KouOHnyzj3YolxE/LuLLhzrlZpvOp/oS7AQElY0XnM3rWe19oDIDjbAf
z7+cJ7q6QuV8ERClBHqdQ5bw3HktxnLN+38=CO/8
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306846
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 18:17
137 lines
5491 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>>> No don't worry, helm will work in any cases, thanks.
>>>>>
>>>>> OK, in that case I'd prefer to keep it the way it is.
>>>>
>>>> Ok, fair enough.
>>>>
>>>>>>> Mainly to avoid issues with packages that might place files in the
>>>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>>>
>>>>>> Hmm, maybe, I don't have an example in mind though.
>>>>>
>>>>> It might not be the best example, but my package autocrypt generates a
>>>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>>>> the existing file would be re-used.
>>>>
>>>> Ok, for such case it is easy to either rename the file temporarily to
>>>> foo_ori or foo_save or to set the variable handling the file (generally
>>>> it is not harcoded) to something else. But another issue is if your
>>>> isolated package needs the history file or tramp file or whatever file
>>>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>>>> I still think it is more handy to reuse user-emacs-directory and its
>>>> elpa directory where the packages are already installed.
>>>
>>> How about this patch, that will use a temporary directory when
>>> `package-isolate' is invoked with a prefix argument (not sure what the
>>> default should be, I guess reusing `user-emacs-directory' is less
>>> surprising):
>>
>> However it is not working properly:
>>
>> Tried to isolate two packages, osm and w3m, and osm use compat as
>> dependency:
>>
>> Unable to activate package ‘osm’.
>> Required package ‘compat-29.1.4.0’ is unavailable
>
> Forget it, it is working properly, just forget you had modified
> package--dependencies as well.
> Sorry for the noise.

It was either that or a new function had to be added, not sure which
approach is worse.  The current implementation seems to have been
hastily added by Lars last year, and it is a bit regrettable in
retrospect.  It would be possible to modify my change, and have the
function always return package-desc objects, since the function is only
used in one other spot in another part of the file.  While there might
be others (packages or individuals) that depend on the function behaving
the way it does, but on the other hand, convention designates it as
being an "internal" function.

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Hello Philip,
>>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>>
>>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>>
>>>>>>> No don't worry, helm will work in any cases, thanks.
>>>>>>
>>>>>> OK, in that case I'd prefer to keep it the way it is.
>>>>>
>>>>> Ok, fair enough.
>>>>>
>>>>>>>> Mainly to avoid issues with packages that might place files in the
>>>>>>>> configuration directory, which might hinder the reproduction of bugs.
>>>>>>>
>>>>>>> Hmm, maybe, I don't have an example in mind though.
>>>>>>
>>>>>> It might not be the best example, but my package autocrypt generates a
>>>>>> file in the `user-emacs-directory'.  If we don't use --init-directory,
>>>>>> the existing file would be re-used.
>>>>>
>>>>> Ok, for such case it is easy to either rename the file temporarily to
>>>>> foo_ori or foo_save or to set the variable handling the file (generally
>>>>> it is not harcoded) to something else. But another issue is if your
>>>>> isolated package needs the history file or tramp file or whatever file
>>>>> ~/.emacs.d is handling; e.g. a package providing completion on history.
>>>>> I still think it is more handy to reuse user-emacs-directory and its
>>>>> elpa directory where the packages are already installed.
>>>>
>>>> How about this patch, that will use a temporary directory when
>>>> `package-isolate' is invoked with a prefix argument (not sure what the
>>>> default should be, I guess reusing `user-emacs-directory' is less
>>>> surprising):
>>>
>>> Yes.
>>>
>>> Isn't these two loop the same? (save one loop)
>>
>> No, because that assumes that we are only interested in the first
>> package descriptor in every package--alist entry, while there might be
>> multiple.
>
> Ah ok.
>
>>>     (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
>>>     	 unless (package-built-in-p p)
>>
>> Also, do we want this or wouldn't it be useful to be able to force a
>> built-in package being loaded?
>
> Some packages seems to require a specific version of a package for their
> dependency e.g. seq, by excluding it the package may not work correctly,
> this is my understanding but I may be wrong. Also perhaps the package
> e.g. seq is selected later when computing dependencies but maybe user
> wants to select a particular version manually in the first place?

The current algorithm should pick the first package in the package alist
that satisfies the necessary dependencies.  Perhaps that should be
re-thought or the selection should be more clever, e.g. if the user
explicitly specifies a dependency with a version, then it should be
preferred to whatever other dependency might be determined, at the
possible expense of triggering runtime bugs.

Re: Proposal for 'package-isolate' command
#306853
Author: Thierry Volpiatt
Date: Fri, 18 Aug 2023 04:57
89 lines
3869 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

>> Forget it, it is working properly, just forget you had modified
>> package--dependencies as well.
>> Sorry for the noise.
>
> It was either that or a new function had to be added, not sure which
> approach is worse.  The current implementation seems to have been
> hastily added by Lars last year, and it is a bit regrettable in
> retrospect.  It would be possible to modify my change, and have the
> function always return package-desc objects, since the function is only
> used in one other spot in another part of the file.  While there might
> be others (packages or individuals) that depend on the function behaving
> the way it does, but on the other hand, convention designates it as
> being an "internal" function.

The actual version is something like 4 or 5 lines long, so external
packages can inline this version under another name if really needed,
but your version is covering the both so it's ok I think.
OTOH The problem with package.el is inconsistency within its functions,
sometimes you have to use a pkg-desc as arg, sometimes not, sometimes
functions return a list of symbols sometimes a list of pkg-desc, what is
a package name, a string or a symbol? What is a pkg-desc exactly,
sometimes it is the cdr in other places the cadr is used...
Also built-in packages don't have the same format unless they are distributed
in Elpa etc...

>> Some packages seems to require a specific version of a package for their
>> dependency e.g. seq, by excluding it the package may not work correctly,
>> this is my understanding but I may be wrong. Also perhaps the package
>> e.g. seq is selected later when computing dependencies but maybe user
>> wants to select a particular version manually in the first place?
>
> The current algorithm should pick the first package in the package alist
> that satisfies the necessary dependencies.  Perhaps that should be
> re-thought or the selection should be more clever, e.g. if the user
> explicitly specifies a dependency with a version, then it should be
> preferred to whatever other dependency might be determined, at the
> possible expense of triggering runtime bugs.

I think it is hard to cover all cases, but after all it is more a
developer tool for debugging a particular package than a end user tool
to run packages, so perhaps the developer can give directives about
dependencies to use when needed.

Another thing, you use actually 

    (expand-file-name invocation-name invocation-directory)

I suggest you use the truename of this instead as emacs can be symlinked
in some installations.  It should work with the symlink name, but it is
clearer which emacs version is used.

Now your function is working fine and nearly finish, did you think how
you are going to distribute it? It seems you are going to merge it in
master, but what about providing it as well as a Elpa package so that
users of old emacs (at some point of course, say emacs-27) can use it to
report bugs?

Thanks.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTfAX4THHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvkzIjC/0bBkKGDDjGZPIqZfl1ZMBuMR50yA4A
qruWYMhL12zjWfpeK/1+bMSzuFuuXuA2oscPxJ4ewvzatGKE0uDxIYDGbe8O+ZZw
bM6vreoav0kjqmdIhprwrSNBgjQWh510H98Nn+bLu+IFU1XDznCQPVzwGM777VgB
yanSLvbmW6iiFVd2xKkUoN8808eMRNlW1AGMxnZR0FrZNdFbksud3MZXWEQZrzYJ
i0nvYHA/xVVoqUNnpINiO1hnkTDJoG2zQcgp9HCeLm6HTZEuxbiNT9xHrEm+vbRU
drt4R3qyvKUmdvPjccywPUXFnDBrd/V/R48XNobiDWmsvYDwx/n33IdGDF/zuquN
HL6vh55BUoUTsX6i95+/ytaN4VE17kxADrjeK7kxyAd4uKszJ7Ajz+bryR6iWX4x
FQy1qjNTL5A/qyLwT9HtpbvIc23zQQ1xyvr6sajVZCsV6d0CfPHkWJdCDjKjc7aN
1lPCwz98+1LXyP0MWYl8angqFLWS8q2Xuew=oFud
-----END PGP SIGNATURE-----
--=-=-=--

Re: Proposal for 'package-isolate' command
#306857
Author: Philip Kaluderci
Date: Fri, 18 Aug 2023 07:49
76 lines
3701 bytes
Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>>> Forget it, it is working properly, just forget you had modified
>>> package--dependencies as well.
>>> Sorry for the noise.
>>
>> It was either that or a new function had to be added, not sure which
>> approach is worse.  The current implementation seems to have been
>> hastily added by Lars last year, and it is a bit regrettable in
>> retrospect.  It would be possible to modify my change, and have the
>> function always return package-desc objects, since the function is only
>> used in one other spot in another part of the file.  While there might
>> be others (packages or individuals) that depend on the function behaving
>> the way it does, but on the other hand, convention designates it as
>> being an "internal" function.
>
> The actual version is something like 4 or 5 lines long, so external
> packages can inline this version under another name if really needed,
> but your version is covering the both so it's ok I think.
> OTOH The problem with package.el is inconsistency within its functions,
> sometimes you have to use a pkg-desc as arg, sometimes not, sometimes
> functions return a list of symbols sometimes a list of pkg-desc, what is
> a package name, a string or a symbol? What is a pkg-desc exactly,
> sometimes it is the cdr in other places the cadr is used...
> Also built-in packages don't have the same format unless they are distributed
> in Elpa etc...

Right, there is certainly work to be done.

>>> Some packages seems to require a specific version of a package for their
>>> dependency e.g. seq, by excluding it the package may not work correctly,
>>> this is my understanding but I may be wrong. Also perhaps the package
>>> e.g. seq is selected later when computing dependencies but maybe user
>>> wants to select a particular version manually in the first place?
>>
>> The current algorithm should pick the first package in the package alist
>> that satisfies the necessary dependencies.  Perhaps that should be
>> re-thought or the selection should be more clever, e.g. if the user
>> explicitly specifies a dependency with a version, then it should be
>> preferred to whatever other dependency might be determined, at the
>> possible expense of triggering runtime bugs.
>
> I think it is hard to cover all cases, but after all it is more a
> developer tool for debugging a particular package than a end user tool
> to run packages, so perhaps the developer can give directives about
> dependencies to use when needed.
>
> Another thing, you use actually
>
>     (expand-file-name invocation-name invocation-directory)
>
> I suggest you use the truename of this instead as emacs can be symlinked
> in some installations.  It should work with the symlink name, but it is
> clearer which emacs version is used.

I second Eli's question here, what difference would it make?  Clearer to
whom?

> Now your function is working fine and nearly finish, did you think how
> you are going to distribute it? It seems you are going to merge it in
> master, but what about providing it as well as a Elpa package so that
> users of old emacs (at some point of course, say emacs-27) can use it to
> report bugs?

I am not a fan of small ELPA packages, but what I'd like to bring up
again was the proposal to add package.el itself to ELPA.  I wrote a
patch in <873559q83j.fsf@posteo.net> that should arrange everything
necessary for this move, there are still a few points that should be
discussed in terms of stability and recovering from a possibly
inconsistent state.  I think I'll create a feature branch some day soon
to make the proposal more concrete.

> Thanks.

Re: Proposal for 'package-isolate' command
#306855
Author: Eli Zaretskii
Date: Fri, 18 Aug 2023 08:44
19 lines
763 bytes
> From: Thierry Volpiatto <thievol@posteo.net>
> Cc: emacs-devel@gnu.org
> Date: Fri, 18 Aug 2023 04:57:06 +0000
>
> Another thing, you use actually
>
>     (expand-file-name invocation-name invocation-directory)
>
> I suggest you use the truename of this instead as emacs can be symlinked
> in some installations.  It should work with the symlink name, but it is
> clearer which emacs version is used.

We use the above in quite a few places, including when we start async
native-compilation.  So if it has some problems, we had better
discussed them, because I don't quite see why would the above need to
use truename.  If the OS succeeded to start Emacs via a symlink when
the current session was started, why would it fail to start it from
inside Emacs?

Re: Proposal for 'package-isolate' command
#306861
Author: Thierry Volpiatt
Date: Fri, 18 Aug 2023 12:43
114 lines
4920 bytes
--=-=-Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>>> Forget it, it is working properly, just forget you had modified
>>>> package--dependencies as well.
>>>> Sorry for the noise.
>>>
>>> It was either that or a new function had to be added, not sure which
>>> approach is worse.  The current implementation seems to have been
>>> hastily added by Lars last year, and it is a bit regrettable in
>>> retrospect.  It would be possible to modify my change, and have the
>>> function always return package-desc objects, since the function is only
>>> used in one other spot in another part of the file.  While there might
>>> be others (packages or individuals) that depend on the function behaving
>>> the way it does, but on the other hand, convention designates it as
>>> being an "internal" function.
>>
>> The actual version is something like 4 or 5 lines long, so external
>> packages can inline this version under another name if really needed,
>> but your version is covering the both so it's ok I think.
>> OTOH The problem with package.el is inconsistency within its functions,
>> sometimes you have to use a pkg-desc as arg, sometimes not, sometimes
>> functions return a list of symbols sometimes a list of pkg-desc, what is
>> a package name, a string or a symbol? What is a pkg-desc exactly,
>> sometimes it is the cdr in other places the cadr is used...
>> Also built-in packages don't have the same format unless they are distributed
>> in Elpa etc...
>
> Right, there is certainly work to be done.
>
>>>> Some packages seems to require a specific version of a package for their
>>>> dependency e.g. seq, by excluding it the package may not work correctly,
>>>> this is my understanding but I may be wrong. Also perhaps the package
>>>> e.g. seq is selected later when computing dependencies but maybe user
>>>> wants to select a particular version manually in the first place?
>>>
>>> The current algorithm should pick the first package in the package alist
>>> that satisfies the necessary dependencies.  Perhaps that should be
>>> re-thought or the selection should be more clever, e.g. if the user
>>> explicitly specifies a dependency with a version, then it should be
>>> preferred to whatever other dependency might be determined, at the
>>> possible expense of triggering runtime bugs.
>>
>> I think it is hard to cover all cases, but after all it is more a
>> developer tool for debugging a particular package than a end user tool
>> to run packages, so perhaps the developer can give directives about
>> dependencies to use when needed.
>>
>> Another thing, you use actually 
>>
>>     (expand-file-name invocation-name invocation-directory)
>>
>> I suggest you use the truename of this instead as emacs can be symlinked
>> in some installations.  It should work with the symlink name, but it is
>> clearer which emacs version is used.
>
> I second Eli's question here, what difference would it make?  Clearer to
> whom?

OK, this is not that important.

>> Now your function is working fine and nearly finish, did you think how
>> you are going to distribute it? It seems you are going to merge it in
>> master, but what about providing it as well as a Elpa package so that
>> users of old emacs (at some point of course, say emacs-27) can use it to
>> report bugs?
>
> I am not a fan of small ELPA packages, but what I'd like to bring up
> again was the proposal to add package.el itself to ELPA.  I wrote a
> patch in <873559q83j.fsf@posteo.net> that should arrange everything
> necessary for this move, there are still a few points that should be
> discussed in terms of stability and recovering from a possibly
> inconsistent state.  I think I'll create a feature branch some day soon
> to make the proposal more concrete.

Ok, looking forward for having a package-isolate function fetchable for
everybody, I will use my own version that fit my needs as a helm action
for its package manager.

Thanks for your work.

-- 
Thierry

--=-=-Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTfahoTHHRoaWV2b2xA
cG9zdGVvLm5ldAAKCRAOxW0UHRbvk3SlC/9+ssSiqDlEzF09Pn3Vp/9xZxiJZEdA
QeOrpnRJ/T4w/MofemHFK97GKM3/4dTN/zYxaQGjvL8k2M5i3egdvmYRmiuR9f6G
rdNWhV16Lh6zdcf418DUeQVd1pxXSjwxV5VW5GIEUzcbRZFrtTcdaB9EMea5pATr
kDq4WacS0fSps3oYDFFdTLRtwpGpym+vxMGb8Wa+FQbjYXwBIGmvU911juT+fAnD
ZhmNwBT93jx3EHmqoN5vzp52trXSaoR5A0Np3ySTIQMUHtBYXz6obhWOAx1mVeWg
YSY/0b8cETn/HrO/iqF8RuuORao+BGiSFAhb5wODVexBWgfVO8Qcixguf8Gqdujw
09RL/kdFMYTFaHiNCFGYeFceiAFm1ahOE83N1IphOLsjuekrFa6i9hO6PbuyHjEQ
aVQ/xAagjU8i8YlmpHzLclpmtFXzTZccpXpV3n+6D9Sm37t/dj8iTUu4hAbe+NlE
OpbLK2dO+iLCaVLLCG7udexAI3N1BVutMZ4=J7Le
-----END PGP SIGNATURE-----
--=-=-=--

Re: Adding package and package-vc to ELPA
#306868
Author: Philip Kaluderci
Date: Fri, 18 Aug 2023 18:34
4564 lines
348418 bytes
--=-=-Content-Type: text/plain

Philip Kaludercic <philipk@posteo.net> writes:

>> Now your function is working fine and nearly finish, did you think how
>> you are going to distribute it? It seems you are going to merge it in
>> master, but what about providing it as well as a Elpa package so that
>> users of old emacs (at some point of course, say emacs-27) can use it to
>> report bugs?
>
> I am not a fan of small ELPA packages, but what I'd like to bring up
> again was the proposal to add package.el itself to ELPA.  I wrote a
> patch in <873559q83j.fsf@posteo.net> that should arrange everything
> necessary for this move, there are still a few points that should be
> discussed in terms of stability and recovering from a possibly
> inconsistent state.  I think I'll create a feature branch some day soon
> to make the proposal more concrete.

I have pushed the patch from that thread, together with a patch for
package-vc and a custom command that would revert Emacs to use the
built-in version of package.el.  The branch is called
"feature/elpa-package", and I have added to tarballs with packages built
by elpa-admin.el in case anyone wants to try out the packages.  I'll be
testing these tarballs with older versions of Emacs, to see how that
works out.


--=-=-Content-Type: application/x-tar
Content-Disposition: attachment; filename=package.tar
Content-Transfer-Encoding: base64

cGFja2FnZS0xLjEuMS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1
MAAwMDAxNzUwADAwMDAwMDAwMDAwADE0NDEzMzYzMTUxADAxMjQ0MgAgNQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw
YWNrYWdlLTEuMS4xL3BhY2thZ2UtcGtnLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUw
ADAwMDE3NTAAMDAwMDAwMDA3NDMAMTQ0MTMzNjMxNTEAMDE1MTQyACAwAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcGhpbGlwAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABwaGlsaXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7
IEdlbmVyYXRlZCBwYWNrYWdlIGRlc2NyaXB0aW9uIGZyb20gcGFja2FnZS5lbCAgLSotIG5vLWJ5
dGUtY29tcGlsZTogdCAtKi0KKGRlZmluZS1wYWNrYWdlICJwYWNrYWdlIiAiMS4xLjEiICJTaW1w
bGUgcGFja2FnZSBzeXN0ZW0gZm9yIEVtYWNzIiAnKChlbWFjcyAiMjYuMSIpIChjb21wYXQgIjI5
LjEuMC4wIikpIDpjb21taXQgIjFmY2Y1NjcyNTg0ODk4NGVmNmRhNTBlZjJiN2ExMzBlMWZmZDMy
ODIiIDp1cmwgImh0dHBzOi8vZWxwYS5nbnUub3JnL3BhY2thZ2VzL3BhY2thZ2UuaHRtbCIgOmF1
dGhvcnMgJygoIlRvbSBUcm9tZXkiIC4gInRyb21leUByZWRoYXQuY29tIikgKCJEYW5pZWwgSGFj
a25leSIgLiAiZGFuQGhheG5leS5vcmciKSkgOm1haW50YWluZXIgJygoIlRvbSBUcm9tZXkiIC4g
InRyb21leUByZWRoYXQuY29tIikgKCJEYW5pZWwgSGFja25leSIgLiAiZGFuQGhheG5leS5vcmci
KSkgOmtleXdvcmRzICcoInRvb2xzIikpCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFj
a2FnZS0xLjEuMS9wYWNrYWdlLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAw
MDAxNzUwADAwMDAwNTc3MDYwADE0NDEzMzYyNDU3ADAxNDQwNgAgMAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ozsg
cGFja2FnZS5lbCAtLS0gU2ltcGxlIHBhY2thZ2Ugc3lzdGVtIGZvciBFbWFjcyAgLSotIGxleGlj
YWwtYmluZGluZzp0IC0qLQoKOzsgQ29weXJpZ2h0IChDKSAyMDA3LTIwMjMgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuCgo7OyBBdXRob3I6IFRvbSBUcm9tZXkgPHRyb21leUByZWRoYXQu
Y29tPgo7OyAgICAgICAgIERhbmllbCBIYWNrbmV5IDxkYW5AaGF4bmV5Lm9yZz4KOzsgQ3JlYXRl
ZDogMTAgTWFyIDIwMDcKOzsgVmVyc2lvbjogMS4xLjEKOzsgS2V5d29yZHM6IHRvb2xzCjs7IFBh
Y2thZ2UtUmVxdWlyZXM6ICgoZW1hY3MgIjI2LjEiKSAoY29tcGF0ICIyOS4xLjAuMCIpKQoKOzsg
VGhpcyBpcyBhIEdOVSBFTFBBIDpjb3JlIHBhY2thZ2UuICBBdm9pZCBmdW5jdGlvbmFsaXR5IHRo
YXQgaXMgbm90Cjs7IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiBFbWFjcyByZWNvcmRl
ZCBhYm92ZS4KCjs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KCjs7IEdOVSBFbWFj
cyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5
Cjs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5Cjs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2
ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCjs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCgo7OyBHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCBHTlUg
RW1hY3MuICBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7
IENvbW1lbnRhcnk6Cgo7OyBUaGUgaWRlYSBiZWhpbmQgcGFja2FnZS5lbCBpcyB0byBiZSBhYmxl
IHRvIGRvd25sb2FkIHBhY2thZ2VzIGFuZAo7OyBpbnN0YWxsIHRoZW0uICBQYWNrYWdlcyBhcmUg
dmVyc2lvbmVkIGFuZCBoYXZlIHZlcnNpb25lZAo7OyBkZXBlbmRlbmNpZXMuICBGdXJ0aGVybW9y
ZSwgdGhpcyBzdXBwb3J0cyBidWlsdC1pbiBwYWNrYWdlcyB3aGljaAo7OyBtYXkgb3IgbWF5IG5v
dCBiZSBuZXdlciB0aGFuIHVzZXItc3BlY2lmaWVkIHBhY2thZ2VzLiAgVGhpcyBtYWtlcwo7OyBp
dCBwb3NzaWJsZSB0byB1cGdyYWRlIEVtYWNzIGFuZCBhdXRvbWF0aWNhbGx5IGRpc2FibGUgcGFj
a2FnZXMKOzsgd2hpY2ggaGF2ZSBtb3ZlZCBmcm9tIGV4dGVybmFsIHRvIGNvcmUuICAoTm90ZSB0
aG91Z2ggdGhhdCB3ZSBkb24ndAo7OyBjdXJyZW50bHkgcmVnaXN0ZXIgYW55IG9mIHRoZXNlLCBz
byB0aGlzIGZlYXR1cmUgZG9lcyBub3QgYWN0dWFsbHkKOzsgd29yay4pCgo7OyBBIHBhY2thZ2Ug
aXMgZGVzY3JpYmVkIGJ5IGl0cyBuYW1lIGFuZCB2ZXJzaW9uLiAgVGhlIGRpc3RyaWJ1dGlvbgo7
OyBmb3JtYXQgaXMgZWl0aGVyIGEgdGFyIGZpbGUgb3IgYSBzaW5nbGUgLmVsIGZpbGUuCgo7OyBB
IHRhciBmaWxlIHNob3VsZCBiZSBuYW1lZCAiTkFNRS1WRVJTSU9OLnRhciIuICBUaGUgdGFyIGZp
bGUgbXVzdAo7OyB1bnBhY2sgaW50byBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgcGFja2Fn
ZSBhbmQgdmVyc2lvbjoKOzsgIk5BTUUtVkVSU0lPTiIuICBJdCBtdXN0IGNvbnRhaW4gYSBmaWxl
IG5hbWVkICJQQUNLQUdFLXBrZy5lbCIKOzsgd2hpY2ggY29uc2lzdHMgb2YgYSBjYWxsIHRvIGRl
ZmluZS1wYWNrYWdlLiAgSXQgbWF5IGFsc28gY29udGFpbiBhCjs7ICJkaXIiIGZpbGUgYW5kIHRo
ZSBpbmZvIGZpbGVzIGl0IHJlZmVyZW5jZXMuCgo7OyBBIC5lbCBmaWxlIGlzIG5hbWVkICJOQU1F
LVZFUlNJT04uZWwiIGluIHRoZSByZW1vdGUgYXJjaGl2ZSwgYnV0IGlzCjs7IGluc3RhbGxlZCBh
cyBzaW1wbHkgIk5BTUUuZWwiIGluIGEgZGlyZWN0b3J5IG5hbWVkICJOQU1FLVZFUlNJT04iLgoK
OzsgVGhlIGRvd25sb2FkZXIgZG93bmxvYWRzIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMuICBCeSBk
ZWZhdWx0LAo7OyBwYWNrYWdlcyBjb21lIGZyb20gdGhlIG9mZmljaWFsIEdOVSBzb3VyY2VzLCBi
dXQgb3RoZXJzIG1heSBiZQo7OyBhZGRlZCBieSBjdXN0b21pemluZyB0aGUgYHBhY2thZ2UtYXJj
aGl2ZXMnIGFsaXN0LiAgUGFja2FnZXMgZ2V0Cjs7IGJ5dGUtY29tcGlsZWQgYXQgaW5zdGFsbCB0
aW1lLgoKOzsgQXQgYWN0aXZhdGlvbiB0aW1lIHdlIHdpbGwgc2V0IHVwIHRoZSBsb2FkLXBhdGgg
YW5kIHRoZSBpbmZvIHBhdGgsCjs7IGFuZCB3ZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2UncyBhdXRv
bG9hZHMuICBJZiBhIHBhY2thZ2Uncwo7OyBkZXBlbmRlbmNpZXMgYXJlIG5vdCBhdmFpbGFibGUs
IHdlIHdpbGwgbm90IGFjdGl2YXRlIHRoYXQgcGFja2FnZS4KCjs7IENvbmNlcHR1YWxseSBhIHBh
Y2thZ2UgaGFzIG11bHRpcGxlIHN0YXRlIHRyYW5zaXRpb25zOgo7Owo7OyAqIERvd25sb2FkLiAg
RmV0Y2hpbmcgdGhlIHBhY2thZ2UgZnJvbSBFTFBBLgo7OyAqIEluc3RhbGwuICBVbnRhciB0aGUg
cGFja2FnZSwgb3Igd3JpdGUgdGhlIC5lbCBmaWxlLCBpbnRvCjs7ICAgfi8uZW1hY3MuZC9lbHBh
LyBkaXJlY3RvcnkuCjs7ICogQXV0b2xvYWQgZ2VuZXJhdGlvbi4KOzsgKiBCeXRlIGNvbXBpbGUu
ICBDdXJyZW50bHkgdGhpcyBwaGFzZSBpcyBkb25lIGR1cmluZyBpbnN0YWxsLAo7OyAgIGJ1dCB3
ZSBtYXkgY2hhbmdlIHRoaXMuCjs7ICogQWN0aXZhdGUuICBFdmFsdWF0ZSB0aGUgYXV0b2xvYWRz
IGZvciB0aGUgcGFja2FnZSB0byBtYWtlIGl0Cjs7ICAgYXZhaWxhYmxlIHRvIHRoZSB1c2VyLgo7
OyAqIExvYWQuICBBY3R1YWxseSBsb2FkIHRoZSBwYWNrYWdlIGFuZCBydW4gc29tZSBjb2RlIGZy
b20gaXQuCgo7OyBPdGhlciBleHRlcm5hbCBmdW5jdGlvbnMgeW91IG1heSB3YW50IHRvIHVzZToK
OzsKOzsgTS14IGxpc3QtcGFja2FnZXMKOzsgICAgRW50ZXJzIGEgbW9kZSBzaW1pbGFyIHRvIGJ1
ZmZlci1tZW51IHdoaWNoIGxldHMgeW91IG1hbmFnZQo7OyAgICBwYWNrYWdlcy4gIFlvdSBjYW4g
Y2hvb3NlIHBhY2thZ2VzIGZvciBpbnN0YWxsIChtYXJrIHdpdGggImkiLAo7OyAgICB0aGVuICJ4
IiB0byBleGVjdXRlKSBvciBkZWxldGlvbiwgYW5kIHlvdSBjYW4gc2VlIHdoYXQgcGFja2FnZXMK
OzsgICAgYXJlIGF2YWlsYWJsZS4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBs
YXRlc3QgbGlzdCBvZgo7OyAgICBwYWNrYWdlcyBmcm9tIEVMUEEuCjs7Cjs7IE0teCBwYWNrYWdl
LWluc3RhbGwtZnJvbS1idWZmZXIKOzsgICAgSW5zdGFsbCBhIHBhY2thZ2UgY29uc2lzdGluZyBv
ZiBhIHNpbmdsZSAuZWwgZmlsZSB0aGF0IGFwcGVhcnMKOzsgICAgaW4gdGhlIGN1cnJlbnQgYnVm
ZmVyLiAgVGhpcyBvbmx5IHdvcmtzIGZvciBwYWNrYWdlcyB3aGljaAo7OyAgICBkZWZpbmUgYSBW
ZXJzaW9uIGhlYWRlciBwcm9wZXJseTsgcGFja2FnZS5lbCBhbHNvIHN1cHBvcnRzIHRoZQo7OyAg
ICBleHRlbnNpb24gaGVhZGVycyBQYWNrYWdlLVZlcnNpb24gKGluIGNhc2UgVmVyc2lvbiBpcyBh
biBSQ1MgaWQKOzsgICAgb3Igc2ltaWxhciksIGFuZCBQYWNrYWdlLVJlcXVpcmVzIChpZiB0aGUg
cGFja2FnZSByZXF1aXJlcyBvdGhlcgo7OyAgICBwYWNrYWdlcykuCjs7Cjs7IE0teCBwYWNrYWdl
LWluc3RhbGwtZmlsZQo7OyAgICBJbnN0YWxsIGEgcGFja2FnZSBmcm9tIHRoZSBpbmRpY2F0ZWQg
ZmlsZS4gIFRoZSBwYWNrYWdlIGNhbiBiZQo7OyAgICBlaXRoZXIgYSB0YXIgZmlsZSBvciBhIC5l
bCBmaWxlLiAgQSB0YXIgZmlsZSBtdXN0IGNvbnRhaW4gYW4KOzsgICAgYXBwcm9wcmlhdGVseS1u
YW1lZCAiLXBrZy5lbCIgZmlsZTsgYSAuZWwgZmlsZSBtdXN0IGJlIHByb3Blcmx5Cjs7ICAgIGZv
cm1hdHRlZCBhcyB3aXRoIGBwYWNrYWdlLWluc3RhbGwtZnJvbS1idWZmZXInLgoKOzs7IFRoYW5r
czoKOzs7IChzb3J0ZWQgYnkgc29ydC1saW5lcyk6Cgo7OyBKaW0gQmxhbmR5IDxqaW1iQHJlZC1i
ZWFuLmNvbT4KOzsgS2FybCBGb2dlbCA8a2ZvZ2VsQHJlZC1iZWFuLmNvbT4KOzsgS2V2aW4gUnlk
ZSA8dXNlcjQyQHppcC5jb20uYXU+Cjs7IExhd3JlbmNlIE1pdGNoZWxsCjs7IE1pY2hhZWwgT2xz
b24gPG13b2xzb25AbWVtYmVyLmZzZi5vcmc+Cjs7IFNlYmFzdGlhbiBUZW5uYW50IDxzZWJ5dGVA
c21vbG55LnBsdXMuY29tPgo7OyBTdGVmYW4gTW9ubmllciA8bW9ubmllckBpcm8udW1vbnRyZWFs
LmNhPgo7OyBWaW5pY2l1cyBKb3NlIExhdG9ycmUgPHZpbmljaXVzamwuZ251QGdtYWlsLmNvbT4K
OzsgUGhpbCBIYWdlbGJlcmcgPHBoaWxAaGFnZWxiLm9yZz4KCjs7OyBUb0RvOgoKOzsgLSBwdXR0
aW5nIGluZm8gZGlycyBhdCB0aGUgc3RhcnQgb2YgdGhlIGluZm8gcGF0aCBtZWFucwo7OyAgIHVz
ZXJzIHNlZSBhIHdlaXJkIG9yZGVyaW5nIG9mIGNhdGVnb3JpZXMuICBPVE9IIHdlIHdhbnQgdG8K
OzsgICBvdmVycmlkZSBsYXRlciBlbnRyaWVzLiAgbWF5YmUgZW1hY3MgbmVlZHMgdG8gZW5mb3Jj
ZQo7OyAgIHRoZSBzdGFuZGFyZCBsYXlvdXQ/Cjs7IC0gcHV0IGJ5dGVjb2RlIGluIGEgc2VwYXJh
dGUgZGlyZWN0b3J5IHRyZWUKOzsgLSBwZXJoYXBzIGdpdmUgdXNlcnMgYSB3YXkgdG8gcmVjb21w
aWxlIHRoZWlyIGJ5dGVjb2RlCjs7ICAgb3IgZG8gaXQgYXV0b21hdGljYWxseSB3aGVuIGVtYWNz
IGNoYW5nZXMKOzsgLSBnaXZlIHVzZXJzIGEgd2F5IHRvIGtub3cgd2hldGhlciBhIHBhY2thZ2Ug
aXMgaW5zdGFsbGVkIG9rCjs7IC0gZ2l2ZSB1c2VycyBhIHdheSB0byB2aWV3IGEgcGFja2FnZSdz
IGRvY3VtZW50YXRpb24gd2hlbiBpdAo7OyAgIG9ubHkgYXBwZWFycyBpbiB0aGUgLmVsCjs7IC0g
dXNlL2V4dGVuZCBjaGVja2RvYyBzbyBwZW9wbGUgY2FuIHRlbGwgaWYgdGhlaXIgcGFja2FnZSB3
aWxsIHdvcmsKOzsgLSAiaW5zdGFsbGVkIiBpbnN0ZWFkIG9mIGEgYmxhbmsgaW4gdGhlIHN0YXR1
cyBjb2x1bW4KOzsgLSB0cmFtcCBuZWVkcyBpdHMgZmlsZXMgdG8gYmUgY29tcGlsZWQgaW4gYSBj
ZXJ0YWluIG9yZGVyLgo7OyAgIGhvdyB0byBoYW5kbGUgdGhpcz8gIGZpeCB0cmFtcD8KOzsgLSBt
YXliZSB3ZSBuZWVkIHNlcGFyYXRlIC5lbGMgZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgZW1hY3MK
OzsgICB2ZXJzaW9ucy4gIFRoYXQgd2F5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNhbiB3b3Jr
LiAgQnV0IHdvdWxkCjs7ICAgdGhpcyBicmVhayBhbnl0aGluZz8KOzsgLSBXaWxsaWFtIFh1IHN1
Z2dlc3RzIGJlaW5nIGFibGUgdG8gb3BlbiBhIHBhY2thZ2UgZmlsZSB3aXRob3V0Cjs7ICAgaW5z
dGFsbGluZyBpdAo7OyAtIEludGVyZmFjZSB3aXRoIGRlc2t0b3AuZWwgc28gdGhhdCByZXN0YXJ0
aW5nIGFmdGVyIGFuIGluc3RhbGwKOzsgICB3b3JrcyBwcm9wZXJseQo7OyAtIFVzZSBoaWVyYXJj
aGljYWwgbGF5b3V0LiAgUEtHL2V0YyBQS0cvbGlzcCBQS0cvaW5mbwo7OyAgIC4uLiBleGNlcHQg
bWF5YmUgbGlzcD8KOzsgLSBJdCBtYXkgYmUgbmljZSB0byBoYXZlIGEgbWFjcm8gdGhhdCBleHBh
bmRzIHRvIHRoZSBwYWNrYWdlJ3MKOzsgICBwcml2YXRlIGRhdGEgZGlyLCBha2EgIi4uLi9ldGMi
LiAgT3IsIG1heWJlIGRhdGEtZGlyZWN0b3J5Cjs7ICAgbmVlZHMgdG8gYmUgYSBsaXN0ICh0aG91
Z2ggdGhpcyB3b3VsZCBiZSBsZXNzIG5pY2UpCjs7ICAgYSBmZXcgcGFja2FnZXMgd2FudCB0aGlz
LCBlZyBzb2tvYmFuCjs7IC0gQWxsb3cgbXVsdGlwbGUgdmVyc2lvbnMgb24gdGhlIHNlcnZlciwg
c28gdGhhdCBpZiBhIHVzZXIgZG9lc24ndAo7OyAgIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Ig
dGhlIG1vc3QgcmVjZW50IHZlcnNpb24gdGhleSBjYW4gc3RpbGwKOzsgICBpbnN0YWxsIGFuIG9s
ZGVyIG9uZS4KOzsgLSBBbGxvdyBvcHRpb25hbCBwYWNrYWdlIGRlcGVuZGVuY2llcwo7OyAgIHRo
ZW4gaWYgd2UgcmVxdWlyZSAnYmJkYicsIGJiZGItc3BlY2lmaWMgbGlzcCBpbiBsaXNwL2JiZGIK
OzsgICBhbmQganVzdCBkb24ndCBjb21waWxlIHRvIGFkZCB0byBsb2FkIHBhdGggLi4uPwo7OyAt
IE91ciB0cmVhdG1lbnQgb2YgdGhlIGluZm8gcGF0aCBpcyBzb21ld2hhdCBib2d1cwoKOzs7IENv
ZGU6CgoocmVxdWlyZSAnY2wtbGliKQooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ3N1YnIt
eCkpCihldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAnZXBnKSkgICAgICA7Rm9yIHNldGYgYWNj
ZXNzb3JzLgooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ2lubGluZSkpICAgO0ZvciBgZGVm
aW5lLWlubGluZScKKHJlcXVpcmUgJ2NvbXBhdCBuaWwgJ25vZXJyb3IpCihyZXF1aXJlICdzZXEp
CgoocmVxdWlyZSAndGFidWxhdGVkLWxpc3QpCihyZXF1aXJlICdtYWNyb2V4cCkKKHJlcXVpcmUg
J3VybC1oYW5kbGVycykKKHJlcXVpcmUgJ2Jyb3dzZS11cmwpCgooZGVmZ3JvdXAgcGFja2FnZSBu
aWwKICAiTWFuYWdlciBmb3IgRW1hY3MgTGlzcCBwYWNrYWdlcy4iCiAgOmdyb3VwICdhcHBsaWNh
dGlvbnMKICA6dmVyc2lvbiAiMjQuMSIpCgoMCjs7OyBDdXN0b21pemF0aW9uIG9wdGlvbnMKCjs7
OyMjI2F1dG9sb2FkCihkZWZjdXN0b20gcGFja2FnZS1lbmFibGUtYXQtc3RhcnR1cCB0CiAgIldo
ZXRoZXIgdG8gbWFrZSBpbnN0YWxsZWQgcGFja2FnZXMgYXZhaWxhYmxlIHdoZW4gRW1hY3Mgc3Rh
cnRzLgpJZiBub24tbmlsLCBwYWNrYWdlcyBhcmUgbWFkZSBhdmFpbGFibGUgYmVmb3JlIHJlYWRp
bmcgdGhlIGluaXQKZmlsZSAoYnV0IGFmdGVyIHJlYWRpbmcgdGhlIGVhcmx5IGluaXQgZmlsZSku
ICBUaGlzIG1lYW5zIHRoYXQgaWYKeW91IHdpc2ggdG8gc2V0IHRoaXMgdmFyaWFibGUsIHlvdSBt
dXN0IGRvIHNvIGluIHRoZSBlYXJseSBpbml0CmZpbGUuICBSZWdhcmRsZXNzIG9mIHRoZSB2YWx1
ZSBvZiB0aGlzIHZhcmlhYmxlLCBwYWNrYWdlcyBhcmUgbm90Cm1hZGUgYXZhaWxhYmxlIGlmIGB1
c2VyLWluaXQtZmlsZScgaXMgbmlsIChlLmcuIEVtYWNzIHdhcyBzdGFydGVkCndpdGggXCItcVwi
KS4KCkV2ZW4gaWYgdGhlIHZhbHVlIGlzIG5pbCwgeW91IGNhbiB0eXBlIFxcW3BhY2thZ2UtaW5p
dGlhbGl6ZV0gdG8KbWFrZSBpbnN0YWxsZWQgcGFja2FnZXMgYXZhaWxhYmxlIGF0IGFueSB0aW1l
LCBvciB5b3UgY2FuCmNhbGwgKHBhY2thZ2UtYWN0aXZhdGUtYWxsKSBpbiB5b3VyIGluaXQtZmls
ZS4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6dmVyc2lvbiAiMjQuMSIpCgooZGVmY3VzdG9tIHBhY2th
Z2UtbG9hZC1saXN0ICcoYWxsKQogICJMaXN0IG9mIHBhY2thZ2VzIGZvciBgcGFja2FnZS1hY3Rp
dmF0ZS1hbGwnIHRvIG1ha2UgYXZhaWxhYmxlLgpFYWNoIGVsZW1lbnQgaW4gdGhpcyBsaXN0IHNo
b3VsZCBiZSBhIGxpc3QgKE5BTUUgVkVSU0lPTiksIG9yIHRoZQpzeW1ib2wgYGFsbCcuICBUaGUg
c3ltYm9sIGBhbGwnIHNheXMgdG8gbWFrZSBhdmFpbGFibGUgdGhlIGxhdGVzdAppbnN0YWxsZWQg
dmVyc2lvbnMgb2YgYWxsIHBhY2thZ2VzIG5vdCBzcGVjaWZpZWQgYnkgb3RoZXIKZWxlbWVudHMu
CgpGb3IgYW4gZWxlbWVudCAoTkFNRSBWRVJTSU9OKSwgTkFNRSBpcyBhIHBhY2thZ2UgbmFtZSAo
YSBzeW1ib2wpLgpWRVJTSU9OIHNob3VsZCBiZSB0LCBhIHN0cmluZywgb3IgbmlsLgpJZiBWRVJT
SU9OIGlzIHQsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIGlzIG1hZGUgYXZhaWxhYmxlLgpJZiBW
RVJTSU9OIGlzIGEgc3RyaW5nLCBvbmx5IHRoYXQgdmVyc2lvbiBpcyBldmVyIG1hZGUgYXZhaWxh
YmxlLgogQW55IG90aGVyIHZlcnNpb24sIGV2ZW4gaWYgbmV3ZXIsIGlzIHNpbGVudGx5IGlnbm9y
ZWQuCiBIZW5jZSwgdGhlIHBhY2thZ2UgaXMgXCJoZWxkXCIgYXQgdGhhdCB2ZXJzaW9uLgpJZiBW
RVJTSU9OIGlzIG5pbCwgdGhlIHBhY2thZ2UgaXMgbm90IG1hZGUgYXZhaWxhYmxlIChpdCBpcyBc
ImRpc2FibGVkXCIpLiIKICA6dHlwZSAnKHJlcGVhdCAoY2hvaWNlIChjb25zdCBhbGwpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAobGlzdCA6dGFnICJTcGVjaWZpYyBwYWNrYWdlIgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbCA6dGFnICJQYWNrYWdlIG5hbWUiKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNob2ljZSA6dGFnICJWZXJzaW9uIgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJkaXNhYmxlIiBuaWwpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIm1vc3QgcmVjZW50IiB0KQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAic3BlY2lmaWMgdmVy
c2lvbiIpKSkpKQogIDpyaXNreSB0CiAgOnZlcnNpb24gIjI0LjEiKQoKKGRlZmN1c3RvbSBwYWNr
YWdlLWFyY2hpdmVzIGAoKCJnbnUiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwo
Zm9ybWF0ICJodHRwJXM6Ly9lbHBhLmdudS5vcmcvcGFja2FnZXMvIgogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChnbnV0bHMtYXZhaWxhYmxlLXApICJzIiAiIikp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm5vbmdudSIgLgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLChmb3JtYXQgImh0dHAlczovL2VscGEubm9uZ251Lm9yZy9ub25n
bnUvIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChnbnV0bHMt
YXZhaWxhYmxlLXApICJzIiAiIikpKSkKICAiQW4gYWxpc3Qgb2YgYXJjaGl2ZXMgZnJvbSB3aGlj
aCB0byBmZXRjaC4KVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBHTlUgRW1hY3MgcGFj
a2FnZSByZXBvc2l0b3J5LgoKRWFjaCBlbGVtZW50IGhhcyB0aGUgZm9ybSAoSUQgLiBMT0NBVElP
TikuCiBJRCBpcyBhbiBhcmNoaXZlIG5hbWUsIGFzIGEgc3RyaW5nLgogTE9DQVRJT04gc3BlY2lm
aWVzIHRoZSBiYXNlIGxvY2F0aW9uIGZvciB0aGUgYXJjaGl2ZS4KICBJZiBpdCBzdGFydHMgd2l0
aCBcImh0dHAocyk6XCIsIGl0IGlzIHRyZWF0ZWQgYXMgYW4gSFRUUChTKSBVUkw7CiAgb3RoZXJ3
aXNlIGl0IHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KICAoT3RoZXIgdHlw
ZXMgb2YgVVJMIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4pCgpPbmx5IGFkZCBsb2NhdGlv
bnMgdGhhdCB5b3UgdHJ1c3QsIHNpbmNlIGZldGNoaW5nIGFuZCBpbnN0YWxsaW5nCmEgcGFja2Fn
ZSBjYW4gcnVuIGFyYml0cmFyeSBjb2RlLgoKSFRUUFMgVVJMcyBzaG91bGQgYmUgdXNlZCB3aGVy
ZSBwb3NzaWJsZSwgYXMgdGhleSBvZmZlciBzdXBlcmlvcgpzZWN1cml0eS4iCiAgOnR5cGUgJyhh
bGlzdCA6a2V5LXR5cGUgKHN0cmluZyA6dGFnICJBcmNoaXZlIG5hbWUiKQogICAgICAgICAgICAg
ICAgOnZhbHVlLXR5cGUgKHN0cmluZyA6dGFnICJVUkwgb3IgZGlyZWN0b3J5IG5hbWUiKSkKICA6
cmlza3kgdAogIDp2ZXJzaW9uICIyOC4xIikKCihkZWZjdXN0b20gcGFja2FnZS1tZW51LWhpZGUt
bG93LXByaW9yaXR5ICdhcmNoaXZlCiAgIklmIG5vbi1uaWwsIGhpZGUgbG93IHByaW9yaXR5IHBh
Y2thZ2VzIGZyb20gdGhlIHBhY2thZ2VzIG1lbnUuCkEgcGFja2FnZSBpcyBjb25zaWRlcmVkIGxv
dyBwcmlvcml0eSBpZiB0aGVyZSdzIGFub3RoZXIgdmVyc2lvbgpvZiBpdCBhdmFpbGFibGUgc3Vj
aCB0aGF0OgogICAgKGEpIHRoZSBhcmNoaXZlIG9mIHRoZSBvdGhlciBwYWNrYWdlIGlzIGhpZ2hl
ciBwcmlvcml0eSB0aGFuCiAgICB0aGlzIG9uZSwgYXMgcGVyIGBwYWNrYWdlLWFyY2hpdmUtcHJp
b3JpdGllcyc7CiAgb3IKICAgIChiKSB0aGV5IGJvdGggaGF2ZSB0aGUgc2FtZSBhcmNoaXZlIHBy
aW9yaXR5IGJ1dCB0aGUgb3RoZXIKICAgIHBhY2thZ2UgaGFzIGEgaGlnaGVyIHZlcnNpb24gbnVt
YmVyLgoKVGhpcyB2YXJpYWJsZSBoYXMgdGhyZWUgcG9zc2libGUgdmFsdWVzOgogICAgbmlsOiBu
byBwYWNrYWdlcyBhcmUgaGlkZGVuOwogICAgYGFyY2hpdmUnOiBvbmx5IGNyaXRlcmlvbiAoYSkg
aXMgdXNlZDsKICAgIHQ6IGJvdGggY3JpdGVyaWEgYXJlIHVzZWQuCgpUaGlzIHZhcmlhYmxlIGhh
cyBubyBlZmZlY3QgaWYgYHBhY2thZ2UtbWVudS0taGlkZS1wYWNrYWdlcycgaXMKbmlsLCBzbyBp
dCBjYW4gYmUgdG9nZ2xlZCB3aXRoIFxcPHBhY2thZ2UtbWVudS1tb2RlLW1hcD5cXFtwYWNrYWdl
LW1lbnUtdG9nZ2xlLWhpZGluZ10uIgogIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJEb24n
dCBoaWRlIGFueXRoaW5nIiBuaWwpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkhpZGUg
cGVyIHBhY2thZ2UtYXJjaGl2ZS1wcmlvcml0aWVzIgogICAgICAgICAgICAgICAgICAgICAgICBh
cmNoaXZlKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJIaWRlIHBlciBhcmNoaXZlIGFu
ZCB2ZXJzaW9uIG51bWJlciIgdCkpCiAgOnZlcnNpb24gIjI1LjEiKQoKKGRlZmN1c3RvbSBwYWNr
YWdlLWFyY2hpdmUtcHJpb3JpdGllcyBuaWwKICAiQW4gYWxpc3Qgb2YgcHJpb3JpdGllcyBmb3Ig
cGFja2FnZXMuCgpFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb3JtIChBUkNISVZFLUlEIC4gUFJJT1JJ
VFkpLgoKV2hlbiBpbnN0YWxsaW5nIHBhY2thZ2VzLCB0aGUgcGFja2FnZSB3aXRoIHRoZSBoaWdo
ZXN0IHZlcnNpb24KbnVtYmVyIGZyb20gdGhlIGFyY2hpdmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlv
cml0eSBpcwpzZWxlY3RlZC4gIFdoZW4gaGlnaGVyIHZlcnNpb25zIGFyZSBhdmFpbGFibGUgZnJv
bSBhcmNoaXZlcyB3aXRoCmxvd2VyIHByaW9yaXRpZXMsIHRoZSB1c2VyIGhhcyB0byBzZWxlY3Qg
dGhvc2UgbWFudWFsbHkuCgpBcmNoaXZlcyBub3QgaW4gdGhpcyBsaXN0IGhhdmUgdGhlIHByaW9y
aXR5IDAsIGFzIGhhdmUgcGFja2FnZXMKdGhhdCBhcmUgYWxyZWFkeSBpbnN0YWxsZWQuICBJZiB5
b3UgdXNlIG5lZ2F0aXZlIHByaW9yaXRpZXMgZm9yCnRoZSBhcmNoaXZlcywgdGhleSB3aWxsIG5v
dCBiZSB1cGdyYWRlZCBhdXRvbWF0aWNhbGx5LgoKU2VlIGFsc28gYHBhY2thZ2UtbWVudS1oaWRl
LWxvdy1wcmlvcml0eScuIgogIDp0eXBlICcoYWxpc3QgOmtleS10eXBlIChzdHJpbmcgOnRhZyAi
QXJjaGl2ZSBuYW1lIikKICAgICAgICAgICAgICAgIDp2YWx1ZS10eXBlIChpbnRlZ2VyIDp0YWcg
IlByaW9yaXR5IChkZWZhdWx0IGlzIDApIikpCiAgOnJpc2t5IHQKICA6dmVyc2lvbiAiMjUuMSIp
CgooZGVmY3VzdG9tIHBhY2thZ2UtcGlubmVkLXBhY2thZ2VzIG5pbAogICJBbiBhbGlzdCBvZiBw
YWNrYWdlcyB0aGF0IGFyZSBwaW5uZWQgdG8gc3BlY2lmaWMgYXJjaGl2ZXMuClRoaXMgY2FuIGJl
IHVzZWZ1bCBpZiB5b3UgaGF2ZSBtdWx0aXBsZSBwYWNrYWdlIGFyY2hpdmVzIGVuYWJsZWQsCmFu
ZCB3YW50IHRvIGNvbnRyb2wgd2hpY2ggYXJjaGl2ZSBhIGdpdmVuIHBhY2thZ2UgZ2V0cyBpbnN0
YWxsZWQgZnJvbS4KCkVhY2ggZWxlbWVudCBvZiB0aGUgYWxpc3QgaGFzIHRoZSBmb3JtIChQQUNL
QUdFIC4gQVJDSElWRSksIHdoZXJlOgogUEFDS0FHRSBpcyBhIHN5bWJvbCByZXByZXNlbnRpbmcg
YSBwYWNrYWdlCiBBUkNISVZFIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBhcmNoaXZlIChp
dCBzaG91bGQgYmUgdGhlIGNhciBvZgphbiBlbGVtZW50IGluIGBwYWNrYWdlLWFyY2hpdmVzJywg
ZS5nLiBcImdudVwiKS4KCkFkZGluZyBhbiBlbnRyeSB0byB0aGlzIHZhcmlhYmxlIG1lYW5zIHRo
YXQgb25seSBBUkNISVZFIHdpbGwgYmUKY29uc2lkZXJlZCBhcyBhIHNvdXJjZSBmb3IgUEFDS0FH
RS4gIElmIG90aGVyIGFyY2hpdmVzIHByb3ZpZGUgUEFDS0FHRSwKdGhleSBhcmUgaWdub3JlZCAo
Zm9yIHRoaXMgcGFja2FnZSkuICBJZiBBUkNISVZFIGRvZXMgbm90IGNvbnRhaW4gUEFDS0FHRSwK
dGhlIHBhY2thZ2Ugd2lsbCBiZSB1bmF2YWlsYWJsZS4iCiAgOnR5cGUgJyhhbGlzdCA6a2V5LXR5
cGUgKHN5bWJvbCA6dGFnICJQYWNrYWdlIikKICAgICAgICAgICAgICAgIDp2YWx1ZS10eXBlIChz
dHJpbmcgOnRhZyAiQXJjaGl2ZSBuYW1lIikpCiAgOzsgVGhpcyBjb3VsZCBwcmV2ZW50IHlvdSBm
cm9tIHJlY2VpdmluZyB1cGRhdGVzIGZvciBhIHBhY2thZ2UsCiAgOzsgdmlhIGFuIGVudHJ5IChQ
QUNLQUdFIC4gTk9OLUVYSVNUSU5HKS4gIFdoaWNoIGNvdWxkIGJlIGFuIGlzc3VlCiAgOzsgaWYg
UEFDS0FHRSBoYXMgYSBrbm93biB2dWxuZXJhYmlsaXR5IHRoYXQgaXMgZml4ZWQgaW4gbmV3ZXIg
dmVyc2lvbnMuCiAgOnJpc2t5IHQKICA6dmVyc2lvbiAiMjQuNCIpCgo7OzsjIyNhdXRvbG9hZAoo
ZGVmY3VzdG9tIHBhY2thZ2UtdXNlci1kaXIgKGxvY2F0ZS11c2VyLWVtYWNzLWZpbGUgImVscGEi
KQogICJEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdXNlcidzIEVtYWNzIExpc3AgcGFja2FnZXMu
ClRoZSBkaXJlY3RvcnkgbmFtZSBzaG91bGQgYmUgYWJzb2x1dGUuCkFwYXJ0IGZyb20gdGhpcyBk
aXJlY3RvcnksIEVtYWNzIGFsc28gbG9va3MgZm9yIHN5c3RlbS13aWRlCnBhY2thZ2VzIGluIGBw
YWNrYWdlLWRpcmVjdG9yeS1saXN0Jy4iCiAgOnR5cGUgJ2RpcmVjdG9yeQogIDppbml0aWFsaXpl
ICMnY3VzdG9tLWluaXRpYWxpemUtZGVsYXkKICA6cmlza3kgdAogIDpncm91cCAnYXBwbGljYXRp
b25zCiAgOnZlcnNpb24gIjI0LjEiKQoKOzs7IyMjYXV0b2xvYWQKKGRlZmN1c3RvbSBwYWNrYWdl
LWRpcmVjdG9yeS1saXN0CiAgOzsgRGVmYXVsdHMgYXJlIHN1YmRpcnMgbmFtZWQgImVscGEiIGlu
IHRoZSBzaXRlLWxpc3AgZGlycy4KICAobGV0IChyZXN1bHQpCiAgICAoZG9saXN0IChmIGxvYWQt
cGF0aCkKICAgICAgKGFuZCAoc3RyaW5ncCBmKQogICAgICAgICAgIChlcXVhbCAoZmlsZS1uYW1l
LW5vbmRpcmVjdG9yeSBmKSAic2l0ZS1saXNwIikKICAgICAgICAgICAocHVzaCAoZXhwYW5kLWZp
bGUtbmFtZSAiZWxwYSIgZikgcmVzdWx0KSkpCiAgICAobnJldmVyc2UgcmVzdWx0KSkKICAiTGlz
dCBvZiBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgRW1hY3MgTGlzcCBwYWNrYWdl
cy4KRWFjaCBkaXJlY3RvcnkgbmFtZSBzaG91bGQgYmUgYWJzb2x1dGUuCgpUaGVzZSBkaXJlY3Rv
cmllcyBjb250YWluIHBhY2thZ2VzIGludGVuZGVkIGZvciBzeXN0ZW0td2lkZTsgaW4KY29udHJh
c3QsIGBwYWNrYWdlLXVzZXItZGlyJyBjb250YWlucyBwYWNrYWdlcyBmb3IgcGVyc29uYWwgdXNl
LiIKICA6dHlwZSAnKHJlcGVhdCBkaXJlY3RvcnkpCiAgOmluaXRpYWxpemUgIydjdXN0b20taW5p
dGlhbGl6ZS1kZWxheQogIDpncm91cCAnYXBwbGljYXRpb25zCiAgOnJpc2t5IHQKICA6dmVyc2lv
biAiMjQuMSIpCgooZGVjbGFyZS1mdW5jdGlvbiBlcGctZmluZC1jb25maWd1cmF0aW9uICJlcGct
Y29uZmlnIgogICAgICAgICAgICAgICAgICAocHJvdG9jb2wgJm9wdGlvbmFsIG5vLWNhY2hlIHBy
b2dyYW0tYWxpc3QpKQoKKGRlZmN1c3RvbSBwYWNrYWdlLWdudXBnaG9tZS1kaXIgKGV4cGFuZC1m
aWxlLW5hbWUgImdudXBnIiBwYWNrYWdlLXVzZXItZGlyKQogICJEaXJlY3RvcnkgY29udGFpbmlu
ZyBHbnVQRyBrZXlyaW5nIG9yIG5pbC4KVGhpcyB2YXJpYWJsZSBzcGVjaWZpZXMgdGhlIEdudVBH
IGhvbWUgZGlyZWN0b3J5IHVzZWQgYnkgcGFja2FnZS4KVGhhdCBkaXJlY3RvcnkgaXMgcGFzc2Vk
IHZpYSB0aGUgb3B0aW9uIFwiLS1ob21lZGlyXCIgdG8gR251UEcuCklmIG5pbCwgZG8gbm90IHVz
ZSB0aGUgb3B0aW9uIFwiLS1ob21lZGlyXCIsIGJ1dCBzdGljayB3aXRoIEdudVBHJ3MKZGVmYXVs
dCBkaXJlY3RvcnkuIgogIDp0eXBlIGAoY2hvaWNlCiAgICAgICAgICAoY29uc3QKICAgICAgICAg
ICA6dGFnICJEZWZhdWx0IEVtYWNzIHBhY2thZ2UgbWFuYWdlbWVudCBHbnVQRyBob21lIGRpcmVj
dG9yeSIKICAgICAgICAgICAsKGV4cGFuZC1maWxlLW5hbWUgImdudXBnIiBwYWNrYWdlLXVzZXIt
ZGlyKSkKICAgICAgICAgIChjb25zdAogICAgICAgICAgIDp0YWcgIkRlZmF1bHQgR251UEcgZGly
ZWN0b3J5IChHbnVQRyBvcHRpb24gLS1ob21lZGlyIG5vdCB1c2VkKSIKICAgICAgICAgICBuaWwp
CiAgICAgICAgICAoZGlyZWN0b3J5IDp0YWcgIkEgc3BlY2lmaWMgR251UEcgLS1ob21lZGlyIikp
CiAgOnJpc2t5IHQKICA6dmVyc2lvbiAiMjYuMSIpCgooZGVmY3VzdG9tIHBhY2thZ2UtY2hlY2st
c2lnbmF0dXJlICdhbGxvdy11bnNpZ25lZAogICJOb24tbmlsIG1lYW5zIHRvIGNoZWNrIHBhY2th
Z2Ugc2lnbmF0dXJlcyB3aGVuIGluc3RhbGxpbmcuCgpUaGlzIGFsc28gYXBwbGllcyB0byB0aGUg
XCJhcmNoaXZlLWNvbnRlbnRzXCIgZmlsZSB0aGF0IGxpc3RzIHRoZQpjb250ZW50cyBvZiB0aGUg
YXJjaGl2ZS4KClRoZSB2YWx1ZSBjYW4gYmUgb25lIG9mOgoKICB0ICAgICAgICAgICAgICAgICAg
QWNjZXB0IGEgcGFja2FnZSBvbmx5IGlmIGl0IGNvbWVzIHdpdGggYXQgbGVhc3QKICAgICAgICAg
ICAgICAgICAgICAgb25lIHZlcmlmaWVkIHNpZ25hdHVyZS4KCiAgYGFsbCcgICAgICAgICAgICAg
IFNhbWUgYXMgdCwgYnV0IHZlcmlmeSBhbGwgc2lnbmF0dXJlcyBpZiB0aGVyZQogICAgICAgICAg
ICAgICAgICAgICBhcmUgbW9yZSB0aGFuIG9uZS4KCiAgYGFsbG93LXVuc2lnbmVkJyAgIEluc3Rh
bGwgYSBwYWNrYWdlIGV2ZW4gaWYgaXQgaXMgdW5zaWduZWQsCiAgICAgICAgICAgICAgICAgICAg
IGJ1dCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpZiBwb3NzaWJsZSAodGhhdAogICAgICAgICAgICAg
ICAgICAgICBpcywgaWYgaXQgaXMgc2lnbmVkLCB3ZSBoYXZlIHRoZSBrZXkgZm9yIGl0LAogICAg
ICAgICAgICAgICAgICAgICBhbmQgR251UEcgaXMgaW5zdGFsbGVkKS4KCiAgbmlsICAgICAgICAg
ICAgICAgIFBhY2thZ2Ugc2lnbmF0dXJlcyBhcmUgaWdub3JlZC4iCiAgOnR5cGUgJyhjaG9pY2Ug
KGNvbnN0IDp2YWx1ZSBuaWwgICAgICAgICAgICA6dGFnICJOZXZlciIpCiAgICAgICAgICAgICAg
ICAgKGNvbnN0IDp2YWx1ZSBhbGxvdy11bnNpZ25lZCA6dGFnICJBbGxvdyB1bnNpZ25lZCIpCiAg
ICAgICAgICAgICAgICAgKGNvbnN0IDp2YWx1ZSB0ICAgICAgICAgICAgICA6dGFnICJDaGVjayBh
bHdheXMiKQogICAgICAgICAgICAgICAgIChjb25zdCA6dmFsdWUgYWxsICAgICAgICAgICAgOnRh
ZyAiQ2hlY2sgYWx3YXlzIChhbGwgc2lnbmF0dXJlcykiKSkKICA6cmlza3kgdAogIDp2ZXJzaW9u
ICIyNy4xIikKCihkZWZ1biBwYWNrYWdlLWNoZWNrLXNpZ25hdHVyZSAoKQogICJDaGVjayB3aGV0
aGVyIHdlIGhhdmUgYSB1c2FibGUgT3BlblBHUCBjb25maWd1cmF0aW9uLgpJZiBzbywgYW5kIHZh
cmlhYmxlIGBwYWNrYWdlLWNoZWNrLXNpZ25hdHVyZScgaXMKYGFsbG93LXVuc2lnbmVkJywgcmV0
dXJuIGBhbGxvdy11bnNpZ25lZCcsIG90aGVyd2lzZSByZXR1cm4gdGhlCnZhbHVlIG9mIHZhcmlh
YmxlIGBwYWNrYWdlLWNoZWNrLXNpZ25hdHVyZScuIgogIChpZiAoZXEgcGFja2FnZS1jaGVjay1z
aWduYXR1cmUgJ2FsbG93LXVuc2lnbmVkKQogICAgICAoYW5kIChlcGctZmluZC1jb25maWd1cmF0
aW9uICdPcGVuUEdQKQogICAgICAgICAgICdhbGxvdy11bnNpZ25lZCkKICAgIHBhY2thZ2UtY2hl
Y2stc2lnbmF0dXJlKSkKCihkZWZjdXN0b20gcGFja2FnZS11bnNpZ25lZC1hcmNoaXZlcyBuaWwK
ICAiTGlzdCBvZiBhcmNoaXZlcyB3aGVyZSB3ZSBkbyBub3QgY2hlY2sgZm9yIHBhY2thZ2Ugc2ln
bmF0dXJlcy4KVGhpcyBzaG91bGQgYmUgYSBsaXN0IG9mIHN0cmluZ3MgbWF0Y2hpbmcgdGhlIG5h
bWVzIG9mIHBhY2thZ2UKYXJjaGl2ZXMgaW4gdGhlIHZhcmlhYmxlIGBwYWNrYWdlLWFyY2hpdmVz
Jy4iCiAgOnR5cGUgJyhyZXBlYXQgKHN0cmluZyA6dGFnICJBcmNoaXZlIG5hbWUiKSkKICA6cmlz
a3kgdAogIDp2ZXJzaW9uICIyNC40IikKCihkZWZjdXN0b20gcGFja2FnZS1zZWxlY3RlZC1wYWNr
YWdlcyBuaWwKICAiU3RvcmUgaGVyZSBwYWNrYWdlcyBpbnN0YWxsZWQgZXhwbGljaXRseSBieSB1
c2VyLgpUaGlzIHZhcmlhYmxlIGlzIGZlZCBhdXRvbWF0aWNhbGx5IGJ5IEVtYWNzIHdoZW4gaW5z
dGFsbGluZyBhIG5ldyBwYWNrYWdlLgpUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgYHBhY2thZ2Ut
YXV0b3JlbW92ZScgdG8gZGVjaWRlCndoaWNoIHBhY2thZ2VzIGFyZSBubyBsb25nZXIgbmVlZGVk
LgpZb3UgY2FuIHVzZSBpdCB0byAocmUpaW5zdGFsbCBwYWNrYWdlcyBvbiBvdGhlciBtYWNoaW5l
cwpieSBydW5uaW5nIGBwYWNrYWdlLWluc3RhbGwtc2VsZWN0ZWQtcGFja2FnZXMnLgoKVG8gY2hl
Y2sgaWYgYSBwYWNrYWdlIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGxpc3QgaGVyZSwgdXNlCmBwYWNr
YWdlLS11c2VyLXNlbGVjdGVkLXAnLCBhcyBpdCBtYXkgcG9wdWxhdGUgdGhlIHZhcmlhYmxlIHdp
dGgKYSBzYW5lIGluaXRpYWwgdmFsdWUuIgogIDp2ZXJzaW9uICIyNS4xIgogIDp0eXBlICcocmVw
ZWF0IHN5bWJvbCkpCgooZGVmY3VzdG9tIHBhY2thZ2UtbmF0aXZlLWNvbXBpbGUgbmlsCiAgIk5v
bi1uaWwgbWVhbnMgdG8gbmF0aXZlbHkgY29tcGlsZSBwYWNrYWdlcyBhcyBwYXJ0IG9mIHRoZWly
IGluc3RhbGxhdGlvbi4KVGhpcyBjb250cm9scyBhaGVhZC1vZi10aW1lIGNvbXBpbGF0aW9uIG9m
IHBhY2thZ2VzIHdoZW4gdGhleSBhcmUKaW5zdGFsbGVkLiAgSWYgdGhpcyBvcHRpb24gaXMgbmls
LCBwYWNrYWdlcyB3aWxsIGJlIG5hdGl2ZWx5CmNvbXBpbGVkIHdoZW4gdGhleSBhcmUgbG9hZGVk
IGZvciB0aGUgZmlyc3QgdGltZS4KClRoaXMgb3B0aW9uIGRvZXMgbm90IGhhdmUgYW55IGVmZmVj
dCBpZiBFbWFjcyB3YXMgbm90IGJ1aWx0IHdpdGgKbmF0aXZlIGNvbXBpbGF0aW9uIHN1cHBvcnQu
IgogIDp0eXBlICcoYm9vbGVhbikKICA6cmlza3kgdAogIDp2ZXJzaW9uICIyOC4xIikKCihkZWZj
dXN0b20gcGFja2FnZS1tZW51LWFzeW5jIHQKICAiSWYgbm9uLW5pbCwgcGFja2FnZS1tZW51IHdp
bGwgdXNlIGFzeW5jIG9wZXJhdGlvbnMgd2hlbiBwb3NzaWJsZS4KQ3VycmVudGx5LCBvbmx5IHRo
ZSByZWZyZXNoaW5nIG9mIGFyY2hpdmUgY29udGVudHMgc3VwcG9ydHMKYXN5bmNocm9ub3VzIG9w
ZXJhdGlvbnMuICBQYWNrYWdlIHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgZG9uZQpzeW5jaHJvbm91
c2x5LiIKICA6dHlwZSAnYm9vbGVhbgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZjdXN0b20gcGFj
a2FnZS1uYW1lLWNvbHVtbi13aWR0aCAzMAogICJDb2x1bW4gd2lkdGggZm9yIHRoZSBQYWNrYWdl
IG5hbWUgaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAgOnR5cGUgJ25hdG51bQogIDp2ZXJzaW9uICIy
OC4xIikKCihkZWZjdXN0b20gcGFja2FnZS12ZXJzaW9uLWNvbHVtbi13aWR0aCAxNAogICJDb2x1
bW4gd2lkdGggZm9yIHRoZSBQYWNrYWdlIHZlcnNpb24gaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAg
OnR5cGUgJ25hdG51bQogIDp2ZXJzaW9uICIyOC4xIikKCihkZWZjdXN0b20gcGFja2FnZS1zdGF0
dXMtY29sdW1uLXdpZHRoIDEyCiAgIkNvbHVtbiB3aWR0aCBmb3IgdGhlIFBhY2thZ2Ugc3RhdHVz
IGluIHRoZSBwYWNrYWdlIG1lbnUuIgogIDp0eXBlICduYXRudW0KICA6dmVyc2lvbiAiMjguMSIp
CgooZGVmY3VzdG9tIHBhY2thZ2UtYXJjaGl2ZS1jb2x1bW4td2lkdGggOAogICJDb2x1bW4gd2lk
dGggZm9yIHRoZSBQYWNrYWdlIGFyY2hpdmUgaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAgOnR5cGUg
J25hdG51bQogIDp2ZXJzaW9uICIyOC4xIikKCgwKOzs7IGBwYWNrYWdlLWRlc2MnIG9iamVjdCBk
ZWZpbml0aW9uCjs7IFRoaXMgaXMgdGhlIHN0cnVjdCB1c2VkIGludGVybmFsbHkgdG8gcmVwcmVz
ZW50IHBhY2thZ2VzLgo7OyBGdW5jdGlvbnMgdGhhdCBkZWFsIHdpdGggcGFja2FnZXMgc2hvdWxk
IGdlbmVyYWxseSB0YWtlIHRoaXMgb2JqZWN0Cjs7IGFzIGFuIGFyZ3VtZW50LiAgSW4gc29tZSBz
aXR1YXRpb25zIChlLmcuIGNvbW1hbmRzIHRoYXQgcXVlcnkgdGhlCjs7IHVzZXIpIGl0IG1ha2Vz
IHNlbnNlIHRvIHRha2UgdGhlIHBhY2thZ2UgbmFtZSBhcyBhIHN5bWJvbCBpbnN0ZWFkLAo7OyBi
dXQga2VlcCBpbiBtaW5kIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGBwYWNrYWdlLWRlc2MncyB3
aXRoIHRoZQo7OyBzYW1lIG5hbWUuCgooZGVmdmFyIHBhY2thZ2UtLWRlZmF1bHQtc3VtbWFyeSAi
Tm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLiIpCgooZGVmaW5lLWlubGluZSBwYWNrYWdlLXZjLXAg
KHBrZy1kZXNjKQogICJSZXR1cm4gbm9uLW5pbCBpZiBQS0ctREVTQyBpcyBhIFZDIHBhY2thZ2Uu
IgogIChpbmxpbmUtbGV0ZXZhbHMgKHBrZy1kZXNjKQogICAgKGlubGluZS1xdW90ZSAoZXEgKHBh
Y2thZ2UtZGVzYy1raW5kICxwa2ctZGVzYykgJ3ZjKSkpKQoKKGNsLWRlZnN0cnVjdCAocGFja2Fn
ZS1kZXNjCiAgICAgICAgICAgICAgIDs7IFJlbmFtZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBm
cm9tIGBtYWtlLXBhY2thZ2UtZGVzYycuCiAgICAgICAgICAgICAgICg6Y29uc3RydWN0b3IgcGFj
a2FnZS1kZXNjLWNyZWF0ZSkKICAgICAgICAgICAgICAgOzsgSGFzIHRoZSBzYW1lIGludGVyZmFj
ZSBhcyB0aGUgb2xkIGBkZWZpbmUtcGFja2FnZScsCiAgICAgICAgICAgICAgIDs7IHdoaWNoIGlz
IHN0aWxsIHVzZWQgaW4gdGhlICJmb28tcGtnLmVsIiBmaWxlcy4gRXh0cmEKICAgICAgICAgICAg
ICAgOzsgb3B0aW9ucyBjYW4gYmUgc3VwcG9ydGVkIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGtleXMu
CiAgICAgICAgICAgICAgICg6Y29uc3RydWN0b3IKICAgICAgICAgICAgICAgIHBhY2thZ2UtZGVz
Yy1mcm9tLWRlZmluZQogICAgICAgICAgICAgICAgKG5hbWUtc3RyaW5nIHZlcnNpb24tc3RyaW5n
ICZvcHRpb25hbCBzdW1tYXJ5IHJlcXVpcmVtZW50cwogICAgICAgICAgICAgICAgICZyZXN0IHJl
c3QtcGxpc3QKICAgICAgICAgICAgICAgICAmYXV4CiAgICAgICAgICAgICAgICAgKG5hbWUgKGlu
dGVybiBuYW1lLXN0cmluZykpCiAgICAgICAgICAgICAgICAgKHZlcnNpb24gKGlmIChlcSAoY2Fy
LXNhZmUgdmVyc2lvbi1zdHJpbmcpICd2YykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHZlcnNpb24tdG8tbGlzdCAoY2RyIHZlcnNpb24tc3RyaW5nKSkKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICh2ZXJzaW9uLXRvLWxpc3QgdmVyc2lvbi1zdHJpbmcpKSkKICAgICAgICAgICAg
ICAgICAocmVxcyAobWFwY2FyIChsYW1iZGEgKGVsdCkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGxpc3QgKGNhciBlbHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICh2ZXJzaW9uLXRvLWxpc3QgKGNhZHIgZWx0KSkpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGlmIChlcSAncXVvdGUgKGNhciByZXF1aXJlbWVudHMpKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChudGggMSByZXF1aXJlbWVudHMpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cykpKQogICAgICAgICAgICAgICAgIChr
aW5kIChwbGlzdC1nZXQgcmVzdC1wbGlzdCA6a2luZCkpCiAgICAgICAgICAgICAgICAgKGFyY2hp
dmUgKHBsaXN0LWdldCByZXN0LXBsaXN0IDphcmNoaXZlKSkKICAgICAgICAgICAgICAgICAoZXh0
cmFzIChsZXQgKGFsaXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpbGUgcmVzdC1w
bGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxlc3MgKG1lbXEgKGNhciByZXN0
LXBsaXN0KSAnKDpraW5kIDphcmNoaXZlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChsZXQgKCh2YWx1ZSAoY2FkciByZXN0LXBsaXN0KSkpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICh3aGVuIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHB1c2ggKGNvbnMgKGNhciByZXN0LXBsaXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChpZiAoZXEgKGNhci1zYWZlIHZhbHVlKSAncXVvdGUpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWRyIHZhbHVl
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIHJlc3QtcGxpc3QgKGNkZHIgcmVzdC1wbGlz
dCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCiAgIlN0cnVjdHVyZSBj
b250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGluZGl2aWR1YWwgcGFja2FnZS4KU2xvdHM6
CgpgbmFtZScJTmFtZSBvZiB0aGUgcGFja2FnZSwgYXMgYSBzeW1ib2wuCgpgdmVyc2lvbicgVmVy
c2lvbiBvZiB0aGUgcGFja2FnZSwgYXMgYSB2ZXJzaW9uIGxpc3QuCgpgc3VtbWFyeScgU2hvcnQg
ZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2UsIHR5cGljYWxseSB0YWtlbiBmcm9tCiAgICAgICAg
dGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUuCgpgcmVxcycJUmVxdWlyZW1lbnRzIG9mIHRoZSBw
YWNrYWdlLiAgQSBsaXN0IG9mIChQQUNLQUdFCiAgICAgICAgVkVSU0lPTi1MSVNUKSBuYW1pbmcg
dGhlIGRlcGVuZGVudCBwYWNrYWdlIGFuZCB0aGUgbWluaW11bQogICAgICAgIHJlcXVpcmVkIHZl
cnNpb24uCgpga2luZCcJVGhlIGRpc3RyaWJ1dGlvbiBmb3JtYXQgb2YgdGhlIHBhY2thZ2UuICBD
dXJyZW50bHksIGl0IGlzCiAgICAgICAgZWl0aGVyIGBzaW5nbGUnIG9yIGB0YXInLgoKYGFyY2hp
dmUnIFRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIChhcyBhIHN0cmluZykgd2hlbmNlIHRoaXMKICAg
ICAgICBwYWNrYWdlIGNhbWUuCgpgZGlyJwlUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBwYWNrYWdl
IGlzIGluc3RhbGxlZCAoaWYgaW5zdGFsbGVkKSwKICAgICAgICBgYnVpbHRpbicgaWYgaXQgaXMg
YnVpbHQtaW4sIG9yIG5pbCBvdGhlcndpc2UuCgpgZXh0cmFzJyBPcHRpb25hbCBhbGlzdCBvZiBh
ZGRpdGlvbmFsIGtleXdvcmQtdmFsdWUgcGFpcnMuCgpgc2lnbmVkJyBGbGFnIHRvIGluZGljYXRl
IHRoYXQgdGhlIHBhY2thZ2UgaXMgc2lnbmVkIGJ5IHByb3ZpZGVyLiIKICBuYW1lCiAgdmVyc2lv
bgogIChzdW1tYXJ5IHBhY2thZ2UtLWRlZmF1bHQtc3VtbWFyeSkKICByZXFzCiAga2luZAogIGFy
Y2hpdmUKICBkaXIKICBleHRyYXMKICBzaWduZWQpCgooZGVmdW4gcGFja2FnZS0tZnJvbS1idWls
dGluIChiaS1kZXNjKQogICJDcmVhdGUgYSBgcGFja2FnZS1kZXNjJyBvYmplY3QgZnJvbSBCSS1E
RVNDLgpCSS1ERVNDIHNob3VsZCBiZSBhIGBwYWNrYWdlLS1iaS1kZXNjJyBvYmplY3QuIgogIChw
YWNrYWdlLWRlc2MtY3JlYXRlIDpuYW1lIChwb3AgYmktZGVzYykKICAgICAgICAgICAgICAgICAg
ICAgICA6dmVyc2lvbiAocGFja2FnZS0tYmktZGVzYy12ZXJzaW9uIGJpLWRlc2MpCiAgICAgICAg
ICAgICAgICAgICAgICAgOnN1bW1hcnkgKHBhY2thZ2UtLWJpLWRlc2Mtc3VtbWFyeSBiaS1kZXNj
KQogICAgICAgICAgICAgICAgICAgICAgIDpkaXIgJ2J1aWx0aW4pKQoKOzsgUHNldWRvIGZpZWxk
cy4KKGRlZnVuIHBhY2thZ2UtdmVyc2lvbi1qb2luICh2bGlzdCkKICAiUmV0dXJuIHRoZSB2ZXJz
aW9uIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IFZMSVNULgpUaGlzIGlzLCBhcHBy
b3hpbWF0ZWx5LCB0aGUgaW52ZXJzZSBvZiBgdmVyc2lvbi10by1saXN0Jy4KXChBY3R1YWxseSwg
aXQgcmV0dXJucyBvbmx5IG9uZSBvZiB0aGUgcG9zc2libGUgaW52ZXJzZXMsIHNpbmNlCmB2ZXJz
aW9uLXRvLWxpc3QnIGlzIGEgbWFueS10by1vbmUgb3BlcmF0aW9uLikiCiAgKGlmIChudWxsIHZs
aXN0KQogICAgICAiIgogICAgKGxldCAoKHN0ci1saXN0IChsaXN0ICIuIiAoaW50LXRvLXN0cmlu
ZyAoY2FyIHZsaXN0KSkpKSkKICAgICAgKGRvbGlzdCAobnVtIChjZHIgdmxpc3QpKQogICAgICAg
IChjb25kCiAgICAgICAgICgoPj0gbnVtIDApCiAgICAgICAgICAocHVzaCAoaW50LXRvLXN0cmlu
ZyBudW0pIHN0ci1saXN0KQogICAgICAgICAgKHB1c2ggIi4iIHN0ci1saXN0KSkKICAgICAgICAg
KCg8IG51bSAtNCkKICAgICAgICAgIChlcnJvciAiSW52YWxpZCB2ZXJzaW9uIGxpc3QgYCVzJyIg
dmxpc3QpKQogICAgICAgICAodAogICAgICAgICAgOzsgcHJlLCBvciBiZXRhLCBvciBhbHBoYQog
ICAgICAgICAgKGNvbmQgKChlcXVhbCAiLiIgKGNhciBzdHItbGlzdCkpCiAgICAgICAgICAgICAg
ICAgKHBvcCBzdHItbGlzdCkpCiAgICAgICAgICAgICAgICAoKG5vdCAoc3RyaW5nLW1hdGNoICJb
MC05XSsiIChjYXIgc3RyLWxpc3QpKSkKICAgICAgICAgICAgICAgICAoZXJyb3IgIkludmFsaWQg
dmVyc2lvbiBsaXN0IGAlcyciIHZsaXN0KSkpCiAgICAgICAgICAocHVzaCAoY29uZCAoKD0gbnVt
IC0xKSAicHJlIikKICAgICAgICAgICAgICAgICAgICAgICgoPSBudW0gLTIpICJiZXRhIikKICAg
ICAgICAgICAgICAgICAgICAgICgoPSBudW0gLTMpICJhbHBoYSIpCiAgICAgICAgICAgICAgICAg
ICAgICAoKD0gbnVtIC00KSAic25hcHNob3QiKSkKICAgICAgICAgICAgICAgIHN0ci1saXN0KSkp
KQogICAgICAoaWYgKGVxdWFsICIuIiAoY2FyIHN0ci1saXN0KSkKICAgICAgICAgIChwb3Agc3Ry
LWxpc3QpKQogICAgICAoYXBwbHkgIydjb25jYXQgKG5yZXZlcnNlIHN0ci1saXN0KSkpKSkKCihk
ZWZ1biBwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIChwa2ctZGVzYykKICAiUmV0dXJuIGZ1bGwgbmFt
ZSBvZiBwYWNrYWdlLWRlc2Mgb2JqZWN0IFBLRy1ERVNDLgpUaGlzIGlzIHRoZSBuYW1lIG9mIHRo
ZSBwYWNrYWdlIHdpdGggaXRzIHZlcnNpb24gYXBwZW5kZWQuIgogIChpZiAocGFja2FnZS12Yy1w
IHBrZy1kZXNjKQogICAgICAoc3ltYm9sLW5hbWUgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNj
KSkKICAgIChmb3JtYXQgIiVzLSVzIgogICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtn
LWRlc2MpCiAgICAgICAgICAgIChwYWNrYWdlLXZlcnNpb24tam9pbiAocGFja2FnZS1kZXNjLXZl
cnNpb24gcGtnLWRlc2MpKSkpKQoKKGRlZnVuIHBhY2thZ2UtZGVzYy1zdWZmaXggKHBrZy1kZXNj
KQogICJSZXR1cm4gZmlsZS1uYW1lIGV4dGVuc2lvbiBvZiBwYWNrYWdlLWRlc2Mgb2JqZWN0IFBL
Ry1ERVNDLgpEZXBlbmRpbmcgb24gdGhlIGBwYWNrYWdlLWRlc2Mta2luZCcgb2YgUEtHLURFU0Ms
IHRoaXMgaXMgb25lIG9mOgoKICAgXFw9J3NpbmdsZSAtIFwiLmVsXCIKICAgXFw9J3RhciAgICAt
IFwiLnRhclwiCiAgIFxcPSdkaXIgICAgLSBcIlwiCgpTaWduYWwgYW4gZXJyb3IgaWYgdGhlIGtp
bmQgaXMgbm9uZSBvZiB0aGUgYWJvdmUuIgogIChwY2FzZSAocGFja2FnZS1kZXNjLWtpbmQgcGtn
LWRlc2MpCiAgICAoJ3NpbmdsZSAiLmVsIikKICAgICgndGFyICIudGFyIikKICAgICgnZGlyICIi
KQogICAgKGtpbmQgKGVycm9yICJVbmtub3duIHBhY2thZ2Uga2luZDogJXMiIGtpbmQpKSkpCgoo
ZGVmdW4gcGFja2FnZS1kZXNjLS1rZXl3b3JkcyAocGtnLWRlc2MpCiAgIlJldHVybiBrZXl3b3Jk
cyBvZiBwYWNrYWdlLWRlc2Mgb2JqZWN0IFBLRy1ERVNDLgpUaGVzZSBrZXl3b3JkcyBjb21lIGZy
b20gdGhlIGZvby1wa2cuZWwgZmlsZSwgYW5kIGluIGdlbmVyYWwKY29ycmVzcG9uZHMgdG8gdGhl
IGtleXdvcmRzIGluIHRoZSBcIktleXdvcmRzXCIgaGVhZGVyIG9mIHRoZQpwYWNrYWdlLiIKICAo
bGV0ICgoa2V5d29yZHMgKGNkciAoYXNzb2MgOmtleXdvcmRzIChwYWNrYWdlLWRlc2MtZXh0cmFz
IHBrZy1kZXNjKSkpKSkKICAgIChpZiAoZXEgKGNhci1zYWZlIGtleXdvcmRzKSAncXVvdGUpCiAg
ICAgICAgKG50aCAxIGtleXdvcmRzKQogICAgICBrZXl3b3JkcykpKQoKKGRlZnVuIHBhY2thZ2Ut
ZGVzYy1wcmlvcml0eSAocGtnLWRlc2MpCiAgIlJldHVybiB0aGUgcHJpb3JpdHkgb2YgdGhlIGFy
Y2hpdmUgb2YgcGFja2FnZS1kZXNjIG9iamVjdCBQS0ctREVTQy4iCiAgKHBhY2thZ2UtYXJjaGl2
ZS1wcmlvcml0eSAocGFja2FnZS1kZXNjLWFyY2hpdmUgcGtnLWRlc2MpKSkKCihkZWZ1biBwYWNr
YWdlLS1wYXJzZS1lbHBhaWdub3JlIChwa2ctZGVzYykKICAiUmV0dXJuIHRoZSBvZiByZWd1bGFy
IGV4cHJlc3Npb24gdG8gbWF0Y2ggZmlsZXMgaWdub3JlZCBieSBQS0ctREVTQy4iCiAgKGxldCog
KChwa2ctZGlyIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IChwYWNrYWdlLWRlc2MtZGlyIHBrZy1k
ZXNjKSkpCiAgICAgICAgIChpZ25vcmUgKGV4cGFuZC1maWxlLW5hbWUgIi5lbHBhaWdub3JlIiBw
a2ctZGlyKSkKICAgICAgICAgZmlsZXMpCiAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBpZ25vcmUp
CiAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIGln
bm9yZSkKICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAgICh3aGlsZSAobm90
IChlb2JwKSkKICAgICAgICAgIChwdXNoICh3aWxkY2FyZC10by1yZWdleHAKICAgICAgICAgICAg
ICAgICAobGV0ICgobGluZSAoYnVmZmVyLXN1YnN0cmluZwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChsaW5lLWVuZC1wb3NpdGlvbikpKSkKICAgICAgICAgICAgICAgICAgIChmaWxlLW5h
bWUtY29uY2F0IHBrZy1kaXIgKHN0cmluZy10cmltLWxlZnQgbGluZSAiLyIpKSkpCiAgICAgICAg
ICAgICAgICBmaWxlcykKICAgICAgICAgIChmb3J3YXJkLWxpbmUpKSkKICAgICAgZmlsZXMpKSkK
CihjbC1kZWZzdHJ1Y3QgKHBhY2thZ2UtLWJpLWRlc2MKICAgICAgICAgICAgICAgKDpjb25zdHJ1
Y3RvciBwYWNrYWdlLW1ha2UtYnVpbHRpbiAodmVyc2lvbiBzdW1tYXJ5KSkKICAgICAgICAgICAg
ICAgKDp0eXBlIHZlY3RvcikpCiAgIlBhY2thZ2UgZGVzY3JpcHRvciBmb3JtYXQgdXNlZCBpbiBm
aW5kZXItaW5mLmVsIGFuZCBwYWNrYWdlLS1idWlsdGlucy4iCiAgdmVyc2lvbgogIHJlcXMKICBz
dW1tYXJ5KQoKDAo7OzsgSW5zdGFsbGVkIHBhY2thZ2VzCjs7IFRoZSBmb2xsb3dpbmcgdmFyaWFi
bGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2VzIHByZXNlbnQgaW4KOzsgdGhlIHN5
c3RlbS4gIFRoZSBtb3N0IGltcG9ydGFudCBvZiB0aGVzZSBpcyBgcGFja2FnZS1hbGlzdCcuICBU
aGUKOzsgY29tbWFuZCBgcGFja2FnZS1hY3RpdmF0ZS1hbGwnIGlzIGFsc28gY2xvc2VseSByZWxh
dGVkIHRvIHRoaXMKOzsgc2VjdGlvbi4KCihkZWZ2YXIgcGFja2FnZS0tYnVpbHRpbnMgbmlsCiAg
IkFsaXN0IG9mIGJ1aWx0LWluIHBhY2thZ2VzLgpUaGUgYWN0dWFsIHZhbHVlIGlzIGluaXRpYWxp
emVkIGJ5IGxvYWRpbmcgdGhlIGxpYnJhcnkKYGZpbmRlci1pbmYnOyB0aGlzIGlzIG5vdCBkb25l
IHVudGlsIGl0IGlzIG5lZWRlZCwgZS5nLiBieSB0aGUKZnVuY3Rpb24gYHBhY2thZ2UtYnVpbHQt
aW4tcCcuCgpFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb3JtIChQS0cgLiBQQUNLQUdFLUJJLURFU0Mp
LCB3aGVyZSBQS0cgaXMgYSBwYWNrYWdlCm5hbWUgKGEgc3ltYm9sKSBhbmQgREVTQyBpcyBhIGBw
YWNrYWdlLS1iaS1kZXNjJyBzdHJ1Y3R1cmUuIikKKHB1dCAncGFja2FnZS0tYnVpbHRpbnMgJ3Jp
c2t5LWxvY2FsLXZhcmlhYmxlIHQpCgooZGVmdmFyIHBhY2thZ2UtYWxpc3QgbmlsCiAgIkFsaXN0
IG9mIGFsbCBwYWNrYWdlcyBhdmFpbGFibGUgZm9yIGFjdGl2YXRpb24uCkVhY2ggZWxlbWVudCBo
YXMgdGhlIGZvcm0gKFBLRyAuIERFU0NTKSwgd2hlcmUgUEtHIGlzIGEgcGFja2FnZQpuYW1lIChh
IHN5bWJvbCkgYW5kIERFU0NTIGlzIGEgbm9uLWVtcHR5IGxpc3Qgb2YgYHBhY2thZ2UtZGVzYycK
c3RydWN0dXJlcywgc29ydGVkIGJ5IGRlY3JlYXNpbmcgdmVyc2lvbnMuCgpUaGlzIHZhcmlhYmxl
IGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5IGBwYWNrYWdlLWxvYWQtZGVzY3JpcHRvcicsCmNhbGxl
ZCB2aWEgYHBhY2thZ2UtYWN0aXZhdGUtYWxsJy4gIFRvIGNoYW5nZSB3aGljaCBwYWNrYWdlcyBh
cmUKbG9hZGVkIGFuZC9vciBhY3RpdmF0ZWQsIGN1c3RvbWl6ZSBgcGFja2FnZS1sb2FkLWxpc3Qn
LiIpCihwdXQgJ3BhY2thZ2UtYWxpc3QgJ3Jpc2t5LWxvY2FsLXZhcmlhYmxlIHQpCgo7OzsjIyNh
dXRvbG9hZAooZGVmdmFyIHBhY2thZ2UtYWN0aXZhdGVkLWxpc3QgbmlsCiAgOzsgRklYTUU6IFRo
aXMgc2hvdWxkIGltcGxpY2l0bHkgaW5jbHVkZSBhbGwgYnVpbHRpbiBwYWNrYWdlcy4KICAiTGlz
dCBvZiB0aGUgbmFtZXMgb2YgY3VycmVudGx5IGFjdGl2YXRlZCBwYWNrYWdlcy4iKQoocHV0ICdw
YWNrYWdlLWFjdGl2YXRlZC1saXN0ICdyaXNreS1sb2NhbC12YXJpYWJsZSB0KQoKOzs7OyBQb3B1
bGF0aW5nIGBwYWNrYWdlLWFsaXN0Jy4KCjs7IFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBj
YWxsZWQgb24gZWFjaCBpbnN0YWxsZWQgcGFja2FnZSBieQo7OyBgcGFja2FnZS1sb2FkLWFsbC1k
ZXNjcmlwdG9ycycsIHdoaWNoIHVsdGltYXRlbHkgcG9wdWxhdGVzIHRoZQo7OyBgcGFja2FnZS1h
bGlzdCcgdmFyaWFibGUuCgooZGVjbGFyZS1mdW5jdGlvbiBwYWNrYWdlLXZjLXZlcnNpb24gInBh
Y2thZ2UtdmMiIChwa2cpKQoKKGRlZnVuIHBhY2thZ2UtcHJvY2Vzcy1kZWZpbmUtcGFja2FnZSAo
ZXhwKQogICJQcm9jZXNzIGRlZmluZS1wYWNrYWdlIGV4cHJlc3Npb24gRVhQIGFuZCBwdXNoIGl0
IHRvIGBwYWNrYWdlLWFsaXN0Jy4KRVhQIHNob3VsZCBiZSBhIGZvcm0gcmVhZCBmcm9tIGEgZm9v
LXBrZy5lbCBmaWxlLgpDb252ZXJ0IEVYUCBpbnRvIGEgYHBhY2thZ2UtZGVzYycgb2JqZWN0IHVz
aW5nIHRoZQpgcGFja2FnZS1kZXNjLWZyb20tZGVmaW5lJyBjb25zdHJ1Y3RvciBiZWZvcmUgcHVz
aGluZyBpdCB0bwpgcGFja2FnZS1hbGlzdCcuCgpJZiB0aGVyZSBhbHJlYWR5IGV4aXN0cyBhIHBh
Y2thZ2UgYnkgdGhlIHNhbWUgbmFtZSBpbgpgcGFja2FnZS1hbGlzdCcsIGluc2VydCB0aGlzIG9i
amVjdCB0aGVyZSBzdWNoIHRoYXQgdGhlIHBhY2thZ2VzCmFyZSBzb3J0ZWQgd2l0aCB0aGUgaGln
aGVzdCB2ZXJzaW9uIGZpcnN0LiIKICAod2hlbiAoZXEgKGNhci1zYWZlIGV4cCkgJ2RlZmluZS1w
YWNrYWdlKQogICAgKGxldCogKChuZXctcGtnLWRlc2MgKGFwcGx5ICMncGFja2FnZS1kZXNjLWZy
b20tZGVmaW5lIChjZHIgZXhwKSkpCiAgICAgICAgICAgKG5hbWUgKHBhY2thZ2UtZGVzYy1uYW1l
IG5ldy1wa2ctZGVzYykpCiAgICAgICAgICAgKHZlcnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9u
IG5ldy1wa2ctZGVzYykpCiAgICAgICAgICAgKG9sZC1wa2dzIChhc3NxIG5hbWUgcGFja2FnZS1h
bGlzdCkpKQogICAgICAoaWYgKG51bGwgb2xkLXBrZ3MpCiAgICAgICAgICA7OyBJZiB0aGVyZSdz
IG5vIG9sZCBwYWNrYWdlLCBqdXN0IGFkZCB0aGlzIHRvIGBwYWNrYWdlLWFsaXN0Jy4KICAgICAg
ICAgIChwdXNoIChsaXN0IG5hbWUgbmV3LXBrZy1kZXNjKSBwYWNrYWdlLWFsaXN0KQogICAgICAg
IDs7IElmIHRoZXJlIGlzLCBpbnNlcnQgdGhlIG5ldyBwYWNrYWdlIGF0IHRoZSByaWdodCBwbGFj
ZSBpbiB0aGUgbGlzdC4KICAgICAgICAod2hpbGUKICAgICAgICAgICAgKGlmIChhbmQgKGNkciBv
bGQtcGtncykKICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24tbGlzdC08IHZlcnNpb24KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiAo
Y2FkciBvbGQtcGtncykpKSkKICAgICAgICAgICAgICAgIChzZXRxIG9sZC1wa2dzIChjZHIgb2xk
LXBrZ3MpKQogICAgICAgICAgICAgIChwdXNoIG5ldy1wa2ctZGVzYyAoY2RyIG9sZC1wa2dzKSkK
ICAgICAgICAgICAgICBuaWwpKSkKICAgICAgbmV3LXBrZy1kZXNjKSkpCgooZGVjbGFyZS1mdW5j
dGlvbiBwYWNrYWdlLXZjLWNvbW1pdCAicGFja2FnZS12YyIgKHBrZykpCgooZGVmdW4gcGFja2Fn
ZS1sb2FkLWRlc2NyaXB0b3IgKHBrZy1kaXIpCiAgIkxvYWQgdGhlIHBhY2thZ2UgZGVzY3JpcHRp
b24gZmlsZSBpbiBkaXJlY3RvcnkgUEtHLURJUi4KQ3JlYXRlIGEgbmV3IGBwYWNrYWdlLWRlc2Mn
IG9iamVjdCwgYWRkIGl0IHRvIGBwYWNrYWdlLWFsaXN0JyBhbmQKcmV0dXJuIGl0LiIKICAobGV0
ICgocGtnLWZpbGUgKGV4cGFuZC1maWxlLW5hbWUgKHBhY2thZ2UtLWRlc2NyaXB0aW9uLWZpbGUg
cGtnLWRpcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLWRpcikpCiAg
ICAgICAgKHNpZ25lZC1maWxlIChjb25jYXQgcGtnLWRpciAiLnNpZ25lZCIpKSkKICAgICh3aGVu
IChmaWxlLWV4aXN0cy1wIHBrZy1maWxlKQogICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAg
IChpbnNlcnQtZmlsZS1jb250ZW50cyBwa2ctZmlsZSkKICAgICAgICAoZ290by1jaGFyIChwb2lu
dC1taW4pKQogICAgICAgIChsZXQgKChwa2ctZGVzYyAob3IgKHBhY2thZ2UtcHJvY2Vzcy1kZWZp
bmUtcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkIChjdXJyZW50LWJ1
ZmZlcikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIGRl
ZmluZS1wYWNrYWdlIGluICVzIiBwa2ctZmlsZSkpKSkKICAgICAgICAgIChzZXRmIChwYWNrYWdl
LWRlc2MtZGlyIHBrZy1kZXNjKSBwa2ctZGlyKQogICAgICAgICAgKGlmIChmaWxlLWV4aXN0cy1w
IHNpZ25lZC1maWxlKQogICAgICAgICAgICAgIChzZXRmIChwYWNrYWdlLWRlc2Mtc2lnbmVkIHBr
Zy1kZXNjKSB0KSkKICAgICAgICAgIHBrZy1kZXNjKSkpKSkKCihkZWZ1biBwYWNrYWdlLWxvYWQt
YWxsLWRlc2NyaXB0b3JzICgpCiAgIkxvYWQgZGVzY3JpcHRvcnMgZm9yIGluc3RhbGxlZCBFbWFj
cyBMaXNwIHBhY2thZ2VzLgpUaGlzIGxvb2tzIGZvciBwYWNrYWdlIHN1YmRpcmVjdG9yaWVzIGlu
IGBwYWNrYWdlLXVzZXItZGlyJyBhbmQKYHBhY2thZ2UtZGlyZWN0b3J5LWxpc3QnLiAgVGhlIHZh
cmlhYmxlIGBwYWNrYWdlLWxvYWQtbGlzdCcKY29udHJvbHMgd2hpY2ggcGFja2FnZSBzdWJkaXJl
Y3RvcmllcyBtYXkgYmUgbG9hZGVkLgoKSW4gZWFjaCB2YWxpZCBwYWNrYWdlIHN1YmRpcmVjdG9y
eSwgdGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUKZGVzY3JpcHRpb24gZmlsZSBjb250YWluaW5nIGEg
Y2FsbCB0byBgZGVmaW5lLXBhY2thZ2UnLCB3aGljaAp1cGRhdGVzIGBwYWNrYWdlLWFsaXN0Jy4i
CiAgKGRvbGlzdCAoZGlyIChjb25zIHBhY2thZ2UtdXNlci1kaXIgcGFja2FnZS1kaXJlY3Rvcnkt
bGlzdCkpCiAgICAod2hlbiAoZmlsZS1kaXJlY3RvcnktcCBkaXIpCiAgICAgIChkb2xpc3QgKHBr
Zy1kaXIgKGRpcmVjdG9yeS1maWxlcyBkaXIgdCAiXFxgW14uXSIgdCkpCiAgICAgICAgKHdoZW4g
KGZpbGUtZGlyZWN0b3J5LXAgcGtnLWRpcikKICAgICAgICAgIChwYWNrYWdlLWxvYWQtZGVzY3Jp
cHRvciBwa2ctZGlyKSkpKSkpCgooZGVmdW4gcGFja2FnZS0tYWxpc3QgKCkKICAiUmV0dXJuIGBw
YWNrYWdlLWFsaXN0JywgYWZ0ZXIgY29tcHV0aW5nIGl0IGlmIG5lZWRlZC4iCiAgKG9yIHBhY2th
Z2UtYWxpc3QKICAgICAgKHByb2duIChwYWNrYWdlLWxvYWQtYWxsLWRlc2NyaXB0b3JzKQogICAg
ICAgICAgICAgcGFja2FnZS1hbGlzdCkpKQoKKGRlZnVuIGRlZmluZS1wYWNrYWdlICggX25hbWUt
c3RyaW5nIF92ZXJzaW9uLXN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9uYWwg
X2RvY3N0cmluZyBfcmVxdWlyZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0IF9l
eHRyYS1wcm9wZXJ0aWVzKQogICJEZWZpbmUgYSBuZXcgcGFja2FnZS4KTkFNRS1TVFJJTkcgaXMg
dGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UsIGFzIGEgc3RyaW5nLgpWRVJTSU9OLVNUUklORyBpcyB0
aGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgYXMgYSBzdHJpbmcuCkRPQ1NUUklORyBpcyBhIHNo
b3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrYWdlLCBhIHN0cmluZy4KUkVRVUlSRU1FTlRTIGlz
IGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgb24gb3RoZXIgcGFja2FnZXMuCiBFYWNoIHJlcXVpcmVt
ZW50IGlzIG9mIHRoZSBmb3JtIChPVEhFUi1QQUNLQUdFIE9USEVSLVZFUlNJT04pLAogd2hlcmUg
T1RIRVItVkVSU0lPTiBpcyBhIHN0cmluZy4KCkVYVFJBLVBST1BFUlRJRVMgaXMgY3VycmVudGx5
IHVudXNlZC4iCiAgKGRlY2xhcmUgKG9ic29sZXRlIG5pbCAiMjkuMSIpIChpbmRlbnQgZGVmdW4p
KQogIChlcnJvciAiRG9uJ3QgY2FsbCBtZSEiKSkKCgwKOzs7IFBhY2thZ2UgYWN0aXZhdGlvbgo7
OyBTZWN0aW9uIGZvciBmdW5jdGlvbnMgdXNlZCBieSBgcGFja2FnZS1hY3RpdmF0ZScsIHdoaWNo
IHNlZS4KCihkZWZ1biBwYWNrYWdlLWRpc2FibGVkLXAgKHBrZy1uYW1lIHZlcnNpb24pCiAgIlJl
dHVybiB3aGV0aGVyIFBLRy1OQU1FIGF0IFZFUlNJT04gY2FuIGJlIGFjdGl2YXRlZC4KVGhlIGRl
Y2lzaW9uIGlzIG1hZGUgYWNjb3JkaW5nIHRvIGBwYWNrYWdlLWxvYWQtbGlzdCcuClJldHVybiBu
aWwgaWYgdGhlIHBhY2thZ2UgY2FuIGJlIGFjdGl2YXRlZC4KUmV0dXJuIHQgaWYgdGhlIHBhY2th
Z2UgaXMgY29tcGxldGVseSBkaXNhYmxlZC4KUmV0dXJuIHRoZSBtYXggdmVyc2lvbiAoYXMgYSBz
dHJpbmcpIGlmIHRoZSBwYWNrYWdlIGlzIGhlbGQgYXQgYSBsb3dlciB2ZXJzaW9uLiIKICAobGV0
ICgoZm9yY2UgKGFzc3EgcGtnLW5hbWUgcGFja2FnZS1sb2FkLWxpc3QpKSkKICAgIChjb25kICgo
bnVsbCBmb3JjZSkgKG5vdCAobWVtcSAnYWxsIHBhY2thZ2UtbG9hZC1saXN0KSkpCiAgICAgICAg
ICAoKG51bGwgKHNldHEgZm9yY2UgKGNhZHIgZm9yY2UpKSkgdCkgOyBkaXNhYmxlZAogICAgICAg
ICAgKChlcSBmb3JjZSB0KSBuaWwpCiAgICAgICAgICAoKHN0cmluZ3AgZm9yY2UpICAgICAgICAg
ICAgICA7IGhlbGQKICAgICAgICAgICAodW5sZXNzICh2ZXJzaW9uLWxpc3QtPSB2ZXJzaW9uICh2
ZXJzaW9uLXRvLWxpc3QgZm9yY2UpKQogICAgICAgICAgICAgZm9yY2UpKQogICAgICAgICAgKHQg
KGVycm9yICJJbnZhbGlkIGVsZW1lbnQgaW4gYHBhY2thZ2UtbG9hZC1saXN0JyIpKSkpKQoKKGRl
ZnVuIHBhY2thZ2UtYnVpbHQtaW4tcCAocGFja2FnZSAmb3B0aW9uYWwgbWluLXZlcnNpb24pCiAg
IlJldHVybiBub24tbmlsIGlmIFBBQ0tBR0UgaXMgYnVpbHQtaW4gdG8gRW1hY3MuCk9wdGlvbmFs
IGFyZyBNSU4tVkVSU0lPTiwgaWYgbm9uLW5pbCwgc2hvdWxkIGJlIGEgdmVyc2lvbiBsaXN0CnNw
ZWNpZnlpbmcgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSB2ZXJzaW9uLiIKICAoaWYgKHBhY2thZ2Ut
ZGVzYy1wIHBhY2thZ2UpIDs7IHdhcyBidWlsdC1pbiBhbmQgdGhlbiB3YXMgY29udmVydGVkCiAg
ICAgIChlcSAnYnVpbHRpbiAocGFja2FnZS1kZXNjLWRpciBwYWNrYWdlKSkKICAgIChsZXQgKChi
aSAoYXNzcSBwYWNrYWdlIHBhY2thZ2UtLWJ1aWx0aW4tdmVyc2lvbnMpKSkKICAgICAgKGNvbmQK
ICAgICAgIChiaSAodmVyc2lvbi1saXN0LTw9IG1pbi12ZXJzaW9uIChjZHIgYmkpKSkKICAgICAg
ICgocmVtb3ZlIDAgbWluLXZlcnNpb24pIG5pbCkKICAgICAgICh0CiAgICAgICAgKHJlcXVpcmUg
J2ZpbmRlci1pbmYgbmlsIHQpIDsgRm9yIGBwYWNrYWdlLS1idWlsdGlucycuCiAgICAgICAgKGFz
c3EgcGFja2FnZSBwYWNrYWdlLS1idWlsdGlucykpKSkpKQoKKGRlZnVuIHBhY2thZ2UtLWF1dG9s
b2Fkcy1maWxlLW5hbWUgKHBrZy1kZXNjKQogICJSZXR1cm4gdGhlIGFic29sdXRlIG5hbWUgb2Yg
dGhlIGF1dG9sb2FkcyBmaWxlLCBzYW5zIGV4dGVuc2lvbi4KUEtHLURFU0MgaXMgYSBgcGFja2Fn
ZS1kZXNjJyBvYmplY3QuIgogIChleHBhbmQtZmlsZS1uYW1lCiAgIChmb3JtYXQgIiVzLWF1dG9s
b2FkcyIgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKSkKICAgKHBhY2thZ2UtZGVzYy1kaXIg
cGtnLWRlc2MpKSkKCihkZWZ2YXIgSW5mby1kaXJlY3RvcnktbGlzdCkKKGRlY2xhcmUtZnVuY3Rp
b24gaW5mby1pbml0aWFsaXplICJpbmZvIiAoKSkKCihkZWZ2YXIgcGFja2FnZS0tcXVpY2tzdGFy
dC1wa2dzIHQKICAiSWYgc2V0IHRvIGEgbGlzdCwgd2UncmUgY29tcHV0aW5nIHRoZSBzZXQgb2Yg
cGtncyB0byBhY3RpdmF0ZS4iKQoKKGRlZnN1YnN0IHBhY2thZ2UtLWxpYnJhcnktc3RlbSAoZmls
ZSkKICAoY2F0Y2ggJ2RvbmUKICAgIChsZXQgKHJlc3VsdCkKICAgICAgKGRvbGlzdCAoc3VmZml4
IChnZXQtbG9hZC1zdWZmaXhlcykgZmlsZSkKICAgICAgICAoc2V0cSByZXN1bHQgKHN0cmluZy10
cmltIGZpbGUgbmlsIHN1ZmZpeCkpCiAgICAgICAgKHVubGVzcyAoZXF1YWwgZmlsZSByZXN1bHQp
CiAgICAgICAgICAodGhyb3cgJ2RvbmUgcmVzdWx0KSkpKSkpCgooZGVmdW4gcGFja2FnZS0tcmVs
b2FkLXByZXZpb3VzbHktbG9hZGVkIChwa2ctZGVzYykKICAiRm9yY2UgcmVpbXBvcnRhdGlvbiBv
ZiBmaWxlcyBpbiBQS0ctREVTQyBhbHJlYWR5IHByZXNlbnQgaW4gYGxvYWQtaGlzdG9yeScuCk5l
dyBlZGl0aW9ucyBvZiBmaWxlcyBjb250YWluIG1hY3JvIGRlZmluaXRpb25zIGFuZApyZWRlZmlu
aXRpb25zLCB0aGUgb3Zlcmxvb2tpbmcgb2Ygd2hpY2ggd291bGQgY2F1c2UKYnl0ZS1jb21waWxh
dGlvbiBvZiB0aGUgbmV3IHBhY2thZ2UgdG8gZmFpbC4iCiAgKHdpdGgtZGVtb3RlZC1lcnJvcnMg
IkVycm9yIGluIHBhY2thZ2UtLWxvYWQtZmlsZXMtZm9yLWFjdGl2YXRpb246ICVzIgogICAgKGxl
dCogKHJlc3VsdAogICAgICAgICAgIChkaXIgKHBhY2thZ2UtZGVzYy1kaXIgcGtnLWRlc2MpKQog
ICAgICAgICAgIDs7IEEgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd291bGQgc2tpcCBgZGlyJyBp
dHNlbGYuCiAgICAgICAgICAgOzsgSG93ZXZlciwgaW4gbm9ybWFsIHVzZSByZWxvYWRpbmcgZnJv
bSB0aGUgc2FtZSBkaXJlY3RvcnkKICAgICAgICAgICA7OyBuZXZlciBoYXBwZW5zIGFueXdheSwg
d2hpbGUgaW4gY2VydGFpbiBjYXNlcyBleHRlcm5hbCB0bwogICAgICAgICAgIDs7IEVtYWNzIGEg
cGFja2FnZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgbm90IG5lY2Vzc2FyeQogICAgICAgICAgIDs7
IHN0YXlzIGJ5dGUtaWRlbnRpY2FsLCBlLmcuICBkdXJpbmcgZGV2ZWxvcG1lbnQuICBKdXN0CiAg
ICAgICAgICAgOzsgZG9uJ3Qgc3BlY2lhbC1jYXNlIGBkaXInLgogICAgICAgICAgIChlZmZlY3Rp
dmUtcGF0aCAob3IgKGJvdW5kLWFuZC10cnVlLXAgZmluZC1saWJyYXJ5LXNvdXJjZS1wYXRoKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC1wYXRoKSkKICAgICAgICAgICAoZmls
ZXMgKGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseSBkaXIgIlxcYFteXFwuXS4qXFwuZWxcXCci
KSkKICAgICAgICAgICAoaGlzdG9yeSAobWFwY2FyICMnZmlsZS10cnVlbmFtZQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGNsLXJlbW92ZS1pZi1ub3QgIydzdHJpbmdwCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwY2FyICMnY2FyIGxvYWQtaGlz
dG9yeSkpKSkpCiAgICAgIChkb2xpc3QgKGZpbGUgZmlsZXMpCiAgICAgICAgKHdoZW4tbGV0ICgo
bGlicmFyeSAocGFja2FnZS0tbGlicmFyeS1zdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlIGRpcikpKQogICAgICAgICAgICAgICAgICAgKGNh
bm9uaWNhbCAobG9jYXRlLWxpYnJhcnkgbGlicmFyeSBuaWwgZWZmZWN0aXZlLXBhdGgpKQogICAg
ICAgICAgICAgICAgICAgKHRydWVuYW1lIChmaWxlLXRydWVuYW1lIGNhbm9uaWNhbCkpCiAgICAg
ICAgICAgICAgICAgICA7OyBOb3JtYWxseSwgYWxsIGZpbGVzIGluIGEgcGFja2FnZSBhcmUgY29t
cGlsZWQgYnkKICAgICAgICAgICAgICAgICAgIDs7IG5vdywgYnV0IGRvbid0IGFzc3VtZSB0aGF0
LiAgRS5nLiBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgIDs7IHZlcnNpb25zIGNhbiBhZGQg
b3IgcmVtb3ZlIGBuby1ieXRlLWNvbXBpbGUnLgogICAgICAgICAgICAgICAgICAgKGFsdG5hbWUg
KGlmIChzdHJpbmctc3VmZml4LXAgIi5lbCIgdHJ1ZW5hbWUpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiXFwuZWxcXCciICIuZWxjIiB0cnVlbmFtZSB0KQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiXFwuZWxjXFwnIiAiLmVsIiB0cnVlbmFtZSB0KSkpCiAgICAgICAg
ICAgICAgICAgICAoZm91bmQgKG9yIChtZW1iZXIgdHJ1ZW5hbWUgaGlzdG9yeSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGFuZCAobm90IChzdHJpbmc9IGFsdG5hbWUgdHJ1ZW5hbWUp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgYWx0bmFtZSBoaXN0
b3J5KSkpKQogICAgICAgICAgICAgICAgICAgKHJlY2VudC1pbmRleCAobGVuZ3RoIGZvdW5kKSkp
CiAgICAgICAgICAodW5sZXNzIChlcXVhbCAoZmlsZS1uYW1lLWJhc2UgbGlicmFyeSkKICAgICAg
ICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIiVzLWF1dG9sb2FkcyIgKHBhY2thZ2UtZGVzYy1u
YW1lIHBrZy1kZXNjKSkpCiAgICAgICAgICAgIChwdXNoIChjb25zIChleHBhbmQtZmlsZS1uYW1l
IGxpYnJhcnkgZGlyKSByZWNlbnQtaW5kZXgpIHJlc3VsdCkpKSkKICAgICAgKG1hcGMgKGxhbWJk
YSAoYykgKGxvYWQgKGNhciBjKSBuaWwgdCkpCiAgICAgICAgICAgIChzb3J0IHJlc3VsdCAobGFt
YmRhICh4IHkpICg8IChjZHIgeCkgKGNkciB5KSkpKSkpKSkKCihkZWZ1biBwYWNrYWdlLWFjdGl2
YXRlLTEgKHBrZy1kZXNjICZvcHRpb25hbCByZWxvYWQgZGVwcykKICAiQWN0aXZhdGUgcGFja2Fn
ZSBnaXZlbiBieSBQS0ctREVTQywgZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBhY3RpdmUuCklmIERF
UFMgaXMgbm9uLW5pbCwgYWxzbyBhY3RpdmF0ZSBpdHMgZGVwZW5kZW5jaWVzICh1bmxlc3MgdGhl
eQphcmUgYWxyZWFkeSBhY3RpdmF0ZWQpLgpJZiBSRUxPQUQgaXMgbm9uLW5pbCwgYWxzbyBgbG9h
ZCcgYW55IGZpbGVzIGluc2lkZSB0aGUgcGFja2FnZSB3aGljaApjb3JyZXNwb25kIHRvIHByZXZp
b3VzbHkgbG9hZGVkIGZpbGVzLiIKICAobGV0KiAoKG5hbWUgKHBhY2thZ2UtZGVzYy1uYW1lIHBr
Zy1kZXNjKSkKICAgICAgICAgKHBrZy1kaXIgKHBhY2thZ2UtZGVzYy1kaXIgcGtnLWRlc2MpKSkK
ICAgICh1bmxlc3MgcGtnLWRpcgogICAgICAoZXJyb3IgIkludGVybmFsIGVycm9yOiB1bmFibGUg
dG8gZmluZCBkaXJlY3RvcnkgZm9yIGAlcyciCiAgICAgICAgICAgICAocGFja2FnZS1kZXNjLWZ1
bGwtbmFtZSBwa2ctZGVzYykpKQogICAgKGNhdGNoICdleGl0CiAgICAgIDs7IEFjdGl2YXRlIGl0
cyBkZXBlbmRlbmNpZXMgcmVjdXJzaXZlbHkuCiAgICAgIDs7IEZJWE1FOiBUaGlzIGRvZXNuJ3Qg
Y2hlY2sgd2hldGhlciB0aGUgYWN0aXZhdGVkIHZlcnNpb24gaXMgdGhlCiAgICAgIDs7IHJlcXVp
cmVkIHZlcnNpb24uCiAgICAgICh3aGVuIGRlcHMKICAgICAgICAoZG9saXN0IChyZXEgKHBhY2th
Z2UtZGVzYy1yZXFzIHBrZy1kZXNjKSkKICAgICAgICAgICh1bmxlc3MgKHBhY2thZ2UtYWN0aXZh
dGUgKGNhciByZXEpKQogICAgICAgICAgICAobWVzc2FnZSAiVW5hYmxlIHRvIGFjdGl2YXRlIHBh
Y2thZ2UgYCVzJy5cblJlcXVpcmVkIHBhY2thZ2UgYCVzLSVzJyBpcyB1bmF2YWlsYWJsZSIKICAg
ICAgICAgICAgICAgICAgICAgbmFtZSAoY2FyIHJlcSkgKHBhY2thZ2UtdmVyc2lvbi1qb2luIChj
YWRyIHJlcSkpKQogICAgICAgICAgICAodGhyb3cgJ2V4aXQgbmlsKSkpKQogICAgICAoaWYgKGxp
c3RwIHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtncykKICAgICAgICAgIDs7IFdlJ3JlIG9ubHkgY29s
bGVjdGluZyB0aGUgc2V0IG9mIHBhY2thZ2VzIHRvIGFjdGl2YXRlIQogICAgICAgICAgKHB1c2gg
cGtnLWRlc2MgcGFja2FnZS0tcXVpY2tzdGFydC1wa2dzKQogICAgICAgICh3aGVuIHJlbG9hZAog
ICAgICAgICAgKHBhY2thZ2UtLXJlbG9hZC1wcmV2aW91c2x5LWxvYWRlZCBwa2ctZGVzYykpCiAg
ICAgICAgKHdpdGgtZGVtb3RlZC1lcnJvcnMgIkVycm9yIGxvYWRpbmcgYXV0b2xvYWRzOiAlcyIK
ICAgICAgICAgIChsb2FkIChwYWNrYWdlLS1hdXRvbG9hZHMtZmlsZS1uYW1lIHBrZy1kZXNjKSBu
aWwgdCkpCiAgICAgICAgKGFkZC10by1saXN0ICdsb2FkLXBhdGggKGRpcmVjdG9yeS1maWxlLW5h
bWUgcGtnLWRpcikpKQogICAgICA7OyBBZGQgaW5mbyBub2RlLgogICAgICAod2hlbiAoZmlsZS1l
eGlzdHMtcCAoZXhwYW5kLWZpbGUtbmFtZSAiZGlyIiBwa2ctZGlyKSkKICAgICAgICA7OyBGSVhN
RTogbm90IHRoZSBmcmllbmRsaWVzdCwgYnV0IHNpbXBsZS4KICAgICAgICAocmVxdWlyZSAnaW5m
bykKICAgICAgICAoaW5mby1pbml0aWFsaXplKQogICAgICAgIChhZGQtdG8tbGlzdCAnSW5mby1k
aXJlY3RvcnktbGlzdCBwa2ctZGlyKSkKICAgICAgKHB1c2ggbmFtZSBwYWNrYWdlLWFjdGl2YXRl
ZC1saXN0KQogICAgICA7OyBEb24ndCByZXR1cm4gbmlsLgogICAgICB0KSkpCgo7Ozs7IGBwYWNr
YWdlLWFjdGl2YXRlJwoKKGRlZnVuIHBhY2thZ2UtLWdldC1hY3RpdmF0YWJsZS1wa2cgKHBrZy1u
YW1lKQogIDs7IElzICJhY3RpdmF0YWJsZSIgYSB3b3JkPwogIChsZXQgKChwa2ctZGVzY3MgKHNv
cnQgKGNkciAoYXNzcSBwa2ctbmFtZSBwYWNrYWdlLWFsaXN0KSkKICAgICAgICAgICAgICAgICAg
ICAgICAgIChsYW1iZGEgKHAxIHAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgo
djEgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIHAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHYyIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBwMikpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBQcmVmZXIgVkMg
cGFja2FnZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLXAgcDEp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLXAgcDIpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDs7IFByZWZlciBidWlsdGluIHBhY2thZ2VzLgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kaXNhYmxlZC1wIHAxIHYxKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobm90IChwYWNrYWdlLWRpc2FibGVkLXAgcDIgdjIpKSkp
KSkpKQogICAgOzsgQ2hlY2sgaWYgUEFDS0FHRSBpcyBhdmFpbGFibGUgaW4gYHBhY2thZ2UtYWxp
c3QnLgogICAgKHdoaWxlCiAgICAgICAgKHdoZW4gcGtnLWRlc2NzCiAgICAgICAgICAobGV0ICgo
YXZhaWxhYmxlLXZlcnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIChjYXIgcGtnLWRlc2NzKSkp
KQogICAgICAgICAgICAocGFja2FnZS1kaXNhYmxlZC1wIHBrZy1uYW1lIGF2YWlsYWJsZS12ZXJz
aW9uKSkpCiAgICAgIChzZXRxIHBrZy1kZXNjcyAoY2RyIHBrZy1kZXNjcykpKQogICAgKGNhciBw
a2ctZGVzY3MpKSkKCjs7IFRoaXMgZnVuY3Rpb24gYWN0aXZhdGVzIGEgbmV3ZXIgdmVyc2lvbiBv
ZiBhIHBhY2thZ2UgaWYgYW4gb2xkZXIKOzsgb25lIHdhcyBhbHJlYWR5IGFjdGl2YXRlZC4gIEl0
IGFsc28gbG9hZHMgYSBmZWF0dXJlcyBvZiB0aGlzCjs7IHBhY2thZ2Ugd2hpY2ggd2VyZSBhbHJl
YWR5IGxvYWRlZC4KKGRlZnVuIHBhY2thZ2UtYWN0aXZhdGUgKHBhY2thZ2UgJm9wdGlvbmFsIGZv
cmNlKQogICJBY3RpdmF0ZSB0aGUgcGFja2FnZSBuYW1lZCBQQUNLQUdFLgpJZiBGT1JDRSBpcyB0
cnVlLCAocmUtKWFjdGl2YXRlIGl0IGlmIGl0J3MgYWxyZWFkeSBhY3RpdmF0ZWQuCk5ld2VyIHZl
cnNpb25zIGFyZSBhbHdheXMgYWN0aXZhdGVkLCByZWdhcmRsZXNzIG9mIEZPUkNFLiIKICAobGV0
ICgocGtnLWRlc2MgKHBhY2thZ2UtLWdldC1hY3RpdmF0YWJsZS1wa2cgcGFja2FnZSkpKQogICAg
KGNvbmQKICAgICA7OyBJZiBubyBzdWNoIHBhY2thZ2UgaXMgZm91bmQsIG1heWJlIGl0J3MgYnVp
bHQtaW4uCiAgICAgKChudWxsIHBrZy1kZXNjKQogICAgICAocGFja2FnZS1idWlsdC1pbi1wIHBh
Y2thZ2UpKQogICAgIDs7IElmIHRoZSBwYWNrYWdlIGlzIGFscmVhZHkgYWN0aXZhdGVkLCBqdXN0
IHJldHVybiB0LgogICAgICgoYW5kIChtZW1xIHBhY2thZ2UgcGFja2FnZS1hY3RpdmF0ZWQtbGlz
dCkgKG5vdCBmb3JjZSkpCiAgICAgIHQpCiAgICAgOzsgT3RoZXJ3aXNlLCBwcm9jZWVkIHdpdGgg
YWN0aXZhdGlvbi4KICAgICAodCAocGFja2FnZS1hY3RpdmF0ZS0xIHBrZy1kZXNjIG5pbCAnZGVw
cykpKSkpCgoMCjs7OyBJbnN0YWxsYXRpb24gLS0gTG9jYWwgb3BlcmF0aW9ucwo7OyBUaGlzIHNl
Y3Rpb24gY29udGFpbnMgYSB2YXJpZXR5IG9mIGZlYXR1cmVzIHJlZ2FyZGluZyBpbnN0YWxsaW5n
IGEKOzsgcGFja2FnZSB0by9mcm9tIGRpc2suICBUaGlzIGluY2x1ZGVzIGF1dG9sb2FkIGdlbmVy
YXRpb24sCjs7IHVucGFja2luZywgY29tcGlsaW5nLCBhcyB3ZWxsIGFzIGRlZmluaW5nIGEgcGFj
a2FnZSBmcm9tIHRoZQo7OyBjdXJyZW50IGJ1ZmZlci4KCjs7OzsgVW5wYWNraW5nCihkZWZ2YXIg
dGFyLXBhcnNlLWluZm8pCihkZWNsYXJlLWZ1bmN0aW9uIHRhci11bnRhci1idWZmZXIgInRhci1t
b2RlIiAoKSkKKGRlY2xhcmUtZnVuY3Rpb24gdGFyLWhlYWRlci1uYW1lICJ0YXItbW9kZSIgKHRh
ci1oZWFkZXIpIHQpCihkZWNsYXJlLWZ1bmN0aW9uIHRhci1oZWFkZXItbGluay10eXBlICJ0YXIt
bW9kZSIgKHRhci1oZWFkZXIpIHQpCgooZGVmdW4gcGFja2FnZS11bnRhci1idWZmZXIgKGRpcikK
ICAiVW50YXIgdGhlIGN1cnJlbnQgYnVmZmVyLgpUaGlzIHVzZXMgYHRhci11bnRhci1idWZmZXIn
IGZyb20gVGFyIG1vZGUuICBBbGwgZmlsZXMgc2hvdWxkCnVudGFyIGludG8gYSBkaXJlY3Rvcnkg
bmFtZWQgRElSOyBvdGhlcndpc2UsIHNpZ25hbCBhbiBlcnJvci4iCiAgKHRhci1tb2RlKQogIDs7
IE1ha2Ugc3VyZSBldmVyeXRoaW5nIGV4dHJhY3RzIGludG8gRElSLgogIChsZXQgKChyZWdleHAg
KGNvbmNhdCAiXFxgIiAocmVnZXhwLXF1b3RlIChleHBhbmQtZmlsZS1uYW1lIGRpcikpICIvIikp
CiAgICAgICAgKGNhc2UtZm9sZC1zZWFyY2ggKGZpbGUtbmFtZS1jYXNlLWluc2Vuc2l0aXZlLXAg
ZGlyKSkpCiAgICAoZG9saXN0ICh0YXItZGF0YSB0YXItcGFyc2UtaW5mbykKICAgICAgKGxldCAo
KG5hbWUgKGV4cGFuZC1maWxlLW5hbWUgKHRhci1oZWFkZXItbmFtZSB0YXItZGF0YSkpKSkKICAg
ICAgICAob3IgKHN0cmluZy1tYXRjaCByZWdleHAgbmFtZSkKICAgICAgICAgICAgOzsgVGFyYmFs
bHMgY3JlYXRlZCBieSBzb21lIHV0aWxpdGllcyBkb24ndCBsaXN0CiAgICAgICAgICAgIDs7IGRp
cmVjdG9yaWVzIHdpdGggYSB0cmFpbGluZyBzbGFzaCAoQnVnIzEzMTM2KS4KICAgICAgICAgICAg
KGFuZCAoc3RyaW5nLWVxdWFsIChleHBhbmQtZmlsZS1uYW1lIGRpcikgbmFtZSkKICAgICAgICAg
ICAgICAgICAoZXEgKHRhci1oZWFkZXItbGluay10eXBlIHRhci1kYXRhKSA1KSkKICAgICAgICAg
ICAgKGVycm9yICJQYWNrYWdlIGRvZXMgbm90IHVudGFyIGNsZWFubHkgaW50byBkaXJlY3Rvcnkg
JXMvIiBkaXIpKSkpKQogICh0YXItdW50YXItYnVmZmVyKSkKCihkZWZ1biBwYWNrYWdlLS1hbGlz
dC10by1wbGlzdC1hcmdzIChhbGlzdCkKICAobWFwY2FyICMnbWFjcm9leHAtcXVvdGUKICAgICAg
ICAgIChhcHBseSAjJ25jb25jCiAgICAgICAgICAgICAgICAgKG1hcGNhciAobGFtYmRhIChwYWly
KSAobGlzdCAoY2FyIHBhaXIpIChjZHIgcGFpcikpKSBhbGlzdCkpKSkKCihkZWZ1biBwYWNrYWdl
LXVucGFjayAocGtnLWRlc2MpCiAgIkluc3RhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50
IGJ1ZmZlciBhcyBhIHBhY2thZ2UuIgogIChsZXQqICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUg
cGtnLWRlc2MpKQogICAgICAgICAoZGlybmFtZSAocGFja2FnZS1kZXNjLWZ1bGwtbmFtZSBwa2ct
ZGVzYykpCiAgICAgICAgIChwa2ctZGlyIChleHBhbmQtZmlsZS1uYW1lIGRpcm5hbWUgcGFja2Fn
ZS11c2VyLWRpcikpKQogICAgKHBjYXNlIChwYWNrYWdlLWRlc2Mta2luZCBwa2ctZGVzYykKICAg
ICAgKCdkaXIKICAgICAgIChtYWtlLWRpcmVjdG9yeSBwa2ctZGlyIHQpCiAgICAgICAobGV0ICgo
ZmlsZS1saXN0CiAgICAgICAgICAgICAgKGRpcmVjdG9yeS1maWxlcwogICAgICAgICAgICAgICBk
ZWZhdWx0LWRpcmVjdG9yeSAnZnVsbCAiXFxgW14uXS4qXFwuZWxcXCciICdub3NvcnQpKSkKICAg
ICAgICAgKGRvbGlzdCAoc291cmNlLWZpbGUgZmlsZS1saXN0KQogICAgICAgICAgIChsZXQgKCh0
YXJnZXQtZWwtZmlsZQogICAgICAgICAgICAgICAgICAoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1u
YW1lLW5vbmRpcmVjdG9yeSBzb3VyY2UtZmlsZSkgcGtnLWRpcikpKQogICAgICAgICAgICAgKGNv
cHktZmlsZSBzb3VyY2UtZmlsZSB0YXJnZXQtZWwtZmlsZSB0KSkpCiAgICAgICAgIDs7IE5vdyB0
aGF0IHRoZSBmaWxlcyBoYXZlIGJlZW4gaW5zdGFsbGVkLCB0aGlzIHBhY2thZ2UgaXMKICAgICAg
ICAgOzsgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGB0YXInIG9yIGEgYHNpbmdsZScuIExldCdz
IG1ha2UKICAgICAgICAgOzsgdGhpbmdzIHNpbXBsZSBieSBlbnN1cmluZyB3ZSdyZSBvbmUgb2Yg
dGhlbS4KICAgICAgICAgKHNldGYgKHBhY2thZ2UtZGVzYy1raW5kIHBrZy1kZXNjKQogICAgICAg
ICAgICAgICAoaWYgKGxlbmd0aD4gZmlsZS1saXN0IDEpICd0YXIgJ3NpbmdsZSkpKSkKICAgICAg
KCd0YXIKICAgICAgIChtYWtlLWRpcmVjdG9yeSBwYWNrYWdlLXVzZXItZGlyIHQpCiAgICAgICAo
bGV0KiAoKGRlZmF1bHQtZGlyZWN0b3J5IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IHBhY2thZ2Ut
dXNlci1kaXIpKSkKICAgICAgICAgKHBhY2thZ2UtdW50YXItYnVmZmVyIGRpcm5hbWUpKSkKICAg
ICAgKCdzaW5nbGUKICAgICAgIChsZXQgKChlbC1maWxlIChleHBhbmQtZmlsZS1uYW1lIChmb3Jt
YXQgIiVzLmVsIiBuYW1lKSBwa2ctZGlyKSkpCiAgICAgICAgIChtYWtlLWRpcmVjdG9yeSBwa2ct
ZGlyIHQpCiAgICAgICAgIChwYWNrYWdlLS13cml0ZS1maWxlLW5vLWNvZGluZyBlbC1maWxlKSkp
CiAgICAgIChraW5kIChlcnJvciAiVW5rbm93biBwYWNrYWdlIGtpbmQ6ICVTIiBraW5kKSkpCiAg
ICAocGFja2FnZS0tbWFrZS1hdXRvbG9hZHMtYW5kLXN0dWZmIHBrZy1kZXNjIHBrZy1kaXIpCiAg
ICA7OyBVcGRhdGUgcGFja2FnZS1hbGlzdC4KICAgIChsZXQgKChuZXctZGVzYyAocGFja2FnZS1s
b2FkLWRlc2NyaXB0b3IgcGtnLWRpcikpKQogICAgICAodW5sZXNzIChlcXVhbCAocGFja2FnZS1k
ZXNjLWZ1bGwtbmFtZSBuZXctZGVzYykKICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVz
Yy1mdWxsLW5hbWUgcGtnLWRlc2MpKQogICAgICAgIChlcnJvciAiVGhlIHJldHJpZXZlZCBwYWNr
YWdlIChgJXMnKSBkb2Vzbid0IG1hdGNoIHdoYXQgdGhlIGFyY2hpdmUgb2ZmZXJlZCAoYCVzJyki
CiAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIG5ldy1kZXNjKSAocGFja2Fn
ZS1kZXNjLWZ1bGwtbmFtZSBwa2ctZGVzYykpKQogICAgICA7OyBBY3RpdmF0aW9uIGhhcyB0byBi
ZSBkb25lIGJlZm9yZSBjb21waWxhdGlvbiwgc28gdGhhdCBpZiB3ZSdyZQogICAgICA7OyB1cGdy
YWRpbmcgYW5kIG1hY3JvcyBoYXZlIGNoYW5nZWQgd2UgbG9hZCB0aGUgbmV3IGRlZmluaXRpb25z
CiAgICAgIDs7IGJlZm9yZSBjb21waWxpbmcuCiAgICAgICh3aGVuIChwYWNrYWdlLWFjdGl2YXRl
LTEgbmV3LWRlc2MgOnJlbG9hZCA6ZGVwcykKICAgICAgICA7OyBGSVhNRTogQ29tcGlsYXRpb24g
c2hvdWxkIGJlIGRvbmUgYXMgYSBzZXBhcmF0ZSwgb3B0aW9uYWwsIHN0ZXAuCiAgICAgICAgOzsg
RS5nLiBmb3IgbXVsdGktcGFja2FnZSBpbnN0YWxscywgd2Ugc2hvdWxkIGZpcnN0IGluc3RhbGwg
YWxsIHBhY2thZ2VzCiAgICAgICAgOzsgYW5kIHRoZW4gY29tcGlsZSB0aGVtLgogICAgICAgIChw
YWNrYWdlLS1jb21waWxlIG5ldy1kZXNjKQogICAgICAgICh3aGVuIHBhY2thZ2UtbmF0aXZlLWNv
bXBpbGUKICAgICAgICAgIChwYWNrYWdlLS1uYXRpdmUtY29tcGlsZS1hc3luYyBuZXctZGVzYykp
CiAgICAgICAgOzsgQWZ0ZXIgY29tcGlsYXRpb24sIGxvYWQgYWdhaW4gYW55IGZpbGVzIGxvYWRl
ZCBieQogICAgICAgIDs7IGBhY3RpdmF0ZS0xJywgc28gdGhhdCB3ZSB1c2UgdGhlIGJ5dGUtY29t
cGlsZWQgZGVmaW5pdGlvbnMuCiAgICAgICAgKHBhY2thZ2UtLXJlbG9hZC1wcmV2aW91c2x5LWxv
YWRlZCBuZXctZGVzYykpKQogICAgcGtnLWRpcikpCgooZGVmdW4gcGFja2FnZS1nZW5lcmF0ZS1k
ZXNjcmlwdGlvbi1maWxlIChwa2ctZGVzYyBwa2ctZmlsZSkKICAiQ3JlYXRlIHRoZSBmb28tcGtn
LmVsIGZpbGUgUEtHLUZJTEUgZm9yIHNpbmdsZS1maWxlIHBhY2thZ2UgUEtHLURFU0MuIgogIChs
ZXQqICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgIChsZXQgKChwcmlu
dC1sZXZlbCBuaWwpCiAgICAgICAgICAocHJpbnQtcXVvdGVkIHQpCiAgICAgICAgICAocHJpbnQt
bGVuZ3RoIG5pbCkpCiAgICAgICh3cml0ZS1yZWdpb24KICAgICAgIChjb25jYXQKICAgICAgICAi
Ozs7IEdlbmVyYXRlZCBwYWNrYWdlIGRlc2NyaXB0aW9uIGZyb20gIgogICAgICAgIChyZXBsYWNl
LXJlZ2V4cC1pbi1zdHJpbmcgIi1wa2dcXC5lbFxcJyIgIi5lbCIKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IHBrZy1maWxlKSkKICAgICAg
ICAiICAtKi0gbm8tYnl0ZS1jb21waWxlOiB0IC0qLVxuIgogICAgICAgIChwcmluMS10by1zdHJp
bmcKICAgICAgICAgKG5jb25jCiAgICAgICAgICAobGlzdCAnZGVmaW5lLXBhY2thZ2UKICAgICAg
ICAgICAgICAgIChzeW1ib2wtbmFtZSBuYW1lKQogICAgICAgICAgICAgICAgKHBhY2thZ2UtdmVy
c2lvbi1qb2luIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBwa2ctZGVzYykpCiAgICAgICAgICAgICAg
ICAocGFja2FnZS1kZXNjLXN1bW1hcnkgcGtnLWRlc2MpCiAgICAgICAgICAgICAgICAobGV0ICgo
cmVxdWlyZXMgKHBhY2thZ2UtZGVzYy1yZXFzIHBrZy1kZXNjKSkpCiAgICAgICAgICAgICAgICAg
IChsaXN0ICdxdW90ZQogICAgICAgICAgICAgICAgICAgICAgICA7OyBUdXJuIHZlcnNpb24gbGlz
dHMgaW50byBzdHJpbmcgZm9ybS4KICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNhcgogICAg
ICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZWx0KQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAobGlzdCAoY2FyIGVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBh
Y2thZ2UtdmVyc2lvbi1qb2luIChjYWRyIGVsdCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAg
IHJlcXVpcmVzKSkpKQogICAgICAgICAgKHBhY2thZ2UtLWFsaXN0LXRvLXBsaXN0LWFyZ3MKICAg
ICAgICAgICAocGFja2FnZS1kZXNjLWV4dHJhcyBwa2ctZGVzYykpKSkKICAgICAgICAiXG4iKQog
ICAgICAgbmlsIHBrZy1maWxlIG5pbCAnc2lsZW50KSkpKQoKCjs7OzsgQXV0b2xvYWQKKGRlY2xh
cmUtZnVuY3Rpb24gYXV0b2xvYWQtcnVicmljICJhdXRvbG9hZCIgKGZpbGUgJm9wdGlvbmFsIHR5
cGUgZmVhdHVyZSkpCgooZGVmdW4gcGFja2FnZS1hdXRvbG9hZC1lbnN1cmUtZGVmYXVsdC1maWxl
IChmaWxlKQogICJNYWtlIHN1cmUgdGhhdCB0aGUgYXV0b2xvYWQgZmlsZSBGSUxFIGV4aXN0cyBh
bmQgaWYgbm90IGNyZWF0ZSBpdC4iCiAgKGRlY2xhcmUgKG9ic29sZXRlIG5pbCAiMjkuMSIpKQog
ICh1bmxlc3MgKGZpbGUtZXhpc3RzLXAgZmlsZSkKICAgIChyZXF1aXJlICdhdXRvbG9hZCkKICAg
IChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci13cml0ZSAndXRmLTgtZW1hY3MtdW5peCkpCiAgICAg
ICh3aXRoLXN1cHByZXNzZWQtd2FybmluZ3MgKChvYnNvbGV0ZSBhdXRvbG9hZC1ydWJyaWMpKQog
ICAgICAgICh3cml0ZS1yZWdpb24gKGF1dG9sb2FkLXJ1YnJpYyBmaWxlICJwYWNrYWdlIiBuaWwp
CiAgICAgICAgICAgICAgICAgICAgICBuaWwgZmlsZSBuaWwgJ3NpbGVudCkpKSkKICBmaWxlKQoK
KGRlZnZhciBhdXRvbG9hZC10aW1lc3RhbXBzKQooZGVmdmFyIHZlcnNpb24tY29udHJvbCkKCihk
ZWZ1biBwYWNrYWdlLWdlbmVyYXRlLWF1dG9sb2FkcyAobmFtZSBwa2ctZGlyKQogICJHZW5lcmF0
ZSBhdXRvbG9hZHMgaW4gUEtHLURJUiBmb3IgcGFja2FnZSBuYW1lZCBOQU1FLiIKICAobGV0KiAo
KGF1dG8tbmFtZSAoZm9ybWF0ICIlcy1hdXRvbG9hZHMuZWwiIG5hbWUpKQogICAgICAgICA7Oyhp
Z25vcmUtbmFtZSAoY29uY2F0IG5hbWUgIi1wa2cuZWwiKSkKICAgICAgICAgKG91dHB1dC1maWxl
IChleHBhbmQtZmlsZS1uYW1lIGF1dG8tbmFtZSBwa2ctZGlyKSkKICAgICAgICAgOzsgV2UgZG9u
J3QgbmVlZCAnZW0sIGFuZCB0aGlzIG1ha2VzIHRoZSBvdXRwdXQgcmVwcm9kdWNpYmxlLgogICAg
ICAgICAoYXV0b2xvYWQtdGltZXN0YW1wcyBuaWwpCiAgICAgICAgIChiYWNrdXAtaW5oaWJpdGVk
IHQpCiAgICAgICAgICh2ZXJzaW9uLWNvbnRyb2wgJ25ldmVyKSkKICAgIChsb2FkZGVmcy1nZW5l
cmF0ZQogICAgIHBrZy1kaXIgb3V0cHV0LWZpbGUgbmlsCiAgICAgKHByaW4xLXRvLXN0cmluZwog
ICAgICAnKGFkZC10by1saXN0CiAgICAgICAgJ2xvYWQtcGF0aAogICAgICAgIDs7IEFkZCB0aGUg
ZGlyZWN0b3J5IHRoYXQgd2lsbCBjb250YWluIHRoZSBhdXRvbG9hZCBmaWxlIHRvCiAgICAgICAg
OzsgdGhlIGxvYWQgcGF0aC4gIFdlIGRvbid0IGhhcmQtY29kZSBgcGtnLWRpcicsIHRvIGF2b2lk
CiAgICAgICAgOzsgaXNzdWVzIGlmIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpcyBtb3ZlZCBhcm91
bmQuCiAgICAgICAgKG9yIChhbmQgbG9hZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1kaXJlY3Rvcnkg
bG9hZC1maWxlLW5hbWUpKQogICAgICAgICAgICAoY2FyIGxvYWQtcGF0aCkpKSkpCiAgICAobGV0
ICgoYnVmIChmaW5kLWJ1ZmZlci12aXNpdGluZyBvdXRwdXQtZmlsZSkpKQogICAgICAod2hlbiBi
dWYgKGtpbGwtYnVmZmVyIGJ1ZikpKQogICAgYXV0by1uYW1lKSkKCihkZWZ1biBwYWNrYWdlLS1t
YWtlLWF1dG9sb2Fkcy1hbmQtc3R1ZmYgKHBrZy1kZXNjIHBrZy1kaXIpCiAgIkdlbmVyYXRlIGF1
dG9sb2FkcywgZGVzY3JpcHRpb24gZmlsZSwgZXRjLiwgZm9yIFBLRy1ERVNDIGluc3RhbGxlZCBh
dCBQS0ctRElSLiIKICAocGFja2FnZS1nZW5lcmF0ZS1hdXRvbG9hZHMgKHBhY2thZ2UtZGVzYy1u
YW1lIHBrZy1kZXNjKSBwa2ctZGlyKQogIChsZXQgKChkZXNjLWZpbGUgKGV4cGFuZC1maWxlLW5h
bWUgKHBhY2thZ2UtLWRlc2NyaXB0aW9uLWZpbGUgcGtnLWRpcikKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHBrZy1kaXIpKSkKICAgICh1bmxlc3MgKGZpbGUtZXhpc3RzLXAg
ZGVzYy1maWxlKQogICAgICAocGFja2FnZS1nZW5lcmF0ZS1kZXNjcmlwdGlvbi1maWxlIHBrZy1k
ZXNjIGRlc2MtZmlsZSkpKQogIDs7IEZJWE1FOiBDcmVhdGUgZm9vLmluZm8gYW5kIGRpciBmaWxl
IGZyb20gZm9vLnRleGk/CiAgKQoKOzs7OyBDb21waWxhdGlvbgooZGVmdmFyIHdhcm5pbmctbWlu
aW11bS1sZXZlbCkKKGRlZnZhciBieXRlLWNvbXBpbGUtaWdub3JlLWZpbGVzKQooZGVmdW4gcGFj
a2FnZS0tY29tcGlsZSAocGtnLWRlc2MpCiAgIkJ5dGUtY29tcGlsZSBpbnN0YWxsZWQgcGFja2Fn
ZSBQS0ctREVTQy4KVGhpcyBhc3N1bWVzIHRoYXQgYHBrZy1kZXNjJyBoYXMgYWxyZWFkeSBiZWVu
IGFjdGl2YXRlZCB3aXRoCmBwYWNrYWdlLWFjdGl2YXRlLTEnLiIKICAobGV0ICgoYnl0ZS1jb21w
aWxlLWlnbm9yZS1maWxlcyAocGFja2FnZS0tcGFyc2UtZWxwYWlnbm9yZSBwa2ctZGVzYykpCiAg
ICAgICAgKHdhcm5pbmctbWluaW11bS1sZXZlbCA6ZXJyb3IpCiAgICAgICAgKGxvYWQtcGF0aCBs
b2FkLXBhdGgpKQogICAgKGJ5dGUtcmVjb21waWxlLWRpcmVjdG9yeSAocGFja2FnZS1kZXNjLWRp
ciBwa2ctZGVzYykgMCB0KSkpCgooZGVmdW4gcGFja2FnZS0tbmF0aXZlLWNvbXBpbGUtYXN5bmMg
KHBrZy1kZXNjKQogICJOYXRpdmUgY29tcGlsZSBpbnN0YWxsZWQgcGFja2FnZSBQS0ctREVTQyBh
c3luY2hyb25vdXNseS4KVGhpcyBhc3N1bWVzIHRoYXQgYHBrZy1kZXNjJyBoYXMgYWxyZWFkeSBi
ZWVuIGFjdGl2YXRlZCB3aXRoCmBwYWNrYWdlLWFjdGl2YXRlLTEnLiIKICAod2hlbiAoYW5kIChm
Ym91bmRwICduYXRpdmUtY29tcC1hdmFpbGFibGUtcCkKICAgICAgICAgICAgIChuYXRpdmUtY29t
cC1hdmFpbGFibGUtcCkpCiAgICAobGV0ICgod2FybmluZy1taW5pbXVtLWxldmVsIDplcnJvcikp
CiAgICAgIChuYXRpdmUtY29tcGlsZS1hc3luYyAocGFja2FnZS1kZXNjLWRpciBwa2ctZGVzYykg
dCkpKSkKCjs7OzsgSW5mZXJyaW5nIHBhY2thZ2UgZnJvbSBjdXJyZW50IGJ1ZmZlcgooZGVmdW4g
cGFja2FnZS1yZWFkLWZyb20tc3RyaW5nIChzdHIpCiAgIlJlYWQgYSBMaXNwIGV4cHJlc3Npb24g
ZnJvbSBTVFIuClNpZ25hbCBhbiBlcnJvciBpZiB0aGUgZW50aXJlIHN0cmluZyB3YXMgbm90IHVz
ZWQuIgogIChwY2FzZS1sZXQgKChgKCxleHByIC4gLG9mZnNldCkgKHJlYWQtZnJvbS1zdHJpbmcg
c3RyKSkpCiAgICAoY29uZGl0aW9uLWNhc2UgKCkKICAgICAgICA7OyBUaGUgY2FsbCB0byBgaWdu
b3JlJyBzdXBwcmVzc2VzIGEgY29tcGlsZXIgd2FybmluZy4KICAgICAgICAocHJvZ24gKGlnbm9y
ZSAocmVhZC1mcm9tLXN0cmluZyBzdHIgb2Zmc2V0KSkKICAgICAgICAgICAgICAgKGVycm9yICJD
YW4ndCByZWFkIHdob2xlIHN0cmluZyIpKQogICAgICAoZW5kLW9mLWZpbGUgZXhwcikpKSkKCihk
ZWZ1biBwYWNrYWdlLS1wcmVwYXJlLWRlcGVuZGVuY2llcyAoZGVwcykKICAiVHVybiBERVBTIGlu
dG8gYW4gYWNjZXB0YWJsZSBsaXN0IG9mIGRlcGVuZGVuY2llcy4KCkFueSBwYXJ0cyBtaXNzaW5n
IGEgdmVyc2lvbiBzdHJpbmcgZ2V0IGEgZGVmYXVsdCB2ZXJzaW9uIHN0cmluZwpvZiBcIjBcIiAo
bWVhbmluZyBhbnkgdmVyc2lvbikgYW5kIGFuIGFwcHJvcHJpYXRlIGxldmVsIG9mIGxpc3RzCmlz
IHdyYXBwZWQgYXJvdW5kIGFueSBwYXJ0cyByZXF1aXJpbmcgaXQuIgogIChjb25kCiAgICgobm90
IChsaXN0cCBkZXBzKSkKICAgIChlcnJvciAiSW52YWxpZCByZXF1aXJlbWVudCBzcGVjaWZpZXI6
ICVTIiBkZXBzKSkKICAgKHQgKG1hcGNhciAobGFtYmRhIChkZXApCiAgICAgICAgICAgICAgICAo
Y29uZAogICAgICAgICAgICAgICAgICgoc3ltYm9scCBkZXApIGAoLGRlcCAiMCIpKQogICAgICAg
ICAgICAgICAgICgoc3RyaW5ncCBkZXApCiAgICAgICAgICAgICAgICAgIChlcnJvciAiSW52YWxp
ZCByZXF1aXJlbWVudCBzcGVjaWZpZXI6ICVTIiBkZXApKQogICAgICAgICAgICAgICAgICgoYW5k
IChsaXN0cCBkZXApIChudWxsIChjZHIgZGVwKSkpCiAgICAgICAgICAgICAgICAgIChsaXN0IChj
YXIgZGVwKSAiMCIpKQogICAgICAgICAgICAgICAgICh0IGRlcCkpKQogICAgICAgICAgICAgIGRl
cHMpKSkpCgooZGVjbGFyZS1mdW5jdGlvbiBsbS1oZWFkZXIgImxpc3AtbW50IiAoaGVhZGVyKSkK
KGRlY2xhcmUtZnVuY3Rpb24gbG0taGVhZGVyLW11bHRpbGluZSAibGlzcC1tbnQiIChoZWFkZXIp
KQooZGVjbGFyZS1mdW5jdGlvbiBsbS1ob21lcGFnZSAibGlzcC1tbnQiICgmb3B0aW9uYWwgZmls
ZSkpCihkZWNsYXJlLWZ1bmN0aW9uIGxtLWtleXdvcmRzLWxpc3QgImxpc3AtbW50IiAoJm9wdGlv
bmFsIGZpbGUpKQooZGVjbGFyZS1mdW5jdGlvbiBsbS1tYWludGFpbmVycyAibGlzcC1tbnQiICgm
b3B0aW9uYWwgZmlsZSkpCihkZWNsYXJlLWZ1bmN0aW9uIGxtLW1haW50YWluZXIgImxpc3AtbW50
IiAoJm9wdGlvbmFsIGZpbGUpKQooZGVjbGFyZS1mdW5jdGlvbiBsbS1hdXRob3JzICJsaXNwLW1u
dCIgKCZvcHRpb25hbCBmaWxlKSkKCihkZWZ1biBwYWNrYWdlLWJ1ZmZlci1pbmZvICgpCiAgIlJl
dHVybiBhIGBwYWNrYWdlLWRlc2MnIGRlc2NyaWJpbmcgdGhlIHBhY2thZ2UgaW4gdGhlIGN1cnJl
bnQgYnVmZmVyLgoKSWYgdGhlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgY29uZm9ybWluZyBw
YWNrYWdlLCBzaWduYWwgYW4KZXJyb3IuICBJZiB0aGVyZSBpcyBhIHBhY2thZ2UsIG5hcnJvdyB0
aGUgYnVmZmVyIHRvIHRoZSBmaWxlJ3MKYm91bmRhcmllcy4iCiAgKGdvdG8tY2hhciAocG9pbnQt
bWluKSkKICAodW5sZXNzIChyZS1zZWFyY2gtZm9yd2FyZCAiXjs7OyBcXChbXiBdKlxcKVxcLmVs
IC0tLVsgXHRdKlxcKC4qP1xcKVsgXHRdKlxcKC1cXCotLiotXFwqLVsgXHRdKlxcKT8kIiBuaWwg
dCkKICAgIChlcnJvciAiUGFja2FnZSBsYWNrcyBhIGZpbGUgaGVhZGVyIikpCiAgKGxldCAoKGZp
bGUtbmFtZSAobWF0Y2gtc3RyaW5nLW5vLXByb3BlcnRpZXMgMSkpCiAgICAgICAgKGRlc2MgICAg
ICAobWF0Y2gtc3RyaW5nLW5vLXByb3BlcnRpZXMgMikpCiAgICAgICAgKHN0YXJ0ICAgICAobGlu
ZS1iZWdpbm5pbmctcG9zaXRpb24pKSkKICAgIDs7IFRoaXMgd2FybmluZyB3YXMgYWRkZWQgaW4g
RW1hY3MgMjcuMSwgYW5kIHNob3VsZCBiZSByZW1vdmVkIGF0CiAgICA7OyB0aGUgZWFybGllc3Qg
aW4gdmVyc2lvbiAzMS4xLiAgVGhlIGlkZWEgaXMgdG8gcGhhc2Ugb3V0IHRoZQogICAgOzsgcmVx
dWlyZW1lbnQgZm9yIGEgImZvb3RlciBsaW5lIiB3aXRob3V0IHVuZHVseSBpbXBhY3RpbmcgdXNl
cnMKICAgIDs7IG9uIGVhcmxpZXIgRW1hY3MgdmVyc2lvbnMuICBTZWUgQnVnIzI2NDkwIGZvciBt
b3JlIGRldGFpbHMuCiAgICAodW5sZXNzIChzZWFyY2gtZm9yd2FyZCAoY29uY2F0ICI7OzsgIiBm
aWxlLW5hbWUgIi5lbCBlbmRzIGhlcmUiKSkKICAgICAgKGx3YXJuICcocGFja2FnZSBwYWNrYWdl
LWZvcm1hdCkgOndhcm5pbmcKICAgICAgICAgICAgICJQYWNrYWdlIGxhY2tzIGEgdGVybWluYXRp
bmcgY29tbWVudCIpKQogICAgOzsgVHJ5IHRvIGluY2x1ZGUgYSB0cmFpbGluZyBuZXdsaW5lLgog
ICAgKGZvcndhcmQtbGluZSkKICAgIChuYXJyb3ctdG8tcmVnaW9uIHN0YXJ0IChwb2ludCkpCiAg
ICAocmVxdWlyZSAnbGlzcC1tbnQpCiAgICA7OyBVc2Ugc29tZSBoZWFkZXJzIHdlJ3ZlIGludmVu
dGVkIHRvIGRyaXZlIHRoZSBwcm9jZXNzLgogICAgKGxldCogKDs7IFByZWZlciBQYWNrYWdlLVZl
cnNpb247IGlmIGRlZmluZWQsIHRoZSBwYWNrYWdlIGF1dGhvcgogICAgICAgICAgIDs7IHByb2Jh
Ymx5IHdhbnRzIHVzIHRvIHVzZSBpdC4gIE90aGVyd2lzZSB0cnkgVmVyc2lvbi4KICAgICAgICAg
ICAodmVyc2lvbi1pbmZvCiAgICAgICAgICAgIChvciAobG0taGVhZGVyICJwYWNrYWdlLXZlcnNp
b24iKSAobG0taGVhZGVyICJ2ZXJzaW9uIikpKQogICAgICAgICAgIChwa2ctdmVyc2lvbiAocGFj
a2FnZS1zdHJpcC1yY3MtaWQgdmVyc2lvbi1pbmZvKSkKICAgICAgICAgICAoa2V5d29yZHMgKGxt
LWtleXdvcmRzLWxpc3QpKQogICAgICAgICAgICh3ZWJzaXRlIChsbS1ob21lcGFnZSkpKQogICAg
ICAodW5sZXNzIHBrZy12ZXJzaW9uCiAgICAgICAgIChpZiB2ZXJzaW9uLWluZm8KICAgICAgICAg
ICAgIChlcnJvciAiVW5yZWNvZ25pemVkIHBhY2thZ2UgdmVyc2lvbjogJXMiIHZlcnNpb24taW5m
bykKICAgICAgICAgICAoZXJyb3IgIlBhY2thZ2UgbGFja3MgYSBcIlZlcnNpb25cIiBvciBcIlBh
Y2thZ2UtVmVyc2lvblwiIGhlYWRlciIpKSkKICAgICAgKHBhY2thZ2UtZGVzYy1mcm9tLWRlZmlu
ZQogICAgICAgZmlsZS1uYW1lIHBrZy12ZXJzaW9uIGRlc2MKICAgICAgIChhbmQtbGV0KiAoKHJl
cXVpcmUtbGluZXMgKGxtLWhlYWRlci1tdWx0aWxpbmUgInBhY2thZ2UtcmVxdWlyZXMiKSkpCiAg
ICAgICAgIChwYWNrYWdlLS1wcmVwYXJlLWRlcGVuZGVuY2llcwogICAgICAgICAgKHBhY2thZ2Ut
cmVhZC1mcm9tLXN0cmluZyAobWFwY29uY2F0ICMnaWRlbnRpdHkgcmVxdWlyZS1saW5lcyAiICIp
KSkpCiAgICAgICA6a2luZCAnc2luZ2xlCiAgICAgICA6dXJsIHdlYnNpdGUKICAgICAgIDprZXl3
b3JkcyBrZXl3b3JkcwogICAgICAgOm1haW50YWluZXIgKGxtLW1haW50YWluZXIpCiAgICAgICA7
OyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIGEgc2luZ2xlIHN0cmluZyBpZiB0aGVy
ZSdzIG9ubHkKICAgICAgIDs7IG9uZSBtYWludGFpbmVyICh0aGUgbW9zdCBjb21tb24gY2FzZSku
CiAgICAgICAoaWYgKGZib3VuZHAgJ2xtLW1haW50YWluZXJzKQogICAgICAgICAgIChsZXQgKCht
YWludHMgKGxtLW1haW50YWluZXJzKSkpCiAgICAgICAgICAgICAoaWYgKGNkciBtYWludHMpIG1h
aW50cyAoY2FyIG1haW50cykpKQogICAgICAgICAobG0tbWFpbnRhaW5lcikpCiAgICAgICA6YXV0
aG9ycyAobG0tYXV0aG9ycykpKSkpCgooZGVmdW4gcGFja2FnZS0tcmVhZC1wa2ctZGVzYyAoa2lu
ZCkKICAiUmVhZCBhIGBkZWZpbmUtcGFja2FnZScgZm9ybSBpbiBjdXJyZW50IGJ1ZmZlci4KUmV0
dXJuIHRoZSBwa2ctZGVzYywgd2l0aCBkZXNjLWtpbmQgc2V0IHRvIEtJTkQuIgogIChnb3RvLWNo
YXIgKHBvaW50LW1pbikpCiAgKHVud2luZC1wcm90ZWN0CiAgICAgIChsZXQqICgocGtnLWRlZi1w
YXJzZWQgKHJlYWQgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICAgICAocGtnLWRlc2MKICAg
ICAgICAgICAgICAod2hlbiAoZXEgKGNhciBwa2ctZGVmLXBhcnNlZCkgJ2RlZmluZS1wYWNrYWdl
KQogICAgICAgICAgICAgICAgKGFwcGx5ICMncGFja2FnZS1kZXNjLWZyb20tZGVmaW5lCiAgICAg
ICAgICAgICAgICAgIChhcHBlbmQgKGNkciBwa2ctZGVmLXBhcnNlZCkpKSkpKQogICAgICAgICh3
aGVuIHBrZy1kZXNjCiAgICAgICAgICAoc2V0ZiAocGFja2FnZS1kZXNjLWtpbmQgcGtnLWRlc2Mp
IGtpbmQpCiAgICAgICAgICBwa2ctZGVzYykpKSkKCihkZWNsYXJlLWZ1bmN0aW9uIHRhci1nZXQt
ZmlsZS1kZXNjcmlwdG9yICJ0YXItbW9kZSIgKGZpbGUpKQooZGVjbGFyZS1mdW5jdGlvbiB0YXIt
LWV4dHJhY3QgInRhci1tb2RlIiAoZGVzY3JpcHRvcikpCgooZGVmdW4gcGFja2FnZS10YXItZmls
ZS1pbmZvICgpCiAgIkZpbmQgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgYSB0YXIgZmlsZS4KVGhl
IHJldHVybiByZXN1bHQgaXMgYSBgcGFja2FnZS1kZXNjJy4iCiAgKGNsLWFzc2VydCAoZGVyaXZl
ZC1tb2RlLXAgJ3Rhci1tb2RlKSkKICAobGV0KiAoKGRpci1uYW1lIChuYW1lZC1sZXQgbG9vcAog
ICAgICAgICAgICAgICAgICAgICAgICgoZmlsZW5hbWUgKHRhci1oZWFkZXItbmFtZSAoY2FyIHRh
ci1wYXJzZS1pbmZvKSkpKQogICAgICAgICAgICAgICAgICAgICAobGV0ICgoZGlybmFtZSAoZmls
ZS1uYW1lLWRpcmVjdG9yeSBmaWxlbmFtZSkpKQogICAgICAgICAgICAgICAgICAgICAgIDs7IFRo
ZSBmaXJzdCBmaWxlIGNhbiBiZSBpbiBhIHN1YmRpcjogbG9vayBmb3IgdGhlIHRvcC4KICAgICAg
ICAgICAgICAgICAgICAgICAoaWYgZGlybmFtZSAobG9vcCAoZGlyZWN0b3J5LWZpbGUtbmFtZSBk
aXJuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5
IGZpbGVuYW1lKSkpKSkKICAgICAgICAgKGRlc2MtZmlsZSAocGFja2FnZS0tZGVzY3JpcHRpb24t
ZmlsZSBkaXItbmFtZSkpCiAgICAgICAgICh0YXItZGVzYyAodGFyLWdldC1maWxlLWRlc2NyaXB0
b3IgKGNvbmNhdCBkaXItbmFtZSBkZXNjLWZpbGUpKSkpCiAgICAodW5sZXNzIHRhci1kZXNjCiAg
ICAgIChlcnJvciAiTm8gcGFja2FnZSBkZXNjcmlwdG9yIGZpbGUgZm91bmQiKSkKICAgICh3aXRo
LWN1cnJlbnQtYnVmZmVyICh0YXItLWV4dHJhY3QgdGFyLWRlc2MpCiAgICAgICh1bndpbmQtcHJv
dGVjdAogICAgICAgICAgKG9yIChwYWNrYWdlLS1yZWFkLXBrZy1kZXNjICd0YXIpCiAgICAgICAg
ICAgICAgKGVycm9yICJDYW4ndCBmaW5kIGRlZmluZS1wYWNrYWdlIGluICVzIgogICAgICAgICAg
ICAgICAgKHRhci1oZWFkZXItbmFtZSB0YXItZGVzYykpKQogICAgICAgIChraWxsLWJ1ZmZlciAo
Y3VycmVudC1idWZmZXIpKSkpKSkKCihkZWZ1biBwYWNrYWdlLWRpci1pbmZvICgpCiAgIkZpbmQg
cGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgYSBkaXJlY3RvcnkuClRoZSByZXR1cm4gcmVzdWx0IGlz
IGEgYHBhY2thZ2UtZGVzYycuIgogIChjbC1hc3NlcnQgKGRlcml2ZWQtbW9kZS1wICdkaXJlZC1t
b2RlKSkKICAobGV0KiAoKGRlc2MtZmlsZSAocGFja2FnZS0tZGVzY3JpcHRpb24tZmlsZSBkZWZh
dWx0LWRpcmVjdG9yeSkpKQogICAgKGlmIChmaWxlLXJlYWRhYmxlLXAgZGVzYy1maWxlKQogICAg
ICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgZGVz
Yy1maWxlKQogICAgICAgICAgKHBhY2thZ2UtLXJlYWQtcGtnLWRlc2MgJ2RpcikpCiAgICAgIChs
ZXQgKChmaWxlcyAoZGlyZWN0b3J5LWZpbGVzIGRlZmF1bHQtZGlyZWN0b3J5IHQgIlxcLmVsXFwn
IiB0KSkKICAgICAgICAgICAgaW5mbykKICAgICAgICAod2hpbGUgZmlsZXMKICAgICAgICAgICh3
aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAgIChsZXQgKChmaWxlIChwb3AgZmlsZXMpKSkKICAg
ICAgICAgICAgICA7OyBUaGUgZmlsZSBtYXkgYmUgYSBsaW5rIHRvIGEgbm9uZXhpc3RlbnQgZmls
ZTsgZS5nLiwgYQogICAgICAgICAgICAgIDs7IGxvY2sgZmlsZS4KICAgICAgICAgICAgICAod2hl
biAoZmlsZS1leGlzdHMtcCBmaWxlKQogICAgICAgICAgICAgICAgKGluc2VydC1maWxlLWNvbnRl
bnRzIGZpbGUpCiAgICAgICAgICAgICAgICA7OyBXaGVuIHdlIGZpbmQgdGhlIGZpbGUgd2l0aCB0
aGUgZGF0YSwKICAgICAgICAgICAgICAgICh3aGVuIChzZXRxIGluZm8gKGlnbm9yZS1lcnJvcnMg
KHBhY2thZ2UtYnVmZmVyLWluZm8pKSkKICAgICAgICAgICAgICAgICAgOzsgc3RvcCBsb29waW5n
LAogICAgICAgICAgICAgICAgICAoc2V0cSBmaWxlcyBuaWwpCiAgICAgICAgICAgICAgICAgIDs7
IHNldCB0aGUgJ2RpciBraW5kLAogICAgICAgICAgICAgICAgICAoc2V0ZiAocGFja2FnZS1kZXNj
LWtpbmQgaW5mbykgJ2RpcikpKSkpKQogICAgICAgICh1bmxlc3MgaW5mbwogICAgICAgICAgKGVy
cm9yICJObyAuZWwgZmlsZXMgd2l0aCBwYWNrYWdlIGhlYWRlcnMgaW4gYCVzJyIgZGVmYXVsdC1k
aXJlY3RvcnkpKQogICAgICAgIDs7IGFuZCByZXR1cm4gdGhlIGluZm8uCiAgICAgICAgaW5mbykp
KSkKCgwKOzs7IENvbW11bmljYXRpbmcgd2l0aCBBcmNoaXZlcwo7OyBTZXQgb2YgbG93LWxldmVs
IGZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGFyY2hpdmVzIGFuZAo7OyBzaWduYXR1
cmUgY2hlY2tpbmcuCgooZGVmdW4gcGFja2FnZS0td3JpdGUtZmlsZS1uby1jb2RpbmcgKGZpbGUt
bmFtZSkKICAiV3JpdGUgZmlsZSBGSUxFLU5BTUUgd2l0aG91dCBlbmNvZGluZyB1c2luZyBjb2Rp
bmcgc3lzdGVtLiIKICAobGV0ICgoYnVmZmVyLWZpbGUtY29kaW5nLXN5c3RlbSAnbm8tY29udmVy
c2lvbikpCiAgICAod3JpdGUtcmVnaW9uIChwb2ludC1taW4pIChwb2ludC1tYXgpIGZpbGUtbmFt
ZSBuaWwgJ3NpbGVudCkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gdXJsLWh0dHAtZmlsZS1leGlzdHMt
cCAidXJsLWh0dHAiICh1cmwpKQoKKGRlZnVuIHBhY2thZ2UtLWFyY2hpdmUtZmlsZS1leGlzdHMt
cCAobG9jYXRpb24gZmlsZSkKICAiUmV0dXJuIHQgaWYgRklMRSBleGlzdHMgaW4gcmVtb3RlIExP
Q0FUSU9OLiIKICAobGV0ICgoaHR0cCAoc3RyaW5nLW1hdGNoICJcXGBodHRwcz86IiBsb2NhdGlv
bikpKQogICAgKGlmIGh0dHAKICAgICAgICAocHJvZ24KICAgICAgICAgIChyZXF1aXJlICd1cmwt
aHR0cCkKICAgICAgICAgICh1cmwtaHR0cC1maWxlLWV4aXN0cy1wIChjb25jYXQgbG9jYXRpb24g
ZmlsZSkpKQogICAgICAoZmlsZS1leGlzdHMtcCAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlIGxvY2F0
aW9uKSkpKSkKCihkZWNsYXJlLWZ1bmN0aW9uIGVwZy1tYWtlLWNvbnRleHQgImVwZyIKICAgICAg
ICAgICAgICAgICAgKCZvcHRpb25hbCBwcm90b2NvbCBhcm1vciB0ZXh0bW9kZSBpbmNsdWRlLWNl
cnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyLWFsZ29yaXRobQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdC1hbGdvcml0aG0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb21wcmVzcy1hbGdvcml0aG0pKQooZGVjbGFyZS1mdW5jdGlvbiBlcGctdmVy
aWZ5LXN0cmluZyAiZXBnIiAoIGNvbnRleHQgc2lnbmF0dXJlCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbmFsIHNpZ25lZC10ZXh0KSkKKGRlY2xhcmUt
ZnVuY3Rpb24gZXBnLWNvbnRleHQtcmVzdWx0LWZvciAiZXBnIiAoY29udGV4dCBuYW1lKSkKKGRl
Y2xhcmUtZnVuY3Rpb24gZXBnLXNpZ25hdHVyZS1zdGF0dXMgImVwZyIgKHNpZ25hdHVyZSkgdCkK
KGRlY2xhcmUtZnVuY3Rpb24gZXBnLXNpZ25hdHVyZS10by1zdHJpbmcgImVwZyIgKHNpZ25hdHVy
ZSkpCgooZGVmdW4gcGFja2FnZS0tZGlzcGxheS12ZXJpZnktZXJyb3IgKGNvbnRleHQgc2lnLWZp
bGUpCiAgIlNob3cgZXJyb3IgZGV0YWlscyB3aXRoIENPTlRFWFQgZm9yIGZhaWxlZCB2ZXJpZmlj
YXRpb24gb2YgU0lHLUZJTEUuClRoZSBkZXRhaWxzIGFyZSBzaG93biBpbiBhIG5ldyBidWZmZXIg
Y2FsbGVkIFwiKkVycm9yXCIuIgogICh1bmxlc3MgKGVxdWFsIChlcGctY29udGV4dC1lcnJvci1v
dXRwdXQgY29udGV4dCkgIiIpCiAgICAod2l0aC1vdXRwdXQtdG8tdGVtcC1idWZmZXIgIipFcnJv
cioiCiAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAogICAgICAgIChp
ZiAoZXBnLWNvbnRleHQtcmVzdWx0LWZvciBjb250ZXh0ICd2ZXJpZnkpCiAgICAgICAgICAgIChp
bnNlcnQgKGZvcm1hdCAiRmFpbGVkIHRvIHZlcmlmeSBzaWduYXR1cmUgJXM6XG4iIHNpZy1maWxl
KQogICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgIydlcGctc2lnbmF0dXJlLXRvLXN0cmlu
ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVwZy1jb250ZXh0LXJlc3VsdC1mb3Ig
Y29udGV4dCAndmVyaWZ5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikpCiAg
ICAgICAgICAoaW5zZXJ0IChmb3JtYXQgIkVycm9yIHdoaWxlIHZlcmlmeWluZyBzaWduYXR1cmUg
JXM6XG4iIHNpZy1maWxlKSkpCiAgICAgICAgKGluc2VydCAiXG5Db21tYW5kIG91dHB1dDpcbiIg
KGVwZy1jb250ZXh0LWVycm9yLW91dHB1dCBjb250ZXh0KSkpKSkpCgooZGVmbWFjcm8gcGFja2Fn
ZS0td2l0aC13b3JrLWJ1ZmZlciAobG9jYXRpb24gZmlsZSAmcmVzdCBib2R5KQogICJSdW4gQk9E
WSBpbiBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBGSUxFIGF0IExPQ0FUSU9O
LgpMT0NBVElPTiBpcyB0aGUgYmFzZSBsb2NhdGlvbiBvZiBhIHBhY2thZ2UgYXJjaGl2ZSwgYW5k
IHNob3VsZCBiZQpvbmUgb2YgdGhlIFVSTHMgKG9yIGZpbGUgbmFtZXMpIHNwZWNpZmllZCBpbiBg
cGFja2FnZS1hcmNoaXZlcycuCkZJTEUgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIHJlbGF0aXZlIHRv
IHRoYXQgYmFzZSBsb2NhdGlvbi4KClRoaXMgbWFjcm8gcmV0cmlldmVzIEZJTEUgZnJvbSBMT0NB
VElPTiBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciwKYW5kIGV2YWx1YXRlcyBCT0RZIHdoaWxlIHRo
YXQgYnVmZmVyIGlzIGN1cnJlbnQuICBUaGlzIHdvcmsKYnVmZmVyIGlzIGtpbGxlZCBhZnRlcndh
cmRzLiAgUmV0dXJuIHRoZSBsYXN0IHZhbHVlIGluIEJPRFkuIgogIChkZWNsYXJlIChpbmRlbnQg
MikgKGRlYnVnIHQpCiAgICAgICAgICAgKG9ic29sZXRlIHBhY2thZ2UtLXdpdGgtcmVzcG9uc2Ut
YnVmZmVyICIyNS4xIikpCiAgYCh3aXRoLXRlbXAtYnVmZmVyCiAgICAgKGlmIChzdHJpbmctbWF0
Y2gtcCAiXFxgaHR0cHM/OiIgLGxvY2F0aW9uKQogICAgICAgICAodXJsLWluc2VydC1maWxlLWNv
bnRlbnRzIChjb25jYXQgLGxvY2F0aW9uICxmaWxlKSkKICAgICAgICh1bmxlc3MgKGZpbGUtbmFt
ZS1hYnNvbHV0ZS1wICxsb2NhdGlvbikKICAgICAgICAgKGVycm9yICJBcmNoaXZlIGxvY2F0aW9u
ICVzIGlzIG5vdCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiCiAgICAgICAgICAgLGxvY2F0aW9uKSkK
ICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAoZXhwYW5kLWZpbGUtbmFtZSAsZmlsZSAsbG9j
YXRpb24pKSkKICAgICAsQGJvZHkpKQoKKGNsLWRlZm1hY3JvIHBhY2thZ2UtLXdpdGgtcmVzcG9u
c2UtYnVmZmVyICh1cmwgJnJlc3QgYm9keSAma2V5IGFzeW5jIGZpbGUgZXJyb3ItZm9ybSBub2Vy
cm9yICZhbGxvdy1vdGhlci1rZXlzKQogICJBY2Nlc3MgVVJMIGFuZCBydW4gQk9EWSBpbiBhIGJ1
ZmZlciBjb250YWluaW5nIHRoZSByZXNwb25zZS4KUG9pbnQgaXMgYWZ0ZXIgdGhlIGhlYWRlcnMg
d2hlbiBCT0RZIHJ1bnMuCkZJTEUsIGlmIHByb3ZpZGVkLCBpcyBhZGRlZCB0byBVUkwuClVSTCBj
YW4gYmUgYSBsb2NhbCBmaWxlIG5hbWUsIHdoaWNoIG11c3QgYmUgYWJzb2x1dGUuCkFTWU5DLCBp
ZiBub24tbmlsLCBydW5zIHRoZSByZXF1ZXN0IGFzeW5jaHJvbm91c2x5LgpFUlJPUi1GT1JNIGlz
IHJ1biBvbmx5IGlmIGEgY29ubmVjdGlvbiBlcnJvciBvY2N1cnMuICBJZiBOT0VSUk9SCmlzIG5v
bi1uaWwsIGRvbid0IHByb3BhZ2F0ZSBjb25uZWN0aW9uIGVycm9ycyAoZG9lcyBub3QgYXBwbHkg
dG8KZXJyb3JzIHNpZ25hbGVkIGJ5IEVSUk9SLUZPUk0gb3IgYnkgQk9EWSkuCgpcKGZuIFVSTCAm
a2V5IEFTWU5DIEZJTEUgRVJST1ItRk9STSBOT0VSUk9SICZyZXN0IEJPRFkpIgogIChkZWNsYXJl
IChpbmRlbnQgZGVmdW4pIChkZWJ1ZyAoc2V4cCBib2R5KSkpCiAgKHdoaWxlIChrZXl3b3JkcCAo
Y2FyIGJvZHkpKQogICAgKHNldHEgYm9keSAoY2RyIChjZHIgYm9keSkpKSkKICBgKHBhY2thZ2Ut
LXdpdGgtcmVzcG9uc2UtYnVmZmVyLTEgLHVybCAobGFtYmRhICgpICxAYm9keSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZpbGUgLGZpbGUKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOmFzeW5jICxhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6ZXJyb3ItZnVuY3Rpb24gKGxhbWJkYSAoKSAsZXJyb3ItZm9ybSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm5vZXJyb3IgLG5vZXJyb3IpKQoKKGRlZm1h
Y3JvIHBhY2thZ2UtLXVubGVzcy1lcnJvciAoYm9keSAmcmVzdCBiZWZvcmUtYm9keSkKICAoZGVj
bGFyZSAoZGVidWcgdCkgKGluZGVudCAxKSkKICAobGV0ICgoZXJyIChtYWtlLXN5bWJvbCAiZXJy
IikpKQogICAgYCh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAoc2V0LWJ1ZmZlci1tdWx0aWJ5dGUg
bmlsKQogICAgICAgKHdoZW4gKGNvbmRpdGlvbi1jYXNlICxlcnIKICAgICAgICAgICAgICAgICAo
cHJvZ24gLEBiZWZvcmUtYm9keSB0KQogICAgICAgICAgICAgICAoZXJyb3IgKGZ1bmNhbGwgZXJy
b3ItZnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAodW5sZXNzIG5vZXJyb3IKICAgICAg
ICAgICAgICAgICAgICAgICAgKHNpZ25hbCAoY2FyICxlcnIpIChjZHIgLGVycikpKSkpCiAgICAg
ICAgIChmdW5jYWxsICxib2R5KSkpKSkKCihjbC1kZWZ1biBwYWNrYWdlLS13aXRoLXJlc3BvbnNl
LWJ1ZmZlci0xICh1cmwgYm9keSAma2V5IGFzeW5jIGZpbGUgZXJyb3ItZnVuY3Rpb24gbm9lcnJv
ciAmYWxsb3ctb3RoZXIta2V5cykKICAoaWYgKHN0cmluZy1tYXRjaC1wICJcXGBodHRwcz86IiB1
cmwpCiAgICAgICAgKGxldCAoKHVybCAodXJsLWV4cGFuZC1maWxlLW5hbWUgZmlsZSB1cmwpKSkK
ICAgICAgICAgIChpZiBhc3luYwogICAgICAgICAgICAgIChwYWNrYWdlLS11bmxlc3MtZXJyb3Ig
IydpZ25vcmUKICAgICAgICAgICAgICAgICh1cmwtcmV0cmlldmUKICAgICAgICAgICAgICAgICB1
cmwKICAgICAgICAgICAgICAgICAobGFtYmRhIChzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAo
bGV0ICgoYiAoY3VycmVudC1idWZmZXIpKSkKICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmUg
J3VybC1oYW5kbGVycykKICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLXVubGVzcy1lcnJv
ciBib2R5CiAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGVyIChwbGlzdC1nZXQg
c3RhdHVzIDplcnJvcikpKQogICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yICJFcnJvciBy
ZXRyaWV2aW5nOiAlcyAlUyIgdXJsIGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAod2l0aC1j
dXJyZW50LWJ1ZmZlciBiCiAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2lu
dC1taW4pKQogICAgICAgICAgICAgICAgICAgICAgICAgKHVubGVzcyAoc2VhcmNoLWZvcndhcmQt
cmVnZXhwICJeXHI/XG5ccj8iIG5pbCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJy
b3IgIkVycm9yIHJldHJpZXZpbmc6ICVzICVTIgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdXJsICJpbmNvbXByZWhlbnNpYmxlIGJ1ZmZlciIpKSkKICAgICAgICAgICAgICAgICAg
ICAgICAodXJsLWluc2VydCBiKQogICAgICAgICAgICAgICAgICAgICAgIChraWxsLWJ1ZmZlciBi
KQogICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpKSkpCiAgICAg
ICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAgJ3NpbGVudCkpCiAgICAgICAgICAgIChw
YWNrYWdlLS11bmxlc3MtZXJyb3IgYm9keQogICAgICAgICAgICAgIDs7IENvcHkmcGFzdGVkIGZy
b20gdXJsLWluc2VydC1maWxlLWNvbnRlbnRzLAogICAgICAgICAgICAgIDs7IGV4Y2VwdCBpdCBj
YWxscyBgdXJsLWluc2VydCcgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb250ZW50cwogICAgICAgICAg
ICAgIDs7IGxpdGVyYWxseSAoYnV0IHRoZXJlJ3Mgbm8gdXJsLWluc2VydC1maWxlLWNvbnRlbnRz
LWxpdGVyYWxseSkuCiAgICAgICAgICAgICAgKGxldCAoKGJ1ZmZlciAodXJsLXJldHJpZXZlLXN5
bmNocm9ub3VzbHkgdXJsKSkpCiAgICAgICAgICAgICAgICAodW5sZXNzIGJ1ZmZlciAoc2lnbmFs
ICdmaWxlLWVycm9yIChsaXN0IHVybCAiTm8gRGF0YSIpKSkKICAgICAgICAgICAgICAgICh3aGVu
IChmYm91bmRwICd1cmwtaHR0cC0taW5zZXJ0LWZpbGUtaGVscGVyKQogICAgICAgICAgICAgICAg
ICA7OyBYWFg6IFRoaXMgaXMgSFRUUC9TIHNwZWNpZmljIGFuZCBzaG91bGQgYmUgbW92ZWQKICAg
ICAgICAgICAgICAgICAgOzsgdG8gdXJsLWh0dHAgaW5zdGVhZC4gIFNlZSBidWcjMTc1NDkuCiAg
ICAgICAgICAgICAgICAgICh1cmwtaHR0cC0taW5zZXJ0LWZpbGUtaGVscGVyIGJ1ZmZlciB1cmwp
KQogICAgICAgICAgICAgICAgKHVybC1pbnNlcnQgYnVmZmVyKQogICAgICAgICAgICAgICAgKGtp
bGwtYnVmZmVyIGJ1ZmZlcikKICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikp
KSkpKQogICAgICAocGFja2FnZS0tdW5sZXNzLWVycm9yIGJvZHkKICAgICAgICAodW5sZXNzIChm
aWxlLW5hbWUtYWJzb2x1dGUtcCB1cmwpCiAgICAgICAgICAoZXJyb3IgIkxvY2F0aW9uICVzIGlz
IG5vdCBhIHVybCBub3IgYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiB1cmwpKQogICAgICAgIChpbnNl
cnQtZmlsZS1jb250ZW50cy1saXRlcmFsbHkgKGV4cGFuZC1maWxlLW5hbWUgZmlsZSB1cmwpKSkp
KQoKKGRlZmluZS1lcnJvciAnYmFkLXNpZ25hdHVyZSAiRmFpbGVkIHRvIHZlcmlmeSBzaWduYXR1
cmUiKQoKKGRlZnVuIHBhY2thZ2UtLWNoZWNrLXNpZ25hdHVyZS1jb250ZW50IChjb250ZW50IHN0
cmluZyAmb3B0aW9uYWwgc2lnLWZpbGUpCiAgIkNoZWNrIHNpZ25hdHVyZSBDT05URU5UIGFnYWlu
c3QgU1RSSU5HLgpTSUctRklMRSBpcyB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIGZpbGUsIHVz
ZWQgd2hlbiBzaWduYWxpbmcKZXJyb3JzLiIKICAobGV0ICgoY29udGV4dCAoZXBnLW1ha2UtY29u
dGV4dCAnT3BlblBHUCkpKQogICAgKHdoZW4gcGFja2FnZS1nbnVwZ2hvbWUtZGlyCiAgICAgIChz
ZXRmIChlcGctY29udGV4dC1ob21lLWRpcmVjdG9yeSBjb250ZXh0KSBwYWNrYWdlLWdudXBnaG9t
ZS1kaXIpKQogICAgKGNvbmRpdGlvbi1jYXNlIGVycm9yCiAgICAgICAgKGVwZy12ZXJpZnktc3Ry
aW5nIGNvbnRleHQgY29udGVudCBzdHJpbmcpCiAgICAgIChlcnJvciAocGFja2FnZS0tZGlzcGxh
eS12ZXJpZnktZXJyb3IgY29udGV4dCBzaWctZmlsZSkKICAgICAgICAgICAgIChzaWduYWwgJ2Jh
ZC1zaWduYXR1cmUgZXJyb3IpKSkKICAgIChsZXQgKGdvb2Qtc2lnbmF0dXJlcyBoYWQtZmF0YWwt
ZXJyb3IpCiAgICAgIDs7IFRoZSAuc2lnIGZpbGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgc2lnbmF0
dXJlcy4gIFN1Y2Nlc3MgaWYgb25lCiAgICAgIDs7IG9mIHRoZSBzaWduYXR1cmVzIGlzIGdvb2Qu
CiAgICAgIChkb2xpc3QgKHNpZyAoZXBnLWNvbnRleHQtcmVzdWx0LWZvciBjb250ZXh0ICd2ZXJp
ZnkpKQogICAgICAgIChpZiAoZXEgKGVwZy1zaWduYXR1cmUtc3RhdHVzIHNpZykgJ2dvb2QpCiAg
ICAgICAgICAgIChwdXNoIHNpZyBnb29kLXNpZ25hdHVyZXMpCiAgICAgICAgICA7OyBJZiBgcGFj
a2FnZS1jaGVjay1zaWduYXR1cmUnIGlzIGFsbG93LXVuc2lnbmVkLCBkb24ndAogICAgICAgICAg
Ozsgc2lnbmFsIGVycm9yIHdoZW4gd2UgY2FuJ3QgdmVyaWZ5IHNpZ25hdHVyZSBiZWNhdXNlIG9m
CiAgICAgICAgICA7OyBtaXNzaW5nIHB1YmxpYyBrZXkuICBPdGhlciBlcnJvcnMgYXJlIHN0aWxs
IHRyZWF0ZWQgYXMKICAgICAgICAgIDs7IGZhdGFsIChidWcjMTc2MjUpLgogICAgICAgICAgKHVu
bGVzcyAoYW5kIChlcSAocGFja2FnZS1jaGVjay1zaWduYXR1cmUpICdhbGxvdy11bnNpZ25lZCkK
ICAgICAgICAgICAgICAgICAgICAgICAoZXEgKGVwZy1zaWduYXR1cmUtc3RhdHVzIHNpZykgJ25v
LXB1YmtleSkpCiAgICAgICAgICAgIChzZXRxIGhhZC1mYXRhbC1lcnJvciB0KSkpKQogICAgICAo
d2hlbiAob3IgKG51bGwgZ29vZC1zaWduYXR1cmVzKQogICAgICAgICAgICAgICAgKGFuZCAoZXEg
KHBhY2thZ2UtY2hlY2stc2lnbmF0dXJlKSAnYWxsKQogICAgICAgICAgICAgICAgICAgICBoYWQt
ZmF0YWwtZXJyb3IpKQogICAgICAgIChwYWNrYWdlLS1kaXNwbGF5LXZlcmlmeS1lcnJvciBjb250
ZXh0IHNpZy1maWxlKQogICAgICAgIChzaWduYWwgJ2JhZC1zaWduYXR1cmUgKGxpc3Qgc2lnLWZp
bGUpKSkKICAgICAgZ29vZC1zaWduYXR1cmVzKSkpCgooZGVmdW4gcGFja2FnZS0tY2hlY2stc2ln
bmF0dXJlIChsb2NhdGlvbiBmaWxlICZvcHRpb25hbCBzdHJpbmcgYXN5bmMgY2FsbGJhY2sgdW53
aW5kKQogICJDaGVjayBzaWduYXR1cmUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgpEb3dubG9hZCB0
aGUgc2lnbmF0dXJlIGZpbGUgZnJvbSBMT0NBVElPTiBieSBhcHBlbmRpbmcgXCIuc2lnXCIKdG8g
RklMRS4KR251UEcga2V5cmluZyBsb2NhdGlvbiBkZXBlbmRzIG9uIGBwYWNrYWdlLWdudXBnaG9t
ZS1kaXInLgpTVFJJTkcgaXMgdGhlIHN0cmluZyB0byB2ZXJpZnksIGl0IGRlZmF1bHRzIHRvIGBi
dWZmZXItc3RyaW5nJy4KSWYgQVNZTkMgaXMgbm9uLW5pbCwgdGhlIGRvd25sb2FkIG9mIHRoZSBz
aWduYXR1cmUgZmlsZSBpcwpkb25lIGFzeW5jaHJvbm91c2x5LgoKSWYgdGhlIHNpZ25hdHVyZSBk
b2VzIG5vdCB2ZXJpZnksIHNpZ25hbCBhbiBlcnJvci4KSWYgdGhlIHNpZ25hdHVyZSBpcyB2ZXJp
ZmllZCBhbmQgQ0FMTEJBQ0sgd2FzIHByb3ZpZGVkLCBgZnVuY2FsbCcKQ0FMTEJBQ0sgd2l0aCB0
aGUgbGlzdCBvZiBnb29kIHNpZ25hdHVyZXMgYXMgYXJndW1lbnQgKHRoZSBsaXN0CmNhbiBiZSBl
bXB0eSkuCklmIG5vIHNpZ25hdHVyZXMgZmlsZSBpcyBmb3VuZCwgYW5kIGBwYWNrYWdlLWNoZWNr
LXNpZ25hdHVyZScgaXMKYGFsbG93LXVuc2lnbmVkJywgY2FsbCBDQUxMQkFDSyB3aXRoIGEgbmls
IGFyZ3VtZW50LgpPdGhlcndpc2UsIGFuIGVycm9yIGlzIHNpZ25hbGVkLgoKVU5XSU5ELCBpZiBw
cm92aWRlZCwgaXMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgZXZlcnl0aGluZwplbHNl
LCBldmVuIGlmIGFuIGVycm9yIGlzIHNpZ25hbGVkLiIKICAobGV0ICgoc2lnLWZpbGUgKGNvbmNh
dCBmaWxlICIuc2lnIikpCiAgICAgICAgKHN0cmluZyAob3Igc3RyaW5nIChidWZmZXItc3RyaW5n
KSkpKQogICAgKHBhY2thZ2UtLXdpdGgtcmVzcG9uc2UtYnVmZmVyIGxvY2F0aW9uIDpmaWxlIHNp
Zy1maWxlCiAgICAgIDphc3luYyBhc3luYyA6bm9lcnJvciB0CiAgICAgIDs7IENvbm5lY3Rpb24g
ZXJyb3IgaXMgYXNzdW1lZCB0byBtZWFuICJubyBzaWctZmlsZSIuCiAgICAgIDplcnJvci1mb3Jt
IChsZXQgKChhbGxvdy11bnNpZ25lZAogICAgICAgICAgICAgICAgICAgICAgICAgKGVxIChwYWNr
YWdlLWNoZWNrLXNpZ25hdHVyZSkgJ2FsbG93LXVuc2lnbmVkKSkpCiAgICAgICAgICAgICAgICAg
ICAgKHdoZW4gKGFuZCBjYWxsYmFjayBhbGxvdy11bnNpZ25lZCkKICAgICAgICAgICAgICAgICAg
ICAgIChmdW5jYWxsIGNhbGxiYWNrIG5pbCkpCiAgICAgICAgICAgICAgICAgICAgKHdoZW4gdW53
aW5kIChmdW5jYWxsIHVud2luZCkpCiAgICAgICAgICAgICAgICAgICAgKHVubGVzcyBhbGxvdy11
bnNpZ25lZAogICAgICAgICAgICAgICAgICAgICAgKGVycm9yICJVbnNpZ25lZCBmaWxlIGAlcycg
YXQgJXMiIGZpbGUgbG9jYXRpb24pKSkKICAgICAgOzsgT1RPSCwgYW4gZXJyb3IgaGVyZSBtZWFu
cyAiYmFkIHNpZ25hdHVyZSIsIHdoaWNoIHdlIG5ldmVyCiAgICAgIDs7IHN1cHByZXNzLiAgKEJ1
ZyMyMjA4OSkKICAgICAgKHVud2luZC1wcm90ZWN0CiAgICAgICAgICAobGV0ICgoc2lnIChwYWNr
YWdlLS1jaGVjay1zaWduYXR1cmUtY29udGVudAogICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZl
ci1zdWJzdHJpbmcgKHBvaW50KSAocG9pbnQtbWF4KSkKICAgICAgICAgICAgICAgICAgICAgIHN0
cmluZyBzaWctZmlsZSkpKQogICAgICAgICAgICAod2hlbiBjYWxsYmFjayAoZnVuY2FsbCBjYWxs
YmFjayBzaWcpKQogICAgICAgICAgICBzaWcpCiAgICAgICAgKHdoZW4gdW53aW5kIChmdW5jYWxs
IHVud2luZCkpKSkpKQoMCjs7OyBQYWNrYWdlcyBvbiBBcmNoaXZlcwo7OyBUaGUgZm9sbG93aW5n
IHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcyBhdmFpbGFibGUKOzsg
ZnJvbSBhcmNoaXZlcy4gIFRoZSBtb3N0IGltcG9ydGFudCBvZiB0aGVzZSBpcwo7OyBgcGFja2Fn
ZS1hcmNoaXZlLWNvbnRlbnRzJyB3aGljaCBpcyBpbml0aWFsbHkgcG9wdWxhdGVkIGJ5IHRoZQo7
OyBmdW5jdGlvbiBgcGFja2FnZS1yZWFkLWFsbC1hcmNoaXZlLWNvbnRlbnRzJyBmcm9tIGEgY2Fj
aGUgb24gZGlzay4KOzsgVGhlIGBwYWNrYWdlLWluaXRpYWxpemUnIGNvbW1hbmQgaXMgYWxzbyBj
bG9zZWx5IHJlbGF0ZWQgdG8gdGhpcwo7OyBzZWN0aW9uLCBidXQgaXQgaGFzIGl0cyBvd24gc2Vj
dGlvbi4KCihkZWZjb25zdCBwYWNrYWdlLWFyY2hpdmUtdmVyc2lvbiAxCiAgIlZlcnNpb24gbnVt
YmVyIG9mIHRoZSBwYWNrYWdlIGFyY2hpdmUgdW5kZXJzdG9vZCBieSBwYWNrYWdlLmVsLgpMb3dl
ciB2ZXJzaW9uIG51bWJlcnMgdGhhbiB0aGlzIHdpbGwgcHJvYmFibHkgYmUgdW5kZXJzdG9vZCBh
cyB3ZWxsLiIpCgo7OyBXZSBkb24ndCBwcmltZSB0aGUgY2FjaGUgc2luY2UgaXQgdGVuZHMgdG8g
Z2V0IG91dCBvZiBkYXRlLgooZGVmdmFyIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cyBuaWwKICAi
Q2FjaGUgb2YgdGhlIGNvbnRlbnRzIG9mIGFsbCBhcmNoaXZlcyBpbiBgcGFja2FnZS1hcmNoaXZl
cycuClRoaXMgaXMgYW4gYWxpc3QgbWFwcGluZyBwYWNrYWdlIG5hbWVzIChzeW1ib2xzKSB0bwpu
b24tZW1wdHkgbGlzdHMgb2YgYHBhY2thZ2UtZGVzYycgc3RydWN0dXJlcy4iKQoocHV0ICdwYWNr
YWdlLWFyY2hpdmUtY29udGVudHMgJ3Jpc2t5LWxvY2FsLXZhcmlhYmxlIHQpCgooZGVmdmFyIHBh
Y2thZ2UtLWNvbXBhdGliaWxpdHktdGFibGUgbmlsCiAgIkhhc2ggdGFibGUgY29ubmVjdGluZyBw
YWNrYWdlIG5hbWVzIHRvIHRoZWlyIGNvbXBhdGliaWxpdHkuCkVhY2gga2V5IGlzIGEgc3ltYm9s
LCB0aGUgbmFtZSBvZiBhIHBhY2thZ2UuCgpUaGUgdmFsdWUgaXMgZWl0aGVyIG5pbCwgcmVwcmVz
ZW50aW5nIGFuIGluY29tcGF0aWJsZSBwYWNrYWdlLCBvcgphIHZlcnNpb24gbGlzdCwgcmVwcmVz
ZW50aW5nIHRoZSBoaWdoZXN0IGNvbXBhdGlibGUgdmVyc2lvbiBvZgp0aGF0IHBhY2thZ2Ugd2hp
Y2ggaXMgYXZhaWxhYmxlLgoKQSBwYWNrYWdlIGlzIGNvbnNpZGVyZWQgaW5jb21wYXRpYmxlIGlm
IGl0IHJlcXVpcmVzIGFuIEVtYWNzCnZlcnNpb24gaGlnaGVyIHRoYW4gdGhlIG9uZSBiZWluZyB1
c2VkLiAgVG8gY2hlY2sgZm9yIHBhY2thZ2UKXChpbiljb21wYXRpYmlsaXR5LCBkb24ndCByZWFk
IHRoaXMgdGFibGUgZGlyZWN0bHksIHVzZQpgcGFja2FnZS0taW5jb21wYXRpYmxlLXAnIHdoaWNo
IGFsc28gY2hlY2tzIGRlcGVuZGVuY2llcy4iKQoKKGRlZnVuIHBhY2thZ2UtLWJ1aWxkLWNvbXBh
dGliaWxpdHktdGFibGUgKCkKICAiQnVpbGQgYHBhY2thZ2UtLWNvbXBhdGliaWxpdHktdGFibGUn
IHdpdGggYHBhY2thZ2UtLW1hcGMnLiIKICA7OyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGJ1aWx0
LWlucy4KICAocmVxdWlyZSAnZmluZGVyLWluZiBuaWwgdCkKICA7OyBCdWlsZCBjb21wYXQgdGFi
bGUuCiAgKHNldHEgcGFja2FnZS0tY29tcGF0aWJpbGl0eS10YWJsZSAobWFrZS1oYXNoLXRhYmxl
IDp0ZXN0ICdlcSkpCiAgKHBhY2thZ2UtLW1hcGMgIydwYWNrYWdlLS1hZGQtdG8tY29tcGF0aWJp
bGl0eS10YWJsZSkpCgooZGVmdW4gcGFja2FnZS0tYWRkLXRvLWNvbXBhdGliaWxpdHktdGFibGUg
KHBrZykKICAiSWYgUEtHIGlzIGNvbXBhdGlibGUgKHdpdGhvdXQgZGVwZW5kZW5jaWVzKSwgYWRk
IHRvIHRoZSBjb21wYXRpYmlsaXR5IHRhYmxlLgpQS0cgaXMgYSBwYWNrYWdlLWRlc2Mgb2JqZWN0
LgpPbmx5IGFkZHMgaWYgaXRzIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gd2hhdCdzIGFscmVhZHkg
c3RvcmVkIGluCnRoZSB0YWJsZS4iCiAgKHVubGVzcyAocGFja2FnZS0taW5jb21wYXRpYmxlLXAg
cGtnICdzaGFsbG93KQogICAgKGxldCogKChuYW1lIChwYWNrYWdlLWRlc2MtbmFtZSBwa2cpKQog
ICAgICAgICAgICh2ZXJzaW9uIChvciAocGFja2FnZS1kZXNjLXZlcnNpb24gcGtnKSAnKDApKSkK
ICAgICAgICAgICAodGFibGUtdmVyc2lvbiAoZ2V0aGFzaCBuYW1lIHBhY2thZ2UtLWNvbXBhdGli
aWxpdHktdGFibGUpKSkKICAgICAgKHdoZW4gKG9yIChub3QgdGFibGUtdmVyc2lvbikKICAgICAg
ICAgICAgICAgICh2ZXJzaW9uLWxpc3QtPCB0YWJsZS12ZXJzaW9uIHZlcnNpb24pKQogICAgICAg
IChwdXRoYXNoIG5hbWUgdmVyc2lvbiBwYWNrYWdlLS1jb21wYXRpYmlsaXR5LXRhYmxlKSkpKSkK
Cjs7IFBhY2thZ2UgZGVzY3JpcHRvciBvYmplY3RzIHVzZWQgaW5zaWRlIHRoZSAiYXJjaGl2ZS1j
b250ZW50cyIgZmlsZS4KOzsgQ2hhbmdpbmcgdGhpcyBkZWZzdHJ1Y3QgaW1wbGllcyBjaGFuZ2lu
ZyB0aGUgZm9ybWF0IG9mIHRoZQo7OyAiYXJjaGl2ZS1jb250ZW50cyIgZmlsZXMuCihjbC1kZWZz
dHJ1Y3QgKHBhY2thZ2UtLWFjLWRlc2MKICAgICAgICAgICAgICAgKDpjb25zdHJ1Y3RvciBwYWNr
YWdlLW1ha2UtYWMtZGVzYyAodmVyc2lvbiByZXFzIHN1bW1hcnkga2luZCBleHRyYXMpKQogICAg
ICAgICAgICAgICAoOmNvcGllciBuaWwpCiAgICAgICAgICAgICAgICg6dHlwZSB2ZWN0b3IpKQog
IHZlcnNpb24gcmVxcyBzdW1tYXJ5IGtpbmQgZXh0cmFzKQoKKGRlZnVuIHBhY2thZ2UtLWFwcGVu
ZC10by1hbGlzdCAocGtnLWRlc2MgYWxpc3QpCiAgIkFwcGVuZCBhbiBlbnRyeSBmb3IgUEtHLURF
U0MgdG8gdGhlIHN0YXJ0IG9mIEFMSVNUIGFuZCByZXR1cm4gaXQuClRoaXMgZW50cnkgdGFrZXMg
dGhlIGZvcm0gKGBwYWNrYWdlLWRlc2MtbmFtZScgUEtHLURFU0MpLgoKSWYgQUxJU1QgYWxyZWFk
eSBoYXMgYW4gZW50cnkgd2l0aCB0aGlzIG5hbWUsIGRlc3RydWN0aXZlbHkgYWRkClBLRy1ERVND
IHRvIHRoZSBjZHIgb2YgdGhpcyBlbnRyeSBpbnN0ZWFkLCBzb3J0ZWQgYnkgdmVyc2lvbgpudW1i
ZXIuIgogIChsZXQqICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAg
ICAocHJpb3JpdHktdmVyc2lvbiAocGFja2FnZS1kZXNjLXByaW9yaXR5LXZlcnNpb24gcGtnLWRl
c2MpKQogICAgICAgICAoZXhpc3RpbmctcGFja2FnZXMgKGFzc3EgbmFtZSBhbGlzdCkpKQogICAg
KGlmIChub3QgZXhpc3RpbmctcGFja2FnZXMpCiAgICAgICAgKGNvbnMgKGxpc3QgbmFtZSBwa2ct
ZGVzYykKICAgICAgICAgICAgICBhbGlzdCkKICAgICAgKHdoaWxlIChpZiAoYW5kIChjZHIgZXhp
c3RpbmctcGFja2FnZXMpCiAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbi1saXN0LTwgcHJp
b3JpdHktdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNr
YWdlLWRlc2MtcHJpb3JpdHktdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoY2FkciBleGlzdGluZy1wYWNrYWdlcykpKSkKICAgICAgICAgICAgICAgICAoc2V0
cSBleGlzdGluZy1wYWNrYWdlcyAoY2RyIGV4aXN0aW5nLXBhY2thZ2VzKSkKICAgICAgICAgICAg
ICAgKHB1c2ggcGtnLWRlc2MgKGNkciBleGlzdGluZy1wYWNrYWdlcykpCiAgICAgICAgICAgICAg
IG5pbCkpCiAgICAgIGFsaXN0KSkpCgooZGVmdW4gcGFja2FnZS0tYWRkLXRvLWFyY2hpdmUtY29u
dGVudHMgKHBhY2thZ2UgYXJjaGl2ZSkKICAiQWRkIHRoZSBQQUNLQUdFIGZyb20gdGhlIGdpdmVu
IEFSQ0hJVkUgaWYgbmVjZXNzYXJ5LgpQQUNLQUdFIHNob3VsZCBoYXZlIHRoZSBmb3JtIChOQU1F
IC4gUEFDS0FHRS0tQUMtREVTQykuCkFsc28sIGFkZCB0aGUgb3JpZ2luYXRpbmcgYXJjaGl2ZSB0
byB0aGUgYHBhY2thZ2UtZGVzYycgc3RydWN0dXJlLiIKICAobGV0KiAoKG5hbWUgKGNhciBwYWNr
YWdlKSkKICAgICAgICAgKHZlcnNpb24gKHBhY2thZ2UtLWFjLWRlc2MtdmVyc2lvbiAoY2RyIHBh
Y2thZ2UpKSkKICAgICAgICAgKHBrZy1kZXNjCiAgICAgICAgICAocGFja2FnZS1kZXNjLWNyZWF0
ZQogICAgICAgICAgIDpuYW1lIG5hbWUKICAgICAgICAgICA6dmVyc2lvbiB2ZXJzaW9uCiAgICAg
ICAgICAgOnJlcXMgKHBhY2thZ2UtLWFjLWRlc2MtcmVxcyAoY2RyIHBhY2thZ2UpKQogICAgICAg
ICAgIDpzdW1tYXJ5IChwYWNrYWdlLS1hYy1kZXNjLXN1bW1hcnkgKGNkciBwYWNrYWdlKSkKICAg
ICAgICAgICA6a2luZCAocGFja2FnZS0tYWMtZGVzYy1raW5kIChjZHIgcGFja2FnZSkpCiAgICAg
ICAgICAgOmFyY2hpdmUgYXJjaGl2ZQogICAgICAgICAgIDpleHRyYXMgKGFuZCAoPiAobGVuZ3Ro
IChjZHIgcGFja2FnZSkpIDQpCiAgICAgICAgICAgICAgICAgICAgICAgIDs7IE9sZGVyIGFyY2hp
dmUtY29udGVudHMgZmlsZXMgaGF2ZSBvbmx5IDQKICAgICAgICAgICAgICAgICAgICAgICAgOzsg
ZWxlbWVudHMgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLWFjLWRlc2Mt
ZXh0cmFzIChjZHIgcGFja2FnZSkpKSkpCiAgICAgICAgIChwaW5uZWQtdG8tYXJjaGl2ZSAoYXNz
b2MgbmFtZSBwYWNrYWdlLXBpbm5lZC1wYWNrYWdlcykpKQogICAgOzsgU2tpcCBlbnRpcmVseSBp
ZiBwaW5uZWQgdG8gYW5vdGhlciBhcmNoaXZlLgogICAgKHdoZW4gKG5vdCAoYW5kIHBpbm5lZC10
by1hcmNoaXZlCiAgICAgICAgICAgICAgICAgICAgKG5vdCAoZXF1YWwgKGNkciBwaW5uZWQtdG8t
YXJjaGl2ZSkgYXJjaGl2ZSkpKSkKICAgICAgKHNldHEgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRz
CiAgICAgICAgICAgIChwYWNrYWdlLS1hcHBlbmQtdG8tYWxpc3QgcGtnLWRlc2MgcGFja2FnZS1h
cmNoaXZlLWNvbnRlbnRzKSkpKSkKCihkZWZ1biBwYWNrYWdlLS1yZWFkLWFyY2hpdmUtZmlsZSAo
ZmlsZSkKICAiUmVhZCBjYWNoZWQgYXJjaGl2ZSBGSUxFIGRhdGEsIGlmIGl0IGV4aXN0cy4KUmV0
dXJuIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUsIG9yIG5pbCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBl
eGlzdC4KSWYgdGhlIGFyY2hpdmUgdmVyc2lvbiBpcyB0b28gbmV3LCBzaWduYWwgYW4gZXJyb3Iu
IgogIChsZXQgKChmaWxlbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlIHBhY2thZ2UtdXNlci1k
aXIpKSkKICAgICh3aGVuIChmaWxlLWV4aXN0cy1wIGZpbGVuYW1lKQogICAgICAod2l0aC10ZW1w
LWJ1ZmZlcgogICAgICAgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkICd1dGYtOCkpCiAg
ICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgZmlsZW5hbWUpKQogICAgICAgIChsZXQgKChj
b250ZW50cyAocmVhZCAoY3VycmVudC1idWZmZXIpKSkpCiAgICAgICAgICAoaWYgKD4gKGNhciBj
b250ZW50cykgcGFja2FnZS1hcmNoaXZlLXZlcnNpb24pCiAgICAgICAgICAgICAgKGVycm9yICJQ
YWNrYWdlIGFyY2hpdmUgdmVyc2lvbiAlZCBpcyBoaWdoZXIgdGhhbiAlZCIKICAgICAgICAgICAg
ICAgIChjYXIgY29udGVudHMpIHBhY2thZ2UtYXJjaGl2ZS12ZXJzaW9uKSkKICAgICAgICAgIChj
ZHIgY29udGVudHMpKSkpKSkKCihkZWZ1biBwYWNrYWdlLXJlYWQtYXJjaGl2ZS1jb250ZW50cyAo
YXJjaGl2ZSkKICAiUmVhZCBjYWNoZWQgYXJjaGl2ZSBmaWxlIGZvciBBUkNISVZFLgpJZiBzdWNj
ZXNzZnVsLCBzZXQgb3IgdXBkYXRlIHRoZSB2YXJpYWJsZSBgcGFja2FnZS1hcmNoaXZlLWNvbnRl
bnRzJy4KQVJDSElWRSBzaG91bGQgYmUgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIG5hbWUgb2YgYSBw
YWNrYWdlIGFyY2hpdmUKaW4gdGhlIHZhcmlhYmxlIGBwYWNrYWdlLWFyY2hpdmVzJy4KSWYgdGhl
IGFyY2hpdmUgdmVyc2lvbiBpcyB0b28gbmV3LCBzaWduYWwgYW4gZXJyb3IuIgogIDs7IFZlcnNp
b24gMSBvZiAnYXJjaGl2ZS1jb250ZW50cycgaXMgaWRlbnRpY2FsIHRvIG91ciBpbnRlcm5hbAog
IDs7IHJlcHJlc2VudGF0aW9uLgogIChsZXQqICgoY29udGVudHMtZmlsZSAoZm9ybWF0ICJhcmNo
aXZlcy8lcy9hcmNoaXZlLWNvbnRlbnRzIiBhcmNoaXZlKSkKICAgICAgICAgKGNvbnRlbnRzIChw
YWNrYWdlLS1yZWFkLWFyY2hpdmUtZmlsZSBjb250ZW50cy1maWxlKSkpCiAgICAod2hlbiBjb250
ZW50cwogICAgICAoZG9saXN0IChwYWNrYWdlIGNvbnRlbnRzKQogICAgICAgIChpZiBwYWNrYWdl
CiAgICAgICAgICAgIChwYWNrYWdlLS1hZGQtdG8tYXJjaGl2ZS1jb250ZW50cyBwYWNrYWdlIGFy
Y2hpdmUpCiAgICAgICAgICAobHdhcm4gJyhwYWNrYWdlIHJlZnJlc2gpIDp3YXJuaW5nCiAgICAg
ICAgICAgICAgICAgIklnbm9yaW5nIG5pbCBwYWNrYWdlIG9uIGAlcycgcGFja2FnZSBhcmNoaXZl
IiBhcmNoaXZlKSkpKSkpCgooZGVmdmFyIHBhY2thZ2UtLW9sZC1hcmNoaXZlLXByaW9yaXRpZXMg
bmlsCiAgIlN0b3JlIGN1cnJlbnRseSB1c2VkIGBwYWNrYWdlLWFyY2hpdmUtcHJpb3JpdGllcycu
ClRoaXMgaXMgdGhlIHZhbHVlIG9mIGBwYWNrYWdlLWFyY2hpdmUtcHJpb3JpdGllcycgbGFzdCB0
aW1lCmBwYWNrYWdlLXJlYWQtYWxsLWFyY2hpdmUtY29udGVudHMnIHdhcyBjYWxsZWQuICBJdCBj
YW4gYmUgdXNlZApieSBhcmJpdHJhcnkgZnVuY3Rpb25zIHRvIGRlY2lkZSB3aGV0aGVyIGl0IGlz
IG5lY2Vzc2FyeSB0byBjYWxsCml0IGFnYWluLiIpCgooZGVmdmFyIHBhY2thZ2UtcmVhZC1hcmNo
aXZlLWhvb2sgKGxpc3QgIydwYWNrYWdlLXJlYWQtYXJjaGl2ZS1jb250ZW50cykKICAiTGlzdCBv
ZiBmdW5jdGlvbnMgdG8gY2FsbCB0byByZWFkIHRoZSBhcmNoaXZlIGNvbnRlbnRzLgpFYWNoIGZ1
bmN0aW9uIG11c3QgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudCwgYSBzeW1ib2wgaW5kaWNhdGlu
Zwp3aGF0IGFyY2hpdmUgdG8gcmVhZCBpbi4gIFRoZSBzeW1ib2wgb3VnaHQgdG8gYmUgYSBrZXkg
aW4KYHBhY2thZ2UtYXJjaGl2ZXMnLiIpCgooZGVmdW4gcGFja2FnZS1yZWFkLWFsbC1hcmNoaXZl
LWNvbnRlbnRzICgpCiAgIlJlYWQgY2FjaGVkIGFyY2hpdmUgZmlsZSBmb3IgYWxsIGFyY2hpdmVz
IGluIGBwYWNrYWdlLWFyY2hpdmVzJy4KSWYgc3VjY2Vzc2Z1bCwgc2V0IG9yIHVwZGF0ZSBgcGFj
a2FnZS1hcmNoaXZlLWNvbnRlbnRzJy4iCiAgKHNldHEgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRz
IG5pbCkKICAoc2V0cSBwYWNrYWdlLS1vbGQtYXJjaGl2ZS1wcmlvcml0aWVzIHBhY2thZ2UtYXJj
aGl2ZS1wcmlvcml0aWVzKQogIChkb2xpc3QgKGFyY2hpdmUgcGFja2FnZS1hcmNoaXZlcykKICAg
IChydW4taG9vay13aXRoLWFyZ3MgJ3BhY2thZ2UtcmVhZC1hcmNoaXZlLWhvb2sgKGNhciBhcmNo
aXZlKSkpKQoKDAo7Ozs7IFBhY2thZ2UgSW5pdGlhbGl6ZQo7OyBBIGJpdCBvZiBhIG1pbGVzdG9u
ZS4gIFRoaXMgYnJpbmdzIHRvZ2V0aGVyIHNvbWUgb2YgdGhlIGFib3ZlCjs7IHNlY3Rpb25zIGFu
ZCBwb3B1bGF0ZXMgYWxsIHJlbGV2YW50IGxpc3RzIG9mIHBhY2thZ2VzIGZyb20gY29udGVudHMK
OzsgYXZhaWxhYmxlIG9uIGRpc2suCgooZGVmdmFyIHBhY2thZ2UtLWluaXRpYWxpemVkIG5pbAog
ICJOb24tbmlsIGlmIGBwYWNrYWdlLWluaXRpYWxpemUnIGhhcyBiZWVuIHJ1bi4iKQoKOzs7IyMj
YXV0b2xvYWQKKGRlZnZhciBwYWNrYWdlLS1hY3RpdmF0ZWQgbmlsCiAgIk5vbi1uaWwgaWYgYHBh
Y2thZ2UtYWN0aXZhdGUtYWxsJyBoYXMgYmVlbiBydW4uIikKCjs7OyMjI2F1dG9sb2FkCihkZWZ1
biBwYWNrYWdlLWluaXRpYWxpemUgKCZvcHRpb25hbCBuby1hY3RpdmF0ZSkKICAiTG9hZCBFbWFj
cyBMaXNwIHBhY2thZ2VzLCBhbmQgYWN0aXZhdGUgdGhlbS4KVGhlIHZhcmlhYmxlIGBwYWNrYWdl
LWxvYWQtbGlzdCcgY29udHJvbHMgd2hpY2ggcGFja2FnZXMgdG8gbG9hZC4KSWYgb3B0aW9uYWwg
YXJnIE5PLUFDVElWQVRFIGlzIG5vbi1uaWwsIGRvbid0IGFjdGl2YXRlIHBhY2thZ2VzLgoKSXQg
aXMgbm90IG5lY2Vzc2FyeSB0byBhZGp1c3QgYGxvYWQtcGF0aCcgb3IgYHJlcXVpcmUnIHRoZQpp
bmRpdmlkdWFsIHBhY2thZ2VzIGFmdGVyIGNhbGxpbmcgYHBhY2thZ2UtaW5pdGlhbGl6ZScgLS0g
dGhpcyBpcwp0YWtlbiBjYXJlIG9mIGJ5IGBwYWNrYWdlLWluaXRpYWxpemUnLgoKSWYgYHBhY2th
Z2UtaW5pdGlhbGl6ZScgaXMgY2FsbGVkIHR3aWNlIGR1cmluZyBFbWFjcyBzdGFydHVwLApzaWdu
YWwgYSB3YXJuaW5nLCBzaW5jZSB0aGlzIGlzIGEgYmFkIGlkZWEgZXhjZXB0IGluIGhpZ2hseQph
ZHZhbmNlZCB1c2UgY2FzZXMuICBUbyBzdXBwcmVzcyB0aGUgd2FybmluZywgcmVtb3ZlIHRoZQpz
dXBlcmZsdW91cyBjYWxsIHRvIGBwYWNrYWdlLWluaXRpYWxpemUnIGZyb20geW91ciBpbml0LWZp
bGUuICBJZgp5b3UgaGF2ZSBjb2RlIHdoaWNoIG11c3QgcnVuIGJlZm9yZSBgcGFja2FnZS1pbml0
aWFsaXplJywgcHV0CnRoYXQgY29kZSBpbiB0aGUgZWFybHkgaW5pdC1maWxlLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKHdoZW4gKGFuZCBwYWNrYWdlLS1pbml0aWFsaXplZCAobm90IGFmdGVyLWluaXQt
dGltZSkpCiAgICAobHdhcm4gJyhwYWNrYWdlIHJlaW5pdGlhbGl6YXRpb24pIDp3YXJuaW5nCiAg
ICAgICAgICAgIlVubmVjZXNzYXJ5IGNhbGwgdG8gYHBhY2thZ2UtaW5pdGlhbGl6ZScgaW4gaW5p
dCBmaWxlIikpCiAgKHNldHEgcGFja2FnZS1hbGlzdCBuaWwpCiAgKHBhY2thZ2UtbG9hZC1hbGwt
ZGVzY3JpcHRvcnMpCiAgKHBhY2thZ2UtcmVhZC1hbGwtYXJjaGl2ZS1jb250ZW50cykKICAoc2V0
cSBwYWNrYWdlLS1pbml0aWFsaXplZCB0KQogICh1bmxlc3Mgbm8tYWN0aXZhdGUKICAgIChwYWNr
YWdlLWFjdGl2YXRlLWFsbCkpCiAgOzsgVGhpcyB1c2VzIGBwYWNrYWdlLS1tYXBjJyBzbyBpdCBt
dXN0IGJlIGNhbGxlZCBhZnRlcgogIDs7IGBwYWNrYWdlLS1pbml0aWFsaXplZCcgaXMgdC4KICAo
cGFja2FnZS0tYnVpbGQtY29tcGF0aWJpbGl0eS10YWJsZSkpCgo7OzsjIyNhdXRvbG9hZAoocHJv
Z24gOzsgTWFrZSB0aGUgZnVuY3Rpb24gdXNhYmxlIHdpdGhvdXQgbG9hZGluZyBgcGFja2FnZS5l
bCcuCihkZWZ1biBwYWNrYWdlLWFjdGl2YXRlLWFsbCAoKQogICJBY3RpdmF0ZSBhbGwgaW5zdGFs
bGVkIHBhY2thZ2VzLgpUaGUgdmFyaWFibGUgYHBhY2thZ2UtbG9hZC1saXN0JyBjb250cm9scyB3
aGljaCBwYWNrYWdlcyB0byBsb2FkLiIKICAoc2V0cSBwYWNrYWdlLS1hY3RpdmF0ZWQgdCkKICAo
bGV0KiAoKGVsYyAoY29uY2F0IHBhY2thZ2UtcXVpY2tzdGFydC1maWxlICJjIikpCiAgICAgICAg
IChxcyAoaWYgKGZpbGUtcmVhZGFibGUtcCBlbGMpIGVsYwogICAgICAgICAgICAgICAoaWYgKGZp
bGUtcmVhZGFibGUtcCBwYWNrYWdlLXF1aWNrc3RhcnQtZmlsZSkKICAgICAgICAgICAgICAgICAg
IHBhY2thZ2UtcXVpY2tzdGFydC1maWxlKSkpKQogICAgOzsgVGhlIHF1aWNrc3RhcnQgZmlsZSBw
cmVzdW1lcyB0aGF0IGl0IGhhcyBhIGJsYW5rIHNsYXRlLAogICAgOzsgc28gZG9uJ3QgdXNlIGl0
IGlmIHdlIGFscmVhZHkgYWN0aXZhdGVkIHNvbWUgcGFja2FnZXMuCiAgICAoaWYgKGFuZCBxcyAo
bm90IChib3VuZC1hbmQtdHJ1ZS1wIHBhY2thZ2UtYWN0aXZhdGVkLWxpc3QpKSkKICAgICAgICA7
OyBTa2lwIGxvYWQtc291cmNlLWZpbGUtZnVuY3Rpb24gd2hpY2ggd291bGQgc2xvdyB1cyBkb3du
IGJ5IGEgZmFjdG9yCiAgICAgICAgOzsgMiB3aGVuIGxvYWRpbmcgdGhlIC5lbCBmaWxlICh0aGlz
IGFzc3VtZXMgd2Ugd2VyZSBjYXJlZnVsIHRvCiAgICAgICAgOzsgc2F2ZSB0aGlzIGZpbGUgc28g
aXQgZG9lc24ndCBuZWVkIGFueSBkZWNvZGluZykuCiAgICAgICAgKGxldCAoKGxvYWQtc291cmNl
LWZpbGUtZnVuY3Rpb24gbmlsKSkKICAgICAgICAgICh1bmxlc3MgKGJvdW5kcCAncGFja2FnZS1h
Y3RpdmF0ZWQtbGlzdCkKICAgICAgICAgICAgKHNldHEgcGFja2FnZS1hY3RpdmF0ZWQtbGlzdCBu
aWwpKQogICAgICAgICAgKGxvYWQgcXMgbmlsICdub21lc3NhZ2UpKQogICAgICAocmVxdWlyZSAn
cGFja2FnZSkKICAgICAgKHBhY2thZ2UtLWFjdGl2YXRlLWFsbCkpKSkpCgo7OzsjIyNhdXRvbG9h
ZAooZGVmdW4gcGFja2FnZS0tYWN0aXZhdGUtYWxsICgpCiAgKGRvbGlzdCAoZWx0IChwYWNrYWdl
LS1hbGlzdCkpCiAgICAoY29uZGl0aW9uLWNhc2UgZXJyCiAgICAgICAgKHBhY2thZ2UtYWN0aXZh
dGUgKGNhciBlbHQpKQogICAgICA7OyBEb24ndCBsZXQgZmFpbHVyZSBvZiBhY3RpdmF0aW9uIG9m
IGEgcGFja2FnZSBhcmJpdHJhcmlseSBzdG9wCiAgICAgIDs7IGFjdGl2YXRpb24gb2YgZnVydGhl
ciBwYWNrYWdlcy4KICAgICAgKGVycm9yIChtZXNzYWdlICIlcyIgKGVycm9yLW1lc3NhZ2Utc3Ry
aW5nIGVycikpKSkpKQoMCjs7OzsgUG9wdWxhdGluZyBgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRz
JyBmcm9tIGFyY2hpdmVzCjs7IFRoaXMgc3Vic2VjdGlvbiBwb3B1bGF0ZXMgdGhlIHZhcmlhYmxl
cyBsaXN0ZWQgYWJvdmUgZnJvbSB0aGUKOzsgYWN0dWFsIGFyY2hpdmVzLCBpbnN0ZWFkIG9mIGZy
b20gYSBsb2NhbCBjYWNoZS4KCihkZWZ2YXIgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNz
IG5pbAogICJMaXN0IG9mIGluLXByb2dyZXNzIGFzeW5jaHJvbm91cyBkb3dubG9hZHMuIikKCihk
ZWNsYXJlLWZ1bmN0aW9uIGVwZy1pbXBvcnQta2V5cy1mcm9tLWZpbGUgImVwZyIgKGNvbnRleHQg
a2V5cykpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1pbXBvcnQta2V5cmluZyAoJm9w
dGlvbmFsIGZpbGUpCiAgIkltcG9ydCBrZXlzIGZyb20gRklMRS4iCiAgKGludGVyYWN0aXZlICJm
RmlsZTogIikKICAoc2V0cSBmaWxlIChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKQogIChsZXQgKChj
b250ZXh0IChlcGctbWFrZS1jb250ZXh0ICdPcGVuUEdQKSkpCiAgICAod2hlbiBwYWNrYWdlLWdu
dXBnaG9tZS1kaXIKICAgICAgKHdpdGgtZmlsZS1tb2RlcyA0NDgKICAgICAgICAobWFrZS1kaXJl
Y3RvcnkgcGFja2FnZS1nbnVwZ2hvbWUtZGlyIHQpKQogICAgICAoc2V0ZiAoZXBnLWNvbnRleHQt
aG9tZS1kaXJlY3RvcnkgY29udGV4dCkgcGFja2FnZS1nbnVwZ2hvbWUtZGlyKSkKICAgIChtZXNz
YWdlICJJbXBvcnRpbmcgJXMuLi4iIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKQogICAg
KGVwZy1pbXBvcnQta2V5cy1mcm9tLWZpbGUgY29udGV4dCBmaWxlKQogICAgKG1lc3NhZ2UgIklt
cG9ydGluZyAlcy4uLmRvbmUiIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKSkpCgooZGVm
dmFyIHBhY2thZ2UtLXBvc3QtZG93bmxvYWQtYXJjaGl2ZXMtaG9vayBuaWwKICAiSG9vayBydW4g
YWZ0ZXIgdGhlIGFyY2hpdmUgY29udGVudHMgYXJlIGRvd25sb2FkZWQuCkRvbid0IHJ1biB0aGlz
IGhvb2sgZGlyZWN0bHkuICBJdCBpcyBtZWFudCB0byBiZSBydW4gYXMgcGFydCBvZgpgcGFja2Fn
ZS0tdXBkYXRlLWRvd25sb2Fkcy1pbi1wcm9ncmVzcycuIikKKHB1dCAncGFja2FnZS0tcG9zdC1k
b3dubG9hZC1hcmNoaXZlcy1ob29rICdyaXNreS1sb2NhbC12YXJpYWJsZSB0KQoKKGRlZnVuIHBh
Y2thZ2UtLXVwZGF0ZS1kb3dubG9hZHMtaW4tcHJvZ3Jlc3MgKGVudHJ5KQogICJSZW1vdmUgRU5U
UlkgZnJvbSBgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzJy4KT25jZSBpdCdzIGVtcHR5
LCBydW4gYHBhY2thZ2UtLXBvc3QtZG93bmxvYWQtYXJjaGl2ZXMtaG9vaycuIgogIDs7IEtlZXAg
dHJhY2sgb2YgdGhlIGRvd25sb2FkaW5nIHByb2dyZXNzLgogIChzZXRxIHBhY2thZ2UtLWRvd25s
b2Fkcy1pbi1wcm9ncmVzcwogICAgICAgIChyZW1vdmUgZW50cnkgcGFja2FnZS0tZG93bmxvYWRz
LWluLXByb2dyZXNzKSkKICA7OyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBkb3dubG9hZCwgcnVuIHRo
ZSBob29rLgogICh1bmxlc3MgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzCiAgICAocGFj
a2FnZS1yZWFkLWFsbC1hcmNoaXZlLWNvbnRlbnRzKQogICAgKHBhY2thZ2UtLWJ1aWxkLWNvbXBh
dGliaWxpdHktdGFibGUpCiAgICA7OyBXZSBtZXNzYWdlIGJlZm9yZSBydW5uaW5nIHRoZSBob29r
LCBzbyB0aGUgaG9vayBjYW4gZ2l2ZQogICAgOzsgbWVzc2FnZXMgYXMgd2VsbC4KICAgIChtZXNz
YWdlICJQYWNrYWdlIHJlZnJlc2ggZG9uZSIpCiAgICAocnVuLWhvb2tzICdwYWNrYWdlLS1wb3N0
LWRvd25sb2FkLWFyY2hpdmVzLWhvb2spKSkKCihkZWZ1biBwYWNrYWdlLS1kb3dubG9hZC1vbmUt
YXJjaGl2ZSAoYXJjaGl2ZSBmaWxlICZvcHRpb25hbCBhc3luYykKICAiUmV0cmlldmUgYW4gYXJj
aGl2ZSBmaWxlIEZJTEUgZnJvbSBBUkNISVZFLCBhbmQgY2FjaGUgaXQuCkFSQ0hJVkUgc2hvdWxk
IGJlIGEgY29ucyBjZWxsIG9mIHRoZSBmb3JtIChOQU1FIC4gTE9DQVRJT04pLApzaW1pbGFyIHRv
IGFuIGVudHJ5IGluIGBwYWNrYWdlLWFsaXN0Jy4gIFNhdmUgdGhlIGNhY2hlZCBjb3B5IHRvClwi
YXJjaGl2ZXMvTkFNRS9GSUxFXCIgaW4gYHBhY2thZ2UtdXNlci1kaXInLiIKICA7OyBUaGUgZG93
bmxvYWRlZCBhcmNoaXZlIGNvbnRlbnRzIHdpbGwgYmUgcmVhZCBhcyBwYXJ0IG9mCiAgOzsgYHBh
Y2thZ2UtLXVwZGF0ZS1kb3dubG9hZHMtaW4tcHJvZ3Jlc3MnLgogICh3aGVuIGFzeW5jCiAgICAo
Y2wtcHVzaG5ldyAoY29ucyBhcmNoaXZlIGZpbGUpIHBhY2thZ2UtLWRvd25sb2Fkcy1pbi1wcm9n
cmVzcwogICAgICAgICAgICAgICAgOnRlc3QgIydlcXVhbCkpCiAgKHBhY2thZ2UtLXdpdGgtcmVz
cG9uc2UtYnVmZmVyIChjZHIgYXJjaGl2ZSkgOmZpbGUgZmlsZQogICAgOmFzeW5jIGFzeW5jCiAg
ICA6ZXJyb3ItZm9ybSAocGFja2FnZS0tdXBkYXRlLWRvd25sb2Fkcy1pbi1wcm9ncmVzcyAoY29u
cyBhcmNoaXZlIGZpbGUpKQogICAgKGxldCogKChsb2NhdGlvbiAoY2RyIGFyY2hpdmUpKQogICAg
ICAgICAgIChuYW1lIChjYXIgYXJjaGl2ZSkpCiAgICAgICAgICAgKGNvbnRlbnQgKGJ1ZmZlci1z
dHJpbmcpKQogICAgICAgICAgIChkaXIgKGV4cGFuZC1maWxlLW5hbWUgKGNvbmNhdCAiYXJjaGl2
ZXMvIiBuYW1lKSBwYWNrYWdlLXVzZXItZGlyKSkKICAgICAgICAgICAobG9jYWwtZmlsZSAoZXhw
YW5kLWZpbGUtbmFtZSBmaWxlIGRpcikpKQogICAgICAod2hlbiAobGlzdHAgKHJlYWQgY29udGVu
dCkpCiAgICAgICAgKG1ha2UtZGlyZWN0b3J5IGRpciB0KQogICAgICAgIChpZiAob3IgKG5vdCAo
cGFja2FnZS1jaGVjay1zaWduYXR1cmUpKQogICAgICAgICAgICAgICAgKG1lbWJlciBuYW1lIHBh
Y2thZ2UtdW5zaWduZWQtYXJjaGl2ZXMpKQogICAgICAgICAgICA7OyBJZiB3ZSBkb24ndCBjYXJl
IGFib3V0IHRoZSBzaWduYXR1cmUsIHNhdmUgdGhlIGZpbGUgYW5kCiAgICAgICAgICAgIDs7IHdl
J3JlIGRvbmUuCiAgICAgICAgICAgIChwcm9nbgogICAgICAgICAgICAgIChjbC1hc3NlcnQgKG5v
dCBlbmFibGUtbXVsdGlieXRlLWNoYXJhY3RlcnMpKQogICAgICAgICAgICAgIChsZXQgKChjb2Rp
bmctc3lzdGVtLWZvci13cml0ZSAnYmluYXJ5KSkKICAgICAgICAgICAgICAgICh3cml0ZS1yZWdp
b24gY29udGVudCBuaWwgbG9jYWwtZmlsZSBuaWwgJ3NpbGVudCkpCiAgICAgICAgICAgICAgKHBh
Y2thZ2UtLXVwZGF0ZS1kb3dubG9hZHMtaW4tcHJvZ3Jlc3MgKGNvbnMgYXJjaGl2ZSBmaWxlKSkp
CiAgICAgICAgICA7OyBJZiB3ZSBjYXJlLCBjaGVjayBpdCAocGVyaGFwcyBhc3luYykgYW5kICp0
aGVuKiB3cml0ZSB0aGUgZmlsZS4KICAgICAgICAgIChwYWNrYWdlLS1jaGVjay1zaWduYXR1cmUK
ICAgICAgICAgICBsb2NhdGlvbiBmaWxlIGNvbnRlbnQgYXN5bmMKICAgICAgICAgICA7OyBUaGlz
IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHNpZ25hdHVyZSBjaGVja2luZy4KICAgICAg
ICAgICAobGFtYmRhICgmb3B0aW9uYWwgZ29vZC1zaWdzKQogICAgICAgICAgICAgKGNsLWFzc2Vy
dCAobm90IGVuYWJsZS1tdWx0aWJ5dGUtY2hhcmFjdGVycykpCiAgICAgICAgICAgICAobGV0ICgo
Y29kaW5nLXN5c3RlbS1mb3Itd3JpdGUgJ2JpbmFyeSkpCiAgICAgICAgICAgICAgICh3cml0ZS1y
ZWdpb24gY29udGVudCBuaWwgbG9jYWwtZmlsZSBuaWwgJ3NpbGVudCkpCiAgICAgICAgICAgICA7
OyBXcml0ZSBvdXQgZ29vZCBzaWduYXR1cmVzIGludG8gYXJjaGl2ZS1jb250ZW50cy5zaWduZWQg
ZmlsZS4KICAgICAgICAgICAgICh3aGVuIGdvb2Qtc2lncwogICAgICAgICAgICAgICAod3JpdGUt
cmVnaW9uIChtYXBjb25jYXQgIydlcGctc2lnbmF0dXJlLXRvLXN0cmluZyBnb29kLXNpZ3MgIlxu
IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwgKGNvbmNhdCBsb2NhbC1maWxlICIu
c2lnbmVkIikgbmlsICdzaWxlbnQpKSkKICAgICAgICAgICAobGFtYmRhICgpIChwYWNrYWdlLS11
cGRhdGUtZG93bmxvYWRzLWluLXByb2dyZXNzIChjb25zIGFyY2hpdmUgZmlsZSkpKSkpKSkpKQoK
KGRlZnVuIHBhY2thZ2UtLWRvd25sb2FkLWFuZC1yZWFkLWFyY2hpdmVzICgmb3B0aW9uYWwgYXN5
bmMpCiAgIkRvd25sb2FkIGRlc2NyaXB0aW9ucyBvZiBhbGwgYHBhY2thZ2UtYXJjaGl2ZXMnIGFu
ZCByZWFkIHRoZW0uClBvcHVsYXRlIGBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMnIHdpdGggdGhl
IHJlc3VsdC4KCklmIG9wdGlvbmFsIGFyZ3VtZW50IEFTWU5DIGlzIG5vbi1uaWwsIHBlcmZvcm0g
dGhlIGRvd25sb2Fkcwphc3luY2hyb25vdXNseS4iCiAgKGRvbGlzdCAoYXJjaGl2ZSBwYWNrYWdl
LWFyY2hpdmVzKQogICAgKGNvbmRpdGlvbi1jYXNlLXVubGVzcy1kZWJ1ZyBuaWwKICAgICAgICAo
cGFja2FnZS0tZG93bmxvYWQtb25lLWFyY2hpdmUgYXJjaGl2ZSAiYXJjaGl2ZS1jb250ZW50cyIg
YXN5bmMpCiAgICAgIChlcnJvciAobWVzc2FnZSAiRmFpbGVkIHRvIGRvd25sb2FkIGAlcycgYXJj
aGl2ZS4iCiAgICAgICAgICAgICAgIChjYXIgYXJjaGl2ZSkpKSkpKQoKKGRlZnZhciBwYWNrYWdl
LXJlZnJlc2gtY29udGVudHMtaG9vayAobGlzdCAjJ3BhY2thZ2UtLWRvd25sb2FkLWFuZC1yZWFk
LWFyY2hpdmVzKQogICJMaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxsIHRvIHJlZnJlc2ggdGhlIHBh
Y2thZ2UgYXJjaGl2ZS4KRWFjaCBmdW5jdGlvbiBtYXkgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVu
dCBpbmRpY2F0aW5nIHRoYXQgdGhlCm9wZXJhdGlvbiBvdWdodCB0byBiZSBleGVjdXRlZCBhc3lu
Y2hyb25vdXNseS4iKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtcmVmcmVzaC1jb250
ZW50cyAoJm9wdGlvbmFsIGFzeW5jKQogICJEb3dubG9hZCBkZXNjcmlwdGlvbnMgb2YgYWxsIGNv
bmZpZ3VyZWQgRUxQQSBwYWNrYWdlcy4KRm9yIGVhY2ggYXJjaGl2ZSBjb25maWd1cmVkIGluIHRo
ZSB2YXJpYWJsZSBgcGFja2FnZS1hcmNoaXZlcycsCmluZm9ybSBFbWFjcyBhYm91dCB0aGUgbGF0
ZXN0IHZlcnNpb25zIG9mIGFsbCBwYWNrYWdlcyBpdCBvZmZlcnMsCmFuZCBtYWtlIHRoZW0gYXZh
aWxhYmxlIGZvciBkb3dubG9hZC4KT3B0aW9uYWwgYXJndW1lbnQgQVNZTkMgc3BlY2lmaWVzIHdo
ZXRoZXIgdG8gcGVyZm9ybSB0aGUKZG93bmxvYWRzIGluIHRoZSBiYWNrZ3JvdW5kLiIKICAoaW50
ZXJhY3RpdmUpCiAgKHVubGVzcyAoZmlsZS1leGlzdHMtcCBwYWNrYWdlLXVzZXItZGlyKQogICAg
KG1ha2UtZGlyZWN0b3J5IHBhY2thZ2UtdXNlci1kaXIgdCkpCiAgKGxldCAoKGRlZmF1bHQta2V5
cmluZyAoZXhwYW5kLWZpbGUtbmFtZSAicGFja2FnZS1rZXlyaW5nLmdwZyIKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtZGlyZWN0b3J5KSkKICAgICAgICAo
aW5oaWJpdC1tZXNzYWdlIChvciBpbmhpYml0LW1lc3NhZ2UgYXN5bmMpKSkKICAgICh3aGVuIChh
bmQgKHBhY2thZ2UtY2hlY2stc2lnbmF0dXJlKSAoZmlsZS1leGlzdHMtcCBkZWZhdWx0LWtleXJp
bmcpKQogICAgICAoY29uZGl0aW9uLWNhc2UtdW5sZXNzLWRlYnVnIGVycm9yCiAgICAgICAgICAo
cGFja2FnZS1pbXBvcnQta2V5cmluZyBkZWZhdWx0LWtleXJpbmcpCiAgICAgICAgKGVycm9yICht
ZXNzYWdlICJDYW5ub3QgaW1wb3J0IGRlZmF1bHQga2V5cmluZzogJVMiIChjZHIgZXJyb3IpKSkp
KSkKICAocnVuLWhvb2std2l0aC1hcmdzICdwYWNrYWdlLXJlZnJlc2gtY29udGVudHMtaG9vayBh
c3luYykpCgoMCjs7OyBEZXBlbmRlbmN5IE1hbmFnZW1lbnQKOzsgQ2FsY3VsYXRpbmcgdGhlIGZ1
bGwgdHJhbnNhY3Rpb24gbmVjZXNzYXJ5IGZvciBhbiBpbnN0YWxsYXRpb24sCjs7IGtlZXBpbmcg
dHJhY2sgb2Ygd2hpY2ggcGFja2FnZXMgd2VyZSBpbnN0YWxsZWQgc3RyaWN0bHkgYXMKOzsgZGVw
ZW5kZW5jaWVzLCBhbmQgZGV0ZXJtaW5pbmcgd2hpY2ggcGFja2FnZXMgY2Fubm90IGJlIHJlbW92
ZWQKOzsgYmVjYXVzZSB0aGV5IGFyZSBkZXBlbmRlbmNpZXMuCgooZGVmdW4gcGFja2FnZS1jb21w
dXRlLXRyYW5zYWN0aW9uIChwYWNrYWdlcyByZXF1aXJlbWVudHMgJm9wdGlvbmFsIHNlZW4pCiAg
IlJldHVybiBhIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgaW5zdGFsbGVkLCBpbmNsdWRpbmcgUEFD
S0FHRVMuClBBQ0tBR0VTIHNob3VsZCBiZSBhIGxpc3Qgb2YgYHBhY2thZ2UtZGVzYycuCgpSRVFV
SVJFTUVOVFMgc2hvdWxkIGJlIGEgbGlzdCBvZiBhZGRpdGlvbmFsIHJlcXVpcmVtZW50czsgZWFj
aAplbGVtZW50IGluIHRoaXMgbGlzdCBzaG91bGQgaGF2ZSB0aGUgZm9ybSAoUEFDS0FHRSBWRVJT
SU9OLUxJU1QpLAp3aGVyZSBQQUNLQUdFIGlzIGEgcGFja2FnZSBuYW1lIGFuZCBWRVJTSU9OLUxJ
U1QgaXMgdGhlIHJlcXVpcmVkCnZlcnNpb24gb2YgdGhhdCBwYWNrYWdlLgoKVGhpcyBmdW5jdGlv
biByZWN1cnNpdmVseSBjb21wdXRlcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZQpwYWNrYWdlcyBp
biBSRVFVSVJFTUVOVFMsIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHBhY2thZ2VzCnRo
YXQgbXVzdCBiZSBpbnN0YWxsZWQuICBQYWNrYWdlcyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxl
ZCBhcmUKbm90IGluY2x1ZGVkIGluIHRoaXMgbGlzdC4KClNFRU4gaXMgdXNlZCBpbnRlcm5hbGx5
IHRvIGRldGVjdCBpbmZpbml0ZSByZWN1cnNpb24uIgogIDs7IEZJWE1FOiBXZSByZWFsbHkgc2hv
dWxkIHVzZSBiYWNrdHJhY2tpbmcgdG8gZXhwbG9yZSB0aGUgd2hvbGUKICA7OyBzZWFyY2ggc3Bh
Y2UgKGUuZy4gaWYgZm9vIHJlcXVpcmUgYmFyLTEuMywgYW5kIGJhci0xLjQgcmVxdWlyZXMgdG90
by0xLjEKICA7OyB3aGVyZWFzIGJhci0xLjMgcmVxdWlyZXMgdG90by0xLjAgYW5kIHRoZSB1c2Vy
IGhhcyBwdXQgYSBob2xkIG9uIHRvdG8tMS4wOgogIDs7IHRoZSBjdXJyZW50IGNvZGUgbWlnaHQg
ZmFpbCB0byBzZWUgdGhhdCBpdCBjb3VsZCBpbnN0YWxsIGZvbyBieSB1c2luZyB0aGUKICA7OyBv
bGRlciBiYXItMS4zKS4KICAoZG9saXN0IChlbHQgcmVxdWlyZW1lbnRzKQogICAgKGxldCogKChu
ZXh0LXBrZyAoY2FyIGVsdCkpCiAgICAgICAgICAgKG5leHQtdmVyc2lvbiAoY2FkciBlbHQpKQog
ICAgICAgICAgIChhbHJlYWR5ICgpKSkKICAgICAgKGRvbGlzdCAocGtnIHBhY2thZ2VzKQogICAg
ICAgIChpZiAoZXEgbmV4dC1wa2cgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZykpCiAgICAgICAgICAg
IChzZXRxIGFscmVhZHkgcGtnKSkpCiAgICAgICh3aGVuIGFscmVhZHkKICAgICAgICAoaWYgKHZl
cnNpb24tbGlzdC08PSBuZXh0LXZlcnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIGFscmVhZHkp
KQogICAgICAgICAgICA7OyBgbmV4dC1wa2cnIGlzIGFscmVhZHkgaW4gYHBhY2thZ2VzJywgYnV0
IGl0cyBwb3NpdGlvbiB0aGVyZQogICAgICAgICAgICA7OyBtZWFucyBpdCBtaWdodCBiZSBpbnN0
YWxsZWQgdG9vIGxhdGU6IHJlbW92ZSBpdCBmcm9tIHRoZXJlLCBzbwogICAgICAgICAgICA7OyB3
ZSByZS1hZGQgaXQgKGFsb25nIHdpdGggaXRzIGRlcGVuZGVuY2llcykgYXQgYW4gZWFybGllciBw
bGFjZQogICAgICAgICAgICA7OyBiZWxvdyAoYnVnIzE2OTk0KS4KICAgICAgICAgICAgKGlmICht
ZW1xIGFscmVhZHkgc2VlbikgICAgIDtBdm9pZCBpbmYtbG9vcCBvbiBkZXBlbmRlbmN5IGN5Y2xl
cy4KICAgICAgICAgICAgICAgIChtZXNzYWdlICJEZXBlbmRlbmN5IGN5Y2xlIGdvaW5nIHRocm91
Z2ggJVMiCiAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLWZ1bGwtbmFtZSBh
bHJlYWR5KSkKICAgICAgICAgICAgICAoc2V0cSBwYWNrYWdlcyAoZGVscSBhbHJlYWR5IHBhY2th
Z2VzKSkKICAgICAgICAgICAgICAoc2V0cSBhbHJlYWR5IG5pbCkpCiAgICAgICAgICAoZXJyb3Ig
Ik5lZWQgcGFja2FnZSBgJXMtJXMnLCBidXQgb25seSAlcyBpcyBiZWluZyBpbnN0YWxsZWQiCiAg
ICAgICAgICAgICAgICAgbmV4dC1wa2cgKHBhY2thZ2UtdmVyc2lvbi1qb2luIG5leHQtdmVyc2lv
bikKICAgICAgICAgICAgICAgICAocGFja2FnZS12ZXJzaW9uLWpvaW4gKHBhY2thZ2UtZGVzYy12
ZXJzaW9uIGFscmVhZHkpKSkpKQogICAgICAoY29uZAogICAgICAgKGFscmVhZHkgbmlsKQogICAg
ICAgKChwYWNrYWdlLWluc3RhbGxlZC1wIG5leHQtcGtnIG5leHQtdmVyc2lvbikgbmlsKQoKICAg
ICAgICh0CiAgICAgICAgOzsgQSBwYWNrYWdlIGlzIHJlcXVpcmVkLCBidXQgbm90IGluc3RhbGxl
ZC4gIEl0IG1pZ2h0IGFsc28gYmUKICAgICAgICA7OyBibG9ja2VkIHZpYSBgcGFja2FnZS1sb2Fk
LWxpc3QnLgogICAgICAgIChsZXQgKChwa2ctZGVzY3MgKGNkciAoYXNzcSBuZXh0LXBrZyBwYWNr
YWdlLWFyY2hpdmUtY29udGVudHMpKSkKICAgICAgICAgICAgICAoZm91bmQgbmlsKQogICAgICAg
ICAgICAgIChmb3VuZC1zb21ldGhpbmcgbmlsKQogICAgICAgICAgICAgIChwcm9ibGVtIG5pbCkp
CiAgICAgICAgICAod2hpbGUgKGFuZCBwa2ctZGVzY3MgKG5vdCBmb3VuZCkpCiAgICAgICAgICAg
IChsZXQqICgocGtnLWRlc2MgKHBvcCBwa2ctZGVzY3MpKQogICAgICAgICAgICAgICAgICAgKHZl
cnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIHBrZy1kZXNjKSkKICAgICAgICAgICAgICAgICAg
IChkaXNhYmxlZCAocGFja2FnZS1kaXNhYmxlZC1wIG5leHQtcGtnIHZlcnNpb24pKSkKICAgICAg
ICAgICAgICAoY29uZAogICAgICAgICAgICAgICAoKHZlcnNpb24tbGlzdC08IHZlcnNpb24gbmV4
dC12ZXJzaW9uKQogICAgICAgICAgICAgICAgOzsgcGtnLWRlc2NzIGlzIHNvcnRlZCBieSBwcmlv
cml0eSwgbm90IHZlcnNpb24sIHNvCiAgICAgICAgICAgICAgICA7OyBkb24ndCBlcnJvciBqdXN0
IHlldC4KICAgICAgICAgICAgICAgICh1bmxlc3MgZm91bmQtc29tZXRoaW5nCiAgICAgICAgICAg
ICAgICAgIChzZXRxIGZvdW5kLXNvbWV0aGluZyAocGFja2FnZS12ZXJzaW9uLWpvaW4gdmVyc2lv
bikpKSkKICAgICAgICAgICAgICAgKGRpc2FibGVkCiAgICAgICAgICAgICAgICAodW5sZXNzIHBy
b2JsZW0KICAgICAgICAgICAgICAgICAgKHNldHEgcHJvYmxlbQogICAgICAgICAgICAgICAgICAg
ICAgICAoaWYgKHN0cmluZ3AgZGlzYWJsZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
Zm9ybWF0LW1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFja2FnZSBgJXMn
IGhlbGQgYXQgdmVyc2lvbiAlcywgYnV0IHZlcnNpb24gJXMgcmVxdWlyZWQiCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbmV4dC1wa2cgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAocGFja2FnZS12ZXJzaW9uLWpvaW4gbmV4dC12ZXJzaW9uKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAoZm9ybWF0LW1lc3NhZ2UgIlJlcXVpcmVkIHBhY2thZ2UgYCVzJyBpcyBk
aXNhYmxlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC1w
a2cpKSkpKQogICAgICAgICAgICAgICAodCAoc2V0cSBmb3VuZCBwa2ctZGVzYykpKSkpCiAgICAg
ICAgICAodW5sZXNzIGZvdW5kCiAgICAgICAgICAgIChjb25kCiAgICAgICAgICAgICAocHJvYmxl
bSAoZXJyb3IgIiVzIiBwcm9ibGVtKSkKICAgICAgICAgICAgIChmb3VuZC1zb21ldGhpbmcKICAg
ICAgICAgICAgICAoZXJyb3IgIk5lZWQgcGFja2FnZSBgJXMtJXMnLCBidXQgb25seSAlcyBpcyBh
dmFpbGFibGUiCiAgICAgICAgICAgICAgICAgICAgIG5leHQtcGtnIChwYWNrYWdlLXZlcnNpb24t
am9pbiBuZXh0LXZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgIGZvdW5kLXNvbWV0aGluZykp
CiAgICAgICAgICAgICAodAogICAgICAgICAgICAgIChpZiAoZXEgbmV4dC1wa2cgJ2VtYWNzKQog
ICAgICAgICAgICAgICAgICAoZXJyb3IgIlRoaXMgcGFja2FnZSByZXF1aXJlcyBFbWFjcyB2ZXJz
aW9uICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtdmVyc2lvbi1qb2luIG5l
eHQtdmVyc2lvbikpCiAgICAgICAgICAgICAgICAoZXJyb3IgKGlmIChub3QgbmV4dC12ZXJzaW9u
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICJQYWNrYWdlIGAlcycgaXMgdW5h
dmFpbGFibGUiIG5leHQtcGtnKQogICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiUGFj
a2FnZSBgJXMnICh2ZXJzaW9uICVzKSBpcyB1bmF2YWlsYWJsZSIKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbmV4dC1wa2cgKHBhY2thZ2UtdmVyc2lvbi1qb2luIG5leHQtdmVyc2lv
bikpKSkpKSkpCiAgICAgICAgICAoc2V0cSBwYWNrYWdlcwogICAgICAgICAgICAgICAgKHBhY2th
Z2UtY29tcHV0ZS10cmFuc2FjdGlvbiAoY29ucyBmb3VuZCBwYWNrYWdlcykKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1yZXFzIGZvdW5k
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyBmb3Vu
ZCBzZWVuKSkpKSkpKSkKICBwYWNrYWdlcykKCihkZWZ1biBwYWNrYWdlLS1maW5kLW5vbi1kZXBl
bmRlbmNpZXMgKCkKICAiUmV0dXJuIGEgbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMgd2hpY2gg
YXJlIG5vdCBkZXBlbmRlbmNpZXMuCkZpbmRzIGFsbCBwYWNrYWdlcyBpbiBgcGFja2FnZS1hbGlz
dCcgd2hpY2ggYXJlIG5vdCBkZXBlbmRlbmNpZXMKb2YgYW55IG90aGVyIHBhY2thZ2VzLgpVc2Vk
IHRvIHBvcHVsYXRlIGBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJy4iCiAgKGxldCAoKGRlcC1s
aXN0CiAgICAgICAgIChkZWxldGUtZHVwcwogICAgICAgICAgKGFwcGx5ICMnYXBwZW5kCiAgICAg
ICAgICAgIChtYXBjYXIgKGxhbWJkYSAocCkgKG1hcGNhciAjJ2NhciAocGFja2FnZS1kZXNjLXJl
cXMgKGNhZHIgcCkpKSkKICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLWFsaXN0KSkpKSkKICAg
IChjbC1sb29wIGZvciBwIGluIHBhY2thZ2UtYWxpc3QKICAgICAgICAgICAgIGZvciBuYW1lID0g
KGNhciBwKQogICAgICAgICAgICAgdW5sZXNzIChtZW1xIG5hbWUgZGVwLWxpc3QpCiAgICAgICAg
ICAgICBjb2xsZWN0IG5hbWUpKSkKCihkZWZ1biBwYWNrYWdlLS1zYXZlLXNlbGVjdGVkLXBhY2th
Z2VzICgmb3B0aW9uYWwgdmFsdWUpCiAgIlNldCBhbmQgc2F2ZSBgcGFja2FnZS1zZWxlY3RlZC1w
YWNrYWdlcycgdG8gVkFMVUUuIgogICh3aGVuIHZhbHVlCiAgICAoc2V0cSBwYWNrYWdlLXNlbGVj
dGVkLXBhY2thZ2VzIHZhbHVlKSkKICAoaWYgYWZ0ZXItaW5pdC10aW1lCiAgICAgIChjdXN0b21p
emUtc2F2ZS12YXJpYWJsZSAncGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcyBwYWNrYWdlLXNlbGVj
dGVkLXBhY2thZ2VzKQogICAgKGFkZC1ob29rICdhZnRlci1pbml0LWhvb2sgIydwYWNrYWdlLS1z
YXZlLXNlbGVjdGVkLXBhY2thZ2VzKSkpCgooZGVmdW4gcGFja2FnZS0tdXNlci1zZWxlY3RlZC1w
IChwa2cpCiAgIlJldHVybiBub24tbmlsIGlmIFBLRyBpcyBhIHBhY2thZ2Ugd2FzIGluc3RhbGxl
ZCBieSB0aGUgdXNlci4KUEtHIGlzIGEgcGFja2FnZSBuYW1lLgpUaGlzIGxvb2tzIGludG8gYHBh
Y2thZ2Utc2VsZWN0ZWQtcGFja2FnZXMnLCBwb3B1bGF0aW5nIGl0IGZpcnN0CmlmIGl0IGlzIHN0
aWxsIGVtcHR5LiIKICAodW5sZXNzIChjb25zcCBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKQog
ICAgKHBhY2thZ2UtLXNhdmUtc2VsZWN0ZWQtcGFja2FnZXMgKHBhY2thZ2UtLWZpbmQtbm9uLWRl
cGVuZGVuY2llcykpKQogIChtZW1xIHBrZyBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkKCihk
ZWZ1biBwYWNrYWdlLS1nZXQtZGVwcyAocGtncykKICAobGV0ICgoc2VlbiAnKCkpKQogICAgKHdo
aWxlIHBrZ3MKICAgICAgKGxldCAoKHBrZyAocG9wIHBrZ3MpKSkKICAgICAgICAoaWYgKG1lbXEg
cGtnIHNlZW4pCiAgICAgICAgICAgIG5pbCA7OyBEb25lIGFscmVhZHkhCiAgICAgICAgICAobGV0
ICgocGtnLWRlc2MgKGNhZHIgKGFzc3EgcGtnIHBhY2thZ2UtYWxpc3QpKSkpCiAgICAgICAgICAg
ICh3aGVuIHBrZy1kZXNjCiAgICAgICAgICAgICAgKHB1c2ggcGtnIHNlZW4pCiAgICAgICAgICAg
ICAgKHNldHEgcGtncyAoYXBwZW5kIChtYXBjYXIgIydjYXIgKHBhY2thZ2UtZGVzYy1yZXFzIHBr
Zy1kZXNjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtncykpKSkpKSkKICAg
IHNlZW4pKQoKKGRlZnVuIHBhY2thZ2UtLXVzZXItaW5zdGFsbGVkLXAgKHBhY2thZ2UpCiAgIlJl
dHVybiBub24tbmlsIGlmIFBBQ0tBR0UgaXMgYSB1c2VyLWluc3RhbGxlZCBwYWNrYWdlLgpQQUNL
QUdFIGlzIHRoZSBwYWNrYWdlIG5hbWUsIGEgc3ltYm9sLiAgQ2hlY2sgd2hldGhlciB0aGUgcGFj
a2FnZQp3YXMgaW5zdGFsbGVkIGludG8gYHBhY2thZ2UtdXNlci1kaXInIHdoZXJlIHdlIGFzc3Vt
ZSB0byBoYXZlCmNvbnRyb2wgb3Zlci4iCiAgKGxldCogKChwa2ctZGVzYyAoY2FkciAoYXNzcSBw
YWNrYWdlIHBhY2thZ2UtYWxpc3QpKSkKICAgICAgICAgKGRpciAocGFja2FnZS1kZXNjLWRpciBw
a2ctZGVzYykpKQogICAgKGZpbGUtaW4tZGlyZWN0b3J5LXAgZGlyIHBhY2thZ2UtdXNlci1kaXIp
KSkKCihkZWZ1biBwYWNrYWdlLS1yZW1vdmFibGUtcGFja2FnZXMgKCkKICAiUmV0dXJuIGEgbGlz
dCBvZiBuYW1lcyBvZiBwYWNrYWdlcyBubyBsb25nZXIgbmVlZGVkLgpUaGVzZSBhcmUgcGFja2Fn
ZXMgd2hpY2ggYXJlIG5laXRoZXIgY29udGFpbmVkIGluCmBwYWNrYWdlLXNlbGVjdGVkLXBhY2th
Z2VzJyBub3IgYSBkZXBlbmRlbmN5IG9mIG9uZSB0aGF0IGlzLiIKICAobGV0ICgobmVlZGVkIChw
YWNrYWdlLS1nZXQtZGVwcyBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkpCiAgICAoY2wtbG9v
cCBmb3IgcCBpbiAobWFwY2FyICMnY2FyIHBhY2thZ2UtYWxpc3QpCiAgICAgICAgICAgICB1bmxl
c3MgKG9yIChtZW1xIHAgbmVlZGVkKQogICAgICAgICAgICAgICAgICAgICAgICA7OyBEbyBub3Qg
YXV0by1yZW1vdmUgZXh0ZXJuYWwgcGFja2FnZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIChu
b3QgKHBhY2thZ2UtLXVzZXItaW5zdGFsbGVkLXAgcCkpKQogICAgICAgICAgICAgY29sbGVjdCBw
KSkpCgooZGVmdW4gcGFja2FnZS0tdXNlZC1lbHNld2hlcmUtcCAocGtnLWRlc2MgJm9wdGlvbmFs
IHBrZy1saXN0IGFsbCkKICAiTm9uLW5pbCBpZiBQS0ctREVTQyBpcyBhIGRlcGVuZGVuY3kgb2Yg
YSBwYWNrYWdlIGluIFBLRy1MSVNULgpSZXR1cm4gdGhlIGZpcnN0IHBhY2thZ2UgZm91bmQgaW4g
UEtHLUxJU1Qgb2Ygd2hpY2ggUEtHIGlzIGEKZGVwZW5kZW5jeS4gIElmIEFMTCBpcyBub24tbmls
LCByZXR1cm4gYWxsIHN1Y2ggcGFja2FnZXMgaW5zdGVhZC4KCldoZW4gbm90IHNwZWNpZmllZCwg
UEtHLUxJU1QgZGVmYXVsdHMgdG8gYHBhY2thZ2UtYWxpc3QnCndpdGggUEtHLURFU0MgZW50cnkg
cmVtb3ZlZC4iCiAgKHVubGVzcyAoc3RyaW5nPSAocGFja2FnZS1kZXNjLXN0YXR1cyBwa2ctZGVz
YykgIm9ic29sZXRlIikKICAgIChsZXQqICgocGtnIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVz
YykpCiAgICAgICAgICAgKGFsaXN0IChvciBwa2ctbGlzdAogICAgICAgICAgICAgICAgICAgICAg
KHJlbW92ZSAoYXNzcSBwa2cgcGFja2FnZS1hbGlzdCkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcGFja2FnZS1hbGlzdCkpKSkKICAgICAgKGlmIGFsbAogICAgICAgICAgKGNsLWxvb3Ag
Zm9yIHAgaW4gYWxpc3QKICAgICAgICAgICAgICAgICAgIGlmIChhc3NxIHBrZyAocGFja2FnZS1k
ZXNjLXJlcXMgKGNhZHIgcCkpKQogICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY2FkciBwKSkK
ICAgICAgICAoY2wtbG9vcCBmb3IgcCBpbiBhbGlzdCB0aGVyZWlzCiAgICAgICAgICAgICAgICAg
KGFuZCAoYXNzcSBwa2cgKHBhY2thZ2UtZGVzYy1yZXFzIChjYWRyIHApKSkKICAgICAgICAgICAg
ICAgICAgICAgIChjYWRyIHApKSkpKSkpCgooZGVmdW4gcGFja2FnZS0tc29ydC1kZXBzLWluLWFs
aXN0IChwYWNrYWdlIG9ubHkpCiAgIlJldHVybiBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciBQ
QUNLQUdFIHNvcnRlZCBieSBkZXBlbmRlbmN5LgpQQUNLQUdFIGlzIGluY2x1ZGVkIGFzIHRoZSBm
aXJzdCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBsaXN0LgpPTkxZIGlzIGFuIGFsaXN0IGFzc29j
aWF0aW5nIHBhY2thZ2UgbmFtZXMgdG8gcGFja2FnZSBvYmplY3RzLgpPbmx5IHRoZXNlIHBhY2th
Z2VzIHdpbGwgYmUgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlaXIgY2RycyBhcmUKZGVzdHJ1
Y3RpdmVseSBzZXQgdG8gbmlsIGluIE9OTFkuIgogIChsZXQgKChvdXQpKQogICAgKGRvbGlzdCAo
ZGVwIChwYWNrYWdlLWRlc2MtcmVxcyBwYWNrYWdlKSkKICAgICAgKHdoZW4tbGV0KiAoKGNlbGwg
KGFzc3EgKGNhciBkZXApIG9ubHkpKQogICAgICAgICAgICAgICAgICAoZGVwLXBhY2thZ2UgKGNk
ci1zYWZlIGNlbGwpKSkKICAgICAgICAoc2V0Y2RyIGNlbGwgbmlsKQogICAgICAgIChzZXRxIG91
dCAoYXBwZW5kIChwYWNrYWdlLS1zb3J0LWRlcHMtaW4tYWxpc3QgZGVwLXBhY2thZ2Ugb25seSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQpKSkpCiAgICAoY29ucyBwYWNrYWdlIG91dCkp
KQoKKGRlZnVuIHBhY2thZ2UtLXNvcnQtYnktZGVwZW5kZW5jZSAocGFja2FnZS1saXN0KQogICJS
ZXR1cm4gUEFDS0FHRS1MSVNUIHNvcnRlZCBieSBkZXBlbmRlbmNlLgpUaGF0IGlzLCBhbnkgZWxl
bWVudCBvZiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBndWFyYW50ZWVkIHRvIG5vdApkaXJlY3RseSBk
ZXBlbmQgb24gYW55IGVsZW1lbnRzIHRoYXQgY29tZSBiZWZvcmUgaXQuCgpQQUNLQUdFLUxJU1Qg
aXMgYSBsaXN0IG9mIGBwYWNrYWdlLWRlc2MnIG9iamVjdHMuCkluZGlyZWN0IGRlcGVuZGVuY2ll
cyBhcmUgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZCBpbiBvcmRlciBvbmx5CmlmIGFsbCB0aGUg
aW4tYmV0d2VlbiBkZXBlbmRlbmNpZXMgYXJlIGFsc28gaW4gUEFDS0FHRS1MSVNULiIKICAobGV0
ICgoYWxpc3QgKG1hcGNhciAobGFtYmRhIChwKSAoY29ucyAocGFja2FnZS1kZXNjLW5hbWUgcCkg
cCkpIHBhY2thZ2UtbGlzdCkpCiAgICAgICAgb3V0LWxpc3QpCiAgICAoZG9saXN0IChjZWxsIGFs
aXN0IG91dC1saXN0KQogICAgICA7OyBgcGFja2FnZS0tc29ydC1kZXBzLWluLWFsaXN0JyBkZXN0
cnVjdGl2ZWx5IGNoYW5nZXMgYWxpc3QsIHNvCiAgICAgIDs7IHNvbWUgY2VsbHMgbWlnaHQgYWxy
ZWFkeSBiZSBlbXB0eS4gIFdlIGNoZWNrIHRoaXMgaGVyZS4KICAgICAgKHdoZW4tbGV0KiAoKHBr
Zy1kZXNjIChjZHIgY2VsbCkpKQogICAgICAgIChzZXRjZHIgY2VsbCBuaWwpCiAgICAgICAgKHNl
dHEgb3V0LWxpc3QKICAgICAgICAgICAgICAoYXBwZW5kIChwYWNrYWdlLS1zb3J0LWRlcHMtaW4t
YWxpc3QgcGtnLWRlc2MgYWxpc3QpCiAgICAgICAgICAgICAgICAgICAgICBvdXQtbGlzdCkpKSkp
KQoKDAo7OzsgSW5zdGFsbGF0aW9uIEZ1bmN0aW9ucwo7OyBBcyBvcHBvc2VkIHRvIHRoZSBwcmV2
aW91cyBzZWN0aW9uICh3aGljaCBsaXN0ZWQgc29tZSB1bmRlcmx5aW5nCjs7IGZ1bmN0aW9ucyBu
ZWNlc3NhcnkgZm9yIGluc3RhbGxhdGlvbiksIHRoaXMgb25lIGNvbnRhaW5zIHRoZSBhY3R1YWwK
OzsgZnVuY3Rpb25zIHRoYXQgaW5zdGFsbCBwYWNrYWdlcy4gIFRoZSBwYWNrYWdlIGl0c2VsZiBj
YW4gYmUKOzsgaW5zdGFsbGVkIGluIGEgdmFyaWV0eSBvZiB3YXlzIChhcmNoaXZlcywgYnVmZmVy
LCBmaWxlKSwgYnV0Cjs7IHJlcXVpcmVtZW50cyAoZGVwZW5kZW5jaWVzKSBhcmUgYWx3YXlzIHNh
dGlzZmllZCBieSBsb29raW5nIGluCjs7IGBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMnLgoKKGRl
ZnVuIHBhY2thZ2UtYXJjaGl2ZS1iYXNlIChkZXNjKQogICJSZXR1cm4gdGhlIHBhY2thZ2UgZGVz
Y3JpYmVkIGJ5IERFU0MuIgogIChjZHIgKGFzc29jIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSBkZXNj
KSBwYWNrYWdlLWFyY2hpdmVzKSkpCgooZGVmdW4gcGFja2FnZS1pbnN0YWxsLWZyb20tYXJjaGl2
ZSAocGtnLWRlc2MpCiAgIkRvd25sb2FkIGFuZCBpbnN0YWxsIGEgcGFja2FnZSBkZWZpbmVkIGJ5
IFBLRy1ERVNDLiIKICA7OyBUaGlzIHdvbid0IGhhcHBlbiwgdW5sZXNzIHRoZSBhcmNoaXZlIGlz
IGRvaW5nIHNvbWV0aGluZyB3cm9uZy4KICAod2hlbiAoZXEgKHBhY2thZ2UtZGVzYy1raW5kIHBr
Zy1kZXNjKSAnZGlyKQogICAgKGVycm9yICJDYW4ndCBpbnN0YWxsIGRpcmVjdG9yeSBwYWNrYWdl
IGZyb20gYXJjaGl2ZSIpKQogIChsZXQqICgobG9jYXRpb24gKHBhY2thZ2UtYXJjaGl2ZS1iYXNl
IHBrZy1kZXNjKSkKICAgICAgICAgKGZpbGUgKGNvbmNhdCAocGFja2FnZS1kZXNjLWZ1bGwtbmFt
ZSBwa2ctZGVzYykKICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXN1ZmZpeCBw
a2ctZGVzYykpKSkKICAgIChwYWNrYWdlLS13aXRoLXJlc3BvbnNlLWJ1ZmZlciBsb2NhdGlvbiA6
ZmlsZSBmaWxlCiAgICAgIChpZiAob3IgKG5vdCAocGFja2FnZS1jaGVjay1zaWduYXR1cmUpKQog
ICAgICAgICAgICAgIChtZW1iZXIgKHBhY2thZ2UtZGVzYy1hcmNoaXZlIHBrZy1kZXNjKQogICAg
ICAgICAgICAgICAgICAgICAgcGFja2FnZS11bnNpZ25lZC1hcmNoaXZlcykpCiAgICAgICAgICA7
OyBJZiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBzaWduYXR1cmUsIHVucGFjayBhbmQgd2UncmUK
ICAgICAgICAgIDs7IGRvbmUuCiAgICAgICAgICAobGV0ICgoc2F2ZS1zaWxlbnRseSB0KSkKICAg
ICAgICAgICAgKHBhY2thZ2UtdW5wYWNrIHBrZy1kZXNjKSkKICAgICAgICA7OyBJZiB3ZSBjYXJl
LCBjaGVjayBpdCBhbmQgKnRoZW4qIHdyaXRlIHRoZSBmaWxlLgogICAgICAgIChsZXQgKChjb250
ZW50IChidWZmZXItc3RyaW5nKSkpCiAgICAgICAgICAocGFja2FnZS0tY2hlY2stc2lnbmF0dXJl
CiAgICAgICAgICAgbG9jYXRpb24gZmlsZSBjb250ZW50IG5pbAogICAgICAgICAgIDs7IFRoaXMg
ZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgc2lnbmF0dXJlIGNoZWNraW5nLgogICAgICAg
ICAgIChsYW1iZGEgKCZvcHRpb25hbCBnb29kLXNpZ3MpCiAgICAgICAgICAgICA7OyBTaWduYXR1
cmUgY2hlY2tlZCwgdW5wYWNrIG5vdy4KICAgICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyIDtG
SVhNRTogSnVzdCB1c2UgdGhlIHByZXZpb3VzIGN1cnJlbnQtYnVmZmVyLgogICAgICAgICAgICAg
ICAoc2V0LWJ1ZmZlci1tdWx0aWJ5dGUgbmlsKQogICAgICAgICAgICAgICAoY2wtYXNzZXJ0IChu
b3QgKG11bHRpYnl0ZS1zdHJpbmctcCBjb250ZW50KSkpCiAgICAgICAgICAgICAgIChpbnNlcnQg
Y29udGVudCkKICAgICAgICAgICAgICAgKGxldCAoKHNhdmUtc2lsZW50bHkgdCkpCiAgICAgICAg
ICAgICAgICAgKHBhY2thZ2UtdW5wYWNrIHBrZy1kZXNjKSkpCiAgICAgICAgICAgICA7OyBIZXJl
IHRoZSBwYWNrYWdlIGhhcyBiZWVuIGluc3RhbGxlZCBzdWNjZXNzZnVsbHksIG1hcmsgaXQgYXMK
ICAgICAgICAgICAgIDs7IHNpZ25lZCBpZiBhcHByb3ByaWF0ZS4KICAgICAgICAgICAgICh3aGVu
IGdvb2Qtc2lncwogICAgICAgICAgICAgICA7OyBXcml0ZSBvdXQgZ29vZCBzaWduYXR1cmVzIGlu
dG8gTkFNRS1WRVJTSU9OLnNpZ25lZCBmaWxlLgogICAgICAgICAgICAgICAod3JpdGUtcmVnaW9u
IChtYXBjb25jYXQgIydlcGctc2lnbmF0dXJlLXRvLXN0cmluZyBnb29kLXNpZ3MgIlxuIikKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoZXhwYW5kLWZpbGUtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0
IChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIHBrZy1kZXNjKSAiLnNpZ25lZCIpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHBhY2thZ2UtdXNlci1kaXIpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmlsICdzaWxlbnQpCiAgICAgICAgICAgICAgIDs7IFVwZGF0ZSB0aGUgb2xkIHBr
Zy1kZXNjIHdoaWNoIHdpbGwgYmUgc2hvd24gb24gdGhlIGRlc2NyaXB0aW9uIGJ1ZmZlci4KICAg
ICAgICAgICAgICAgKHNldGYgKHBhY2thZ2UtZGVzYy1zaWduZWQgcGtnLWRlc2MpIHQpCiAgICAg
ICAgICAgICAgIDs7IFVwZGF0ZSB0aGUgbmV3IChhY3RpdmF0ZWQpIHBrZy1kZXNjIGFzIHdlbGwu
CiAgICAgICAgICAgICAgICh3aGVuLWxldCogKChwa2ctZGVzY3MgKGNkciAoYXNzcSAocGFja2Fn
ZS1kZXNjLW5hbWUgcGtnLWRlc2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBwYWNrYWdlLWFsaXN0KSkpKQogICAgICAgICAgICAgICAgIChzZXRmIChw
YWNrYWdlLWRlc2Mtc2lnbmVkIChjYXIgcGtnLWRlc2NzKSkgdCkpKSkpKSkpKSkKCjs7OyMjI2F1
dG9sb2FkCihkZWZ1biBwYWNrYWdlLWluc3RhbGxlZC1wIChwYWNrYWdlICZvcHRpb25hbCBtaW4t
dmVyc2lvbikKICAiUmV0dXJuIG5vbi1uaWwgaWYgUEFDS0FHRSwgb2YgTUlOLVZFUlNJT04gb3Ig
bmV3ZXIsIGlzIGluc3RhbGxlZC4KSWYgUEFDS0FHRSBpcyBhIHN5bWJvbCwgaXQgaXMgdGhlIHBh
Y2thZ2UgbmFtZSBhbmQgTUlOLVZFUlNJT04Kc2hvdWxkIGJlIGEgdmVyc2lvbiBsaXN0LgoKSWYg
UEFDS0FHRSBpcyBhIGBwYWNrYWdlLWRlc2MnIG9iamVjdCwgTUlOLVZFUlNJT04gaXMgaWdub3Jl
ZC4iCiAgKGNvbmQKICAgKChwYWNrYWdlLWRlc2MtcCBwYWNrYWdlKQogICAgKGxldCAoKGRpciAo
cGFja2FnZS1kZXNjLWRpciBwYWNrYWdlKSkpCiAgICAgICAgKGFuZCAoc3RyaW5ncCBkaXIpCiAg
ICAgICAgICAgICAoZmlsZS1leGlzdHMtcCBkaXIpKSkpCiAgICgoYW5kIChub3QgcGFja2FnZS0t
aW5pdGlhbGl6ZWQpCiAgICAgICAgIChudWxsIG1pbi12ZXJzaW9uKQogICAgICAgICBwYWNrYWdl
LWFjdGl2YXRlZC1saXN0KQogICAgOzsgV2UgdXNlZCB0aGUgcXVpY2tzdGFydDogbWFrZSBpdCBw
b3NzaWJsZSB0byB1c2UgcGFja2FnZS1pbnN0YWxsZWQtcAogICAgOzsgZXZlbiBiZWZvcmUgcGFj
a2FnZSBpcyBmdWxseSBpbml0aWFsaXplZC4KICAgIChvcgogICAgIChtZW1xIHBhY2thZ2UgcGFj
a2FnZS1hY3RpdmF0ZWQtbGlzdCkKICAgICA7OyBBbHNvIGNoZWNrIGJ1aWx0LWluIHBhY2thZ2Vz
LgogICAgIChwYWNrYWdlLWJ1aWx0LWluLXAgcGFja2FnZSBtaW4tdmVyc2lvbikpKQogICAodAog
ICAgKG9yCiAgICAgKGxldCAoKHBrZy1kZXNjcyAoY2RyIChhc3NxIHBhY2thZ2UgKHBhY2thZ2Ut
LWFsaXN0KSkpKSkKICAgICAgIChhbmQgcGtnLWRlc2NzCiAgICAgICAgICAgICh2ZXJzaW9uLWxp
c3QtPD0gbWluLXZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1k
ZXNjLXZlcnNpb24gKGNhciBwa2ctZGVzY3MpKSkpKQogICAgIDs7IEFsc28gY2hlY2sgYnVpbHQt
aW4gcGFja2FnZXMuCiAgICAgKHBhY2thZ2UtYnVpbHQtaW4tcCBwYWNrYWdlIG1pbi12ZXJzaW9u
KSkpKSkKCihkZWZ1biBwYWNrYWdlLWRvd25sb2FkLXRyYW5zYWN0aW9uIChwYWNrYWdlcykKICAi
RG93bmxvYWQgYW5kIGluc3RhbGwgYWxsIHRoZSBwYWNrYWdlcyBpbiBQQUNLQUdFUy4KUEFDS0FH
RVMgc2hvdWxkIGJlIGEgbGlzdCBvZiBgcGFja2FnZS1kZXNjJy4KVGhpcyBmdW5jdGlvbiBhc3N1
bWVzIHRoYXQgYWxsIHBhY2thZ2UgcmVxdWlyZW1lbnRzIGluClBBQ0tBR0VTIGFyZSBzYXRpc2Zp
ZWQsIGkuZS4gdGhhdCBQQUNLQUdFUyBpcyBjb21wdXRlZAp1c2luZyBgcGFja2FnZS1jb21wdXRl
LXRyYW5zYWN0aW9uJy4iCiAgKG1hcGMgIydwYWNrYWdlLWluc3RhbGwtZnJvbS1hcmNoaXZlIHBh
Y2thZ2VzKSkKCihkZWZ1biBwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFsaXplICgpCiAgIk1ha2Ug
c3VyZSB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgYW5kIHJlbW90ZSBwYWNrYWdlcyBhcmUgaW5pdGlh
bGl6ZWQuIgogICh1bmxlc3MgcGFja2FnZS0taW5pdGlhbGl6ZWQKICAgIChwYWNrYWdlLWluaXRp
YWxpemUgdCkpCiAgKHVubGVzcyBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMKICAgIChwYWNrYWdl
LXJlZnJlc2gtY29udGVudHMpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLWluc3Rh
bGwgKHBrZyAmb3B0aW9uYWwgZG9udC1zZWxlY3QpCiAgIkluc3RhbGwgdGhlIHBhY2thZ2UgUEtH
LgpQS0cgY2FuIGJlIGEgYHBhY2thZ2UtZGVzYycgb3IgYSBzeW1ib2wgbmFtaW5nIG9uZSBvZiB0
aGUKYXZhaWxhYmxlIHBhY2thZ2VzIGluIGFuIGFyY2hpdmUgaW4gYHBhY2thZ2UtYXJjaGl2ZXMn
LiAgV2hlbgpjYWxsZWQgaW50ZXJhY3RpdmVseSwgcHJvbXB0IGZvciB0aGUgcGFja2FnZSBuYW1l
LgoKTWFyayB0aGUgaW5zdGFsbGVkIHBhY2thZ2UgYXMgc2VsZWN0ZWQgYnkgYWRkaW5nIGl0IHRv
CmBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJy4KCldoZW4gY2FsbGVkIGZyb20gTGlzcCBhbmQg
b3B0aW9uYWwgYXJndW1lbnQgRE9OVC1TRUxFQ1QgaXMKbm9uLW5pbCwgaW5zdGFsbCB0aGUgcGFj
a2FnZSBidXQgZG8gbm90IGFkZCBpdCB0bwpgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcycuCgpJ
ZiBQS0cgaXMgYSBgcGFja2FnZS1kZXNjJyBhbmQgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIGRv
bid0IHRyeQp0byBpbnN0YWxsIGl0IGJ1dCBzdGlsbCBtYXJrIGl0IGFzIHNlbGVjdGVkLiIKICAo
aW50ZXJhY3RpdmUKICAgKHByb2duCiAgICAgOzsgSW5pdGlhbGl6ZSB0aGUgcGFja2FnZSBzeXN0
ZW0gdG8gZ2V0IHRoZSBsaXN0IG9mIHBhY2thZ2UKICAgICA7OyBzeW1ib2xzIGZvciBjb21wbGV0
aW9uLgogICAgIChwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFsaXplKQogICAgIChsaXN0IChpbnRl
cm4gKGNvbXBsZXRpbmctcmVhZAogICAgICAgICAgICAgICAgICAgICJJbnN0YWxsIHBhY2thZ2U6
ICIKICAgICAgICAgICAgICAgICAgICAoZGVscSBuaWwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAobWFwY2FyIChsYW1iZGEgKGVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHVubGVzcyAocGFja2FnZS1pbnN0YWxsZWQtcCAoY2FyIGVsdCkpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC1uYW1lIChjYXIgZWx0KSkpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkKICAg
ICAgICAgICAgICAgICAgICBuaWwgdCkpCiAgICAgICAgICAgbmlsKSkpCiAgKHBhY2thZ2UtLWFy
Y2hpdmVzLWluaXRpYWxpemUpCiAgKGFkZC1ob29rICdwb3N0LWNvbW1hbmQtaG9vayAjJ3BhY2th
Z2UtbWVudS0tcG9zdC1yZWZyZXNoKQogIChsZXQgKChuYW1lIChpZiAocGFja2FnZS1kZXNjLXAg
cGtnKQogICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtnKQogICAgICAgICAg
ICAgICAgcGtnKSkpCiAgICAodW5sZXNzIChvciBkb250LXNlbGVjdCAocGFja2FnZS0tdXNlci1z
ZWxlY3RlZC1wIG5hbWUpKQogICAgICAocGFja2FnZS0tc2F2ZS1zZWxlY3RlZC1wYWNrYWdlcwog
ICAgICAgKGNvbnMgbmFtZSBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkpCiAgICAoaWYtbGV0
KiAoKHRyYW5zYWN0aW9uCiAgICAgICAgICAgICAgIChpZiAocGFja2FnZS1kZXNjLXAgcGtnKQog
ICAgICAgICAgICAgICAgICAgKHVubGVzcyAocGFja2FnZS1pbnN0YWxsZWQtcCBwa2cpCiAgICAg
ICAgICAgICAgICAgICAgIChwYWNrYWdlLWNvbXB1dGUtdHJhbnNhY3Rpb24gKGxpc3QgcGtnKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdl
LWRlc2MtcmVxcyBwa2cpKSkKICAgICAgICAgICAgICAgICAocGFja2FnZS1jb21wdXRlLXRyYW5z
YWN0aW9uICgpIChsaXN0IChsaXN0IHBrZykpKSkpKQogICAgICAgIChwcm9nbgogICAgICAgICAg
KHBhY2thZ2UtZG93bmxvYWQtdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24pCiAgICAgICAgICAocGFj
a2FnZS0tcXVpY2tzdGFydC1tYXliZS1yZWZyZXNoKQogICAgICAgICAgKG1lc3NhZ2UgICJQYWNr
YWdlIGAlcycgaW5zdGFsbGVkLiIgbmFtZSkpCiAgICAgIChtZXNzYWdlICJgJXMnIGlzIGFscmVh
ZHkgaW5zdGFsbGVkIiBuYW1lKSkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gcGFja2FnZS12Yy11cGRh
dGUgInBhY2thZ2UtdmMiIChwa2cpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtdXBk
YXRlIChuYW1lKQogICJVcGRhdGUgcGFja2FnZSBOQU1FIGlmIGEgbmV3ZXIgdmVyc2lvbiBleGlz
dHMuIgogIChpbnRlcmFjdGl2ZQogICAobGlzdCAoY29tcGxldGluZy1yZWFkCiAgICAgICAgICAi
VXBkYXRlIHBhY2thZ2U6ICIgKHBhY2thZ2UtLXVwZGF0ZWFibGUtcGFja2FnZXMpIG5pbCB0KSkp
CiAgKGxldCogKChwYWNrYWdlIChpZiAoc3ltYm9scCBuYW1lKQogICAgICAgICAgICAgICAgICAg
ICAgbmFtZQogICAgICAgICAgICAgICAgICAgIChpbnRlcm4gbmFtZSkpKQogICAgICAgICAocGtn
LWRlc2MgKGNhZHIgKGFzc3EgcGFja2FnZSBwYWNrYWdlLWFsaXN0KSkpKQogICAgKGlmIChwYWNr
YWdlLXZjLXAgcGtnLWRlc2MpCiAgICAgICAgKHBhY2thZ2UtdmMtdXBkYXRlIHBrZy1kZXNjKQog
ICAgICAocGFja2FnZS1kZWxldGUgcGtnLWRlc2MgJ2ZvcmNlKQogICAgICAocGFja2FnZS1pbnN0
YWxsIHBhY2thZ2UgJ2RvbnQtc2VsZWN0KSkpKQoKKGRlZnVuIHBhY2thZ2UtLXVwZGF0ZWFibGUt
cGFja2FnZXMgKCkKICA7OyBJbml0aWFsaXplIHRoZSBwYWNrYWdlIHN5c3RlbSB0byBnZXQgdGhl
IGxpc3Qgb2YgcGFja2FnZQogIDs7IHN5bWJvbHMgZm9yIGNvbXBsZXRpb24uCiAgKHBhY2thZ2Ut
LWFyY2hpdmVzLWluaXRpYWxpemUpCiAgKG1hcGNhcgogICAjJ2NhcgogICAoc2VxLWZpbHRlcgog
ICAgKGxhbWJkYSAoZWx0KQogICAgICAob3IgKGxldCAoKGF2YWlsYWJsZQogICAgICAgICAgICAg
ICAgIChhc3NxIChjYXIgZWx0KSBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMpKSkKICAgICAgICAg
ICAgKGFuZCBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAodmVyc2lvbi1saXN0LTwKICAgICAg
ICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIChjYWRyIGVsdCkpCiAgICAgICAgICAg
ICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiAoY2FkciBhdmFpbGFibGUpKSkpKQogICAgICAg
ICAgKHBhY2thZ2UtdmMtcCAoY2FkciAoYXNzcSAoY2FyIGVsdCkgcGFja2FnZS1hbGlzdCkpKSkp
CiAgICBwYWNrYWdlLWFsaXN0KSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS11cGRh
dGUtYWxsICgmb3B0aW9uYWwgcXVlcnkpCiAgIlJlZnJlc2ggcGFja2FnZSBsaXN0IGFuZCB1cGdy
YWRlIGFsbCBwYWNrYWdlcy4KSWYgUVVFUlksIGFzayB0aGUgdXNlciBiZWZvcmUgdXBkYXRpbmcg
cGFja2FnZXMuICBXaGVuIGNhbGxlZAppbnRlcmFjdGl2ZWx5LCBRVUVSWSBpcyBhbHdheXMgdHJ1
ZS4iCiAgKGludGVyYWN0aXZlIChsaXN0IChub3Qgbm9uaW50ZXJhY3RpdmUpKSkKICAocGFja2Fn
ZS1yZWZyZXNoLWNvbnRlbnRzKQogIChsZXQgKCh1cGRhdGVhYmxlIChwYWNrYWdlLS11cGRhdGVh
YmxlLXBhY2thZ2VzKSkpCiAgICAoaWYgKG5vdCB1cGRhdGVhYmxlKQogICAgICAgIChtZXNzYWdl
ICJObyBwYWNrYWdlcyB0byB1cGRhdGUiKQogICAgICAod2hlbiAoYW5kIHF1ZXJ5CiAgICAgICAg
ICAgICAgICAgKG5vdCAoeWVzLW9yLW5vLXAKICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGxl
bmd0aD0gdXBkYXRlYWJsZSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiT25lIHBhY2th
Z2UgdG8gdXBkYXRlLiAgRG8gaXQ/ICIKICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQg
IiVzIHBhY2thZ2VzIHRvIHVwZGF0ZS4gIERvIGl0PyIKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGxlbmd0aCB1cGRhdGVhYmxlKSkpKSkpCiAgICAgICAgKHVzZXItZXJyb3IgIlVw
ZGF0aW5nIGFib3J0ZWQiKSkKICAgICAgKG1hcGMgIydwYWNrYWdlLXVwZGF0ZSB1cGRhdGVhYmxl
KSkpKQoKKGRlZnVuIHBhY2thZ2UtLWRlcGVuZGVuY2llcyAocGtnKQogICJSZXR1cm4gYSBsaXN0
IG9mIGFsbCBkZXBlbmRlbmNpZXMgUEtHIGhhcy4KVGhpcyBpcyBkb25lIHJlY3Vyc2l2ZWx5LiIK
ICA7OyBDYW4gd2UgaGF2ZSBjaXJjdWxhciBkZXBlbmRlbmNpZXM/ICBBc3N1bWUgIm5vcGUiLgog
ICh3aGVuLWxldCogKChkZXNjIChjYWRyIChhc3NxIHBrZyBwYWNrYWdlLWFyY2hpdmUtY29udGVu
dHMpKSkKICAgICAgICAgICAgICAoZGVwcyAobWFwY2FyICMnY2FyIChwYWNrYWdlLWRlc2MtcmVx
cyBkZXNjKSkpKQogICAgKGRlbGV0ZS1kdXBzIChhcHBseSAjJ25jb25jIGRlcHMgKG1hcGNhciAj
J3BhY2thZ2UtLWRlcGVuZGVuY2llcyBkZXBzKSkpKSkKCihkZWZ1biBwYWNrYWdlLXN0cmlwLXJj
cy1pZCAoc3RyKQogICJTdHJpcCBSQ1MgdmVyc2lvbiBJRCBmcm9tIHRoZSB2ZXJzaW9uIHN0cmlu
ZyBTVFIuCklmIHRoZSByZXN1bHQgbG9va3MgbGlrZSBhIGRvdHRlZCBudW1lcmljIHZlcnNpb24s
IHJldHVybiBpdC4KT3RoZXJ3aXNlIHJldHVybiBuaWwuIgogICh3aGVuIHN0cgogICAgKHdoZW4g
KHN0cmluZy1tYXRjaCAiXFxgWyBcdF0qWyRdUmV2aXNpb246WyBcdF0rIiBzdHIpCiAgICAgIChz
ZXRxIHN0ciAoc3Vic3RyaW5nIHN0ciAobWF0Y2gtZW5kIDApKSkpCiAgICAobGV0ICgobCAodmVy
c2lvbi10by1saXN0IHN0cikpKQogICAgICA7OyBEb24ndCByZXR1cm4gYHN0cicgYnV0IChwYWNr
YWdlLXZlcnNpb24tam9pbiAodmVyc2lvbi10by1saXN0IHN0cikpCiAgICAgIDs7IHRvIG1ha2Ug
c3VyZSB3ZSB1c2UgYSAiY2Fub25pY2FsIG5hbWUiIQogICAgICAoaWYgbCAocGFja2FnZS12ZXJz
aW9uLWpvaW4gbCkpKSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1pbnN0YWxsLWZy
b20tYnVmZmVyICgpCiAgIkluc3RhbGwgYSBwYWNrYWdlIGZyb20gdGhlIGN1cnJlbnQgYnVmZmVy
LgpUaGUgY3VycmVudCBidWZmZXIgaXMgYXNzdW1lZCB0byBiZSBhIHNpbmdsZSAuZWwgb3IgLnRh
ciBmaWxlIG9yCmEgZGlyZWN0b3J5LiAgVGhlc2UgbXVzdCBmb2xsb3cgdGhlIHBhY2thZ2luZyBn
dWlkZWxpbmVzIChzZWUKaW5mbyBub2RlIGAoZWxpc3ApUGFja2FnaW5nJykuCgpTcGVjaWFsbHks
IGlmIGN1cnJlbnQgYnVmZmVyIGlzIGEgZGlyZWN0b3J5LCB0aGUgLXBrZy5lbApkZXNjcmlwdGlv
biBmaWxlIGlzIG5vdCBtYW5kYXRvcnksIGluIHdoaWNoIGNhc2UgdGhlIGluZm9ybWF0aW9uCmlz
IGRlcml2ZWQgZnJvbSB0aGUgbWFpbiAuZWwgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LgoKRG93bmxv
YWRzIGFuZCBpbnN0YWxscyByZXF1aXJlZCBwYWNrYWdlcyBhcyBuZWVkZWQuIgogIChpbnRlcmFj
dGl2ZSkKICAobGV0KiAoKHBrZy1kZXNjCiAgICAgICAgICAoY29uZAogICAgICAgICAgICAoKGRl
cml2ZWQtbW9kZS1wICdkaXJlZC1tb2RlKQogICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgb25s
eSB3YXkgYSBwYWNrYWdlLWRlc2Mgb2JqZWN0IHdpdGggYSBgZGlyJwogICAgICAgICAgICAgOzsg
ZGVzYy1raW5kIGNhbiBiZSBjcmVhdGVkLiAgU3VjaCBwYWNrYWdlcyBjYW4ndCBiZQogICAgICAg
ICAgICAgOzsgdXBsb2FkZWQgb3IgaW5zdGFsbGVkIGZyb20gYXJjaGl2ZXMsIHRoZXkgY2FuIG9u
bHkgYmUKICAgICAgICAgICAgIDs7IGluc3RhbGxlZCBmcm9tIGxvY2FsIGJ1ZmZlcnMgb3IgZGly
ZWN0b3JpZXMuCiAgICAgICAgICAgICAocGFja2FnZS1kaXItaW5mbykpCiAgICAgICAgICAgICgo
ZGVyaXZlZC1tb2RlLXAgJ3Rhci1tb2RlKQogICAgICAgICAgICAgKHBhY2thZ2UtdGFyLWZpbGUt
aW5mbykpCiAgICAgICAgICAgICh0CiAgICAgICAgICAgICA7OyBQYWNrYWdlIGhlYWRlcnMgc2hv
dWxkIGJlIHBhcnNlZCBmcm9tIGRlY29kZWQgdGV4dAogICAgICAgICAgICAgOzsgKHNlZSBCdWcj
NDgxMzcpIHdoZXJlIHBvc3NpYmxlLgogICAgICAgICAgICAgKGlmIChhbmQgKGVxIGJ1ZmZlci1m
aWxlLWNvZGluZy1zeXN0ZW0gJ25vLWNvbnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICBi
dWZmZXItZmlsZS1uYW1lKQogICAgICAgICAgICAgICAgIChsZXQqICgocGFja2FnZS1idWZmZXIg
KGN1cnJlbnQtYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgKGRlY29kaW5nLXN5c3Rl
bQogICAgICAgICAgICAgICAgICAgICAgICAgKGNhciAoZmluZC1vcGVyYXRpb24tY29kaW5nLXN5
c3RlbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc2VydC1maWxlLWNvbnRlbnRz
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyBidWZmZXItZmlsZS1uYW1lCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLWJ1ZmZlcikpKSkpCiAg
ICAgICAgICAgICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAo
aW5zZXJ0LWJ1ZmZlci1zdWJzdHJpbmcgcGFja2FnZS1idWZmZXIpCiAgICAgICAgICAgICAgICAg
ICAgIChkZWNvZGUtY29kaW5nLXJlZ2lvbiAocG9pbnQtbWluKSAocG9pbnQtbWF4KQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rpbmctc3lzdGVtKQogICAg
ICAgICAgICAgICAgICAgICAocGFja2FnZS1idWZmZXItaW5mbykpKQoKICAgICAgICAgICAgICAg
KHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgKHBhY2thZ2UtYnVmZmVyLWluZm8pKSkp
KSkKICAgICAgICAgKG5hbWUgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKSkpCiAgICA7OyBE
b3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzLgogICAgKGxldCogKChyZXF1aXJl
cyAocGFja2FnZS1kZXNjLXJlcXMgcGtnLWRlc2MpKQogICAgICAgICAgICh0cmFuc2FjdGlvbiAo
cGFja2FnZS1jb21wdXRlLXRyYW5zYWN0aW9uIG5pbCByZXF1aXJlcykpKQogICAgICAocGFja2Fn
ZS1kb3dubG9hZC10cmFuc2FjdGlvbiB0cmFuc2FjdGlvbikpCiAgICA7OyBJbnN0YWxsIHRoZSBw
YWNrYWdlIGl0c2VsZi4KICAgIChwYWNrYWdlLXVucGFjayBwa2ctZGVzYykKICAgICh1bmxlc3Mg
KHBhY2thZ2UtLXVzZXItc2VsZWN0ZWQtcCBuYW1lKQogICAgICAocGFja2FnZS0tc2F2ZS1zZWxl
Y3RlZC1wYWNrYWdlcwogICAgICAgKGNvbnMgbmFtZSBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2Vz
KSkpCiAgICAocGFja2FnZS0tcXVpY2tzdGFydC1tYXliZS1yZWZyZXNoKQogICAgcGtnLWRlc2Mp
KQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtaW5zdGFsbC1maWxlIChmaWxlKQogICJJ
bnN0YWxsIGEgcGFja2FnZSBmcm9tIEZJTEUuClRoZSBmaWxlIGNhbiBlaXRoZXIgYmUgYSB0YXIg
ZmlsZSwgYW4gRW1hY3MgTGlzcCBmaWxlLCBvciBhCmRpcmVjdG9yeS4iCiAgKGludGVyYWN0aXZl
ICJmUGFja2FnZSBmaWxlIG5hbWU6ICIpCiAgKHdpdGgtdGVtcC1idWZmZXIKICAgIChpZiAoZmls
ZS1kaXJlY3RvcnktcCBmaWxlKQogICAgICAgIChwcm9nbgogICAgICAgICAgKHNldHEgZGVmYXVs
dC1kaXJlY3RvcnkgZmlsZSkKICAgICAgICAgIChkaXJlZC1tb2RlKSkKICAgICAgKGluc2VydC1m
aWxlLWNvbnRlbnRzLWxpdGVyYWxseSBmaWxlKQogICAgICAoc2V0LXZpc2l0ZWQtZmlsZS1uYW1l
IGZpbGUpCiAgICAgIChzZXQtYnVmZmVyLW1vZGlmaWVkLXAgbmlsKQogICAgICAod2hlbiAoc3Ry
aW5nLW1hdGNoICJcXC50YXJcXCciIGZpbGUpICh0YXItbW9kZSkpKQogICAgKHBhY2thZ2UtaW5z
dGFsbC1mcm9tLWJ1ZmZlcikpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtaW5zdGFs
bC1zZWxlY3RlZC1wYWNrYWdlcyAoJm9wdGlvbmFsIG5vY29uZmlybSkKICAiRW5zdXJlIHBhY2th
Z2VzIGluIGBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBhcmUgaW5zdGFsbGVkLgpJZiBzb21l
IHBhY2thZ2VzIGFyZSBub3QgaW5zdGFsbGVkLCBwcm9wb3NlIHRvIGluc3RhbGwgdGhlbS4KSWYg
b3B0aW9uYWwgYXJndW1lbnQgTk9DT05GSVJNIGlzIG5vbi1uaWwsIGRvbid0IGFzayBmb3IKY29u
ZmlybWF0aW9uIHRvIGluc3RhbGwgcGFja2FnZXMuIgogIChpbnRlcmFjdGl2ZSkKICAocGFja2Fn
ZS0tYXJjaGl2ZXMtaW5pdGlhbGl6ZSkKICA7OyBXZSBkb24ndCBuZWVkIHRvIHBvcHVsYXRlIGBw
YWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBiZWZvcmUKICA7OyB1c2luZyBoZXJlLCBiZWNhdXNl
IHRoZSBvdXRjb21lIGlzIHRoZSBzYW1lIGVpdGhlciB3YXkgKG5vdGhpbmcKICA7OyBnZXRzIGlu
c3RhbGxlZCkuCiAgKGlmIChub3QgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcykKICAgICAgKG1l
c3NhZ2UgImBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBpcyBlbXB0eSwgbm90aGluZyB0byBp
bnN0YWxsIikKICAgIChsZXQqICgobm90LWluc3RhbGxlZCAoc2VxLXJlbW92ZSAjJ3BhY2thZ2Ut
aW5zdGFsbGVkLXAgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcykpCiAgICAgICAgICAgKGF2YWls
YWJsZSAoc2VxLWZpbHRlciAobGFtYmRhIChwKSAoYXNzcSBwIHBhY2thZ2UtYXJjaGl2ZS1jb250
ZW50cykpIG5vdC1pbnN0YWxsZWQpKQogICAgICAgICAgIChkaWZmZXJlbmNlICgtIChsZW5ndGgg
bm90LWluc3RhbGxlZCkgKGxlbmd0aCBhdmFpbGFibGUpKSkpCiAgICAgIChjb25kCiAgICAgICAo
YXZhaWxhYmxlCiAgICAgICAgKHdoZW4gKG9yIG5vY29uZmlybQogICAgICAgICAgICAgICAgICAo
eS1vci1uLXAKICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIlBhY2thZ2VzIHRvIGluc3RhbGw6
ICVkICglcyksIHByb2NlZWQ/ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCBh
dmFpbGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgIydzeW1ib2wt
bmFtZSBhdmFpbGFibGUgIiAiKSkpKQogICAgICAgICAgKG1hcGMgKGxhbWJkYSAocCkgKHBhY2th
Z2UtaW5zdGFsbCBwICdkb250LXNlbGVjdCkpIGF2YWlsYWJsZSkpKQogICAgICAgKCg+IGRpZmZl
cmVuY2UgMCkKICAgICAgICAobWVzc2FnZSAoc3Vic3RpdHV0ZS1jb21tYW5kLWtleXMKICAgICAg
ICAgICAgICAgICAgIlBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGU6ICVkICh0aGUgcmVz
dCBpcyBhbHJlYWR5IFwKaW5zdGFsbGVkKSwgbWF5YmUgeW91IG5lZWQgdG8gXFxbcGFja2FnZS1y
ZWZyZXNoLWNvbnRlbnRzXSIpCiAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZSkpCiAgICAgICAo
dAogICAgICAgIChtZXNzYWdlICJBbGwgeW91ciBwYWNrYWdlcyBhcmUgYWxyZWFkeSBpbnN0YWxs
ZWQiKSkpKSkpCgoMCjs7OyBQYWNrYWdlIERlbGV0aW9uCgooZGVmdW4gcGFja2FnZS0tbmV3ZXN0
LXAgKHBrZykKICAiUmV0dXJuIG5vbi1uaWwgaWYgUEtHIGlzIHRoZSBuZXdlc3QgcGFja2FnZSB3
aXRoIGl0cyBuYW1lLiIKICAoZXF1YWwgKGNhZHIgKGFzc3EgKHBhY2thZ2UtZGVzYy1uYW1lIHBr
ZykgcGFja2FnZS1hbGlzdCkpCiAgICAgICAgIHBrZykpCgooZGVjbGFyZS1mdW5jdGlvbiBjb21w
LWVsLXRvLWVsbi1maWxlbmFtZSAiY29tcC5jIikKKGRlZnZhciBwYWNrYWdlLXZjLXJlcG9zaXRv
cnktc3RvcmUpCihkZWZ1biBwYWNrYWdlLS1kZWxldGUtZGlyZWN0b3J5IChkaXIpCiAgIkRlbGV0
ZSBQS0ctREVTQyBkaXJlY3RvcnkgRElSIHJlY3Vyc2l2ZWx5LgpDbGVhbi11cCB0aGUgY29ycmVz
cG9uZGluZyAuZWxuIGZpbGVzIGlmIEVtYWNzIGlzIG5hdGl2ZQpjb21waWxlZC4iCiAgKHdoZW4g
KGZlYXR1cmVwICduYXRpdmUtY29tcGlsZSkKICAgIChjbC1sb29wCiAgICAgZm9yIGZpbGUgaW4g
KGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseSBkaXIgIlxcLmVsXFwnIikKICAgICBkbyAoY29t
cC1jbGVhbi11cC1zdGFsZS1lbG4gKGNvbXAtZWwtdG8tZWxuLWZpbGVuYW1lIGZpbGUpKSkpCiAg
KGlmIChmaWxlLXN5bWxpbmstcCAoZGlyZWN0b3J5LWZpbGUtbmFtZSBkaXIpKQogICAgICAoZGVs
ZXRlLWZpbGUgKGRpcmVjdG9yeS1maWxlLW5hbWUgZGlyKSkKICAgIChkZWxldGUtZGlyZWN0b3J5
IGRpciB0KSkpCgoKKGRlZnVuIHBhY2thZ2UtZGVsZXRlIChwa2ctZGVzYyAmb3B0aW9uYWwgZm9y
Y2Ugbm9zYXZlKQogICJEZWxldGUgcGFja2FnZSBQS0ctREVTQy4KCkFyZ3VtZW50IFBLRy1ERVND
IGlzIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBwYWNrYWdlIGFzIHZlY3Rvci4KSW50ZXJhY3RpdmVs
eSwgcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uLgoKV2hl
biBwYWNrYWdlIGlzIHVzZWQgZWxzZXdoZXJlIGFzIGRlcGVuZGVuY3kgb2YgYW5vdGhlciBwYWNr
YWdlLApyZWZ1c2UgZGVsZXRpbmcgaXQgYW5kIHJldHVybiBhbiBlcnJvci4KSWYgcHJlZml4IGFy
Z3VtZW50IEZPUkNFIGlzIG5vbi1uaWwsIHBhY2thZ2Ugd2lsbCBiZSBkZWxldGVkIGV2ZW4KaWYg
aXQgaXMgdXNlZCBlbHNld2hlcmUuCklmIE5PU0FWRSBpcyBub24tbmlsLCB0aGUgcGFja2FnZSBp
cyBub3QgcmVtb3ZlZCBmcm9tCmBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJy4iCiAgKGludGVy
YWN0aXZlCiAgIChwcm9nbgogICAgIChsZXQqICgocGFja2FnZS10YWJsZQogICAgICAgICAgICAg
KG1hcGNhcgogICAgICAgICAgICAgIChsYW1iZGEgKHApIChjb25zIChwYWNrYWdlLWRlc2MtZnVs
bC1uYW1lIHApIHApKQogICAgICAgICAgICAgIChkZWxxIG5pbAogICAgICAgICAgICAgICAgICAg
IChtYXBjYXIgKGxhbWJkYSAocCkgKHVubGVzcyAocGFja2FnZS1idWlsdC1pbi1wIHApIHApKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnYXBwZW5kIChtYXBjYXIgIydjZHIg
KHBhY2thZ2UtLWFsaXN0KSkpKSkpKQogICAgICAgICAgICAocGFja2FnZS1uYW1lIChjb21wbGV0
aW5nLXJlYWQgIkRlbGV0ZSBwYWNrYWdlOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAobWFwY2FyICMnY2FyIHBhY2thZ2UtdGFibGUpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwgdCkpKQogICAgICAgKGxpc3QgKGNkciAo
YXNzb2MgcGFja2FnZS1uYW1lIHBhY2thZ2UtdGFibGUpKQogICAgICAgICAgICAgY3VycmVudC1w
cmVmaXgtYXJnIG5pbCkpKSkKICAobGV0ICgoZGlyIChwYWNrYWdlLWRlc2MtZGlyIHBrZy1kZXNj
KSkKICAgICAgICAobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgIHBr
Zy11c2VkLWVsc2V3aGVyZS1ieSkKICAgIDs7IElmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkZWxl
dGUgdGhpcyBwYWNrYWdlLCB0aGV5IGRlZmluaXRlbHkKICAgIDs7IGRvbid0IHdhbnQgaXQgbWFy
a2VkIGFzIHNlbGVjdGVkLCBzbyB3ZSByZW1vdmUgaXQgZnJvbQogICAgOzsgYHBhY2thZ2Utc2Vs
ZWN0ZWQtcGFja2FnZXMnIGV2ZW4gaWYgaXQgY2FuJ3QgYmUgZGVsZXRlZC4KICAgICh3aGVuIChh
bmQgKG51bGwgbm9zYXZlKQogICAgICAgICAgICAgICAocGFja2FnZS0tdXNlci1zZWxlY3RlZC1w
IG5hbWUpCiAgICAgICAgICAgICAgIDs7IERvbid0IGRlc2VsZWN0IGlmIHRoaXMgaXMgYW4gb2xk
ZXIgdmVyc2lvbiBvZiBhbgogICAgICAgICAgICAgICA7OyB1cGdyYWRlZCBwYWNrYWdlLgogICAg
ICAgICAgICAgICAocGFja2FnZS0tbmV3ZXN0LXAgcGtnLWRlc2MpKQogICAgICAocGFja2FnZS0t
c2F2ZS1zZWxlY3RlZC1wYWNrYWdlcyAocmVtb3ZlIG5hbWUgcGFja2FnZS1zZWxlY3RlZC1wYWNr
YWdlcykpKQogICAgKGNvbmQgKChub3QgKHN0cmluZy1wcmVmaXgtcCAoZmlsZS1uYW1lLWFzLWRp
cmVjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGFuZC1maWxlLW5h
bWUgcGFja2FnZS11c2VyLWRpcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChl
eHBhbmQtZmlsZS1uYW1lIGRpcikpKQogICAgICAgICAgIDs7IERvbid0IGRlbGV0ZSAic3lzdGVt
IiBwYWNrYWdlcy4KICAgICAgICAgICAoZXJyb3IgIlBhY2thZ2UgYCVzJyBpcyBhIHN5c3RlbSBw
YWNrYWdlLCBub3QgZGVsZXRpbmciCiAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtZnVs
bC1uYW1lIHBrZy1kZXNjKSkpCiAgICAgICAgICAoKGFuZCAobnVsbCBmb3JjZSkKICAgICAgICAg
ICAgICAgIChzZXRxIHBrZy11c2VkLWVsc2V3aGVyZS1ieQogICAgICAgICAgICAgICAgICAgICAg
KHBhY2thZ2UtLXVzZWQtZWxzZXdoZXJlLXAgcGtnLWRlc2MpKSkKICAgICAgICAgICA7OyBEb24n
dCBkZWxldGUgcGFja2FnZXMgdXNlZCBhcyBkZXBlbmRlbmN5IGVsc2V3aGVyZS4KICAgICAgICAg
ICAoZXJyb3IgIlBhY2thZ2UgYCVzJyBpcyB1c2VkIGJ5IGAlcycgYXMgZGVwZW5kZW5jeSwgbm90
IGRlbGV0aW5nIgogICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLWZ1bGwtbmFtZSBwa2ct
ZGVzYykKICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy11c2VkLWVsc2V3
aGVyZS1ieSkpKQogICAgICAgICAgKHQKICAgICAgICAgICAoYWRkLWhvb2sgJ3Bvc3QtY29tbWFu
ZC1ob29rICMncGFja2FnZS1tZW51LS1wb3N0LXJlZnJlc2gpCiAgICAgICAgICAgKHBhY2thZ2Ut
LWRlbGV0ZS1kaXJlY3RvcnkgZGlyKQogICAgICAgICAgIDs7IFJlbW92ZSBOQU1FLVZFUlNJT04u
c2lnbmVkIGFuZCBOQU1FLXJlYWRtZS50eHQgZmlsZXMuCiAgICAgICAgICAgOzsKICAgICAgICAg
ICA7OyBOQU1FLXJlYWRtZS50eHQgZmlsZXMgYXJlIG5vIGxvbmdlciBjcmVhdGVkLCBidXQgdGhl
eQogICAgICAgICAgIDs7IG1heSBiZSBsZWZ0IGFyb3VuZCBmcm9tIGFuIGVhcmxpZXIgaW5zdGFs
bC4KICAgICAgICAgICAoZG9saXN0IChzdWZmaXggJygiLnNpZ25lZCIgInJlYWRtZS50eHQiKSkK
ICAgICAgICAgICAgIChsZXQqICgodmVyc2lvbiAocGFja2FnZS12ZXJzaW9uLWpvaW4gKHBhY2th
Z2UtZGVzYy12ZXJzaW9uIHBrZy1kZXNjKSkpCiAgICAgICAgICAgICAgICAgICAgKGZpbGUgKGNv
bmNhdCAoaWYgKHN0cmluZz0gc3VmZml4ICIuc2lnbmVkIikKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHN1YnN0cmluZyBkaXIgMCAoLSAobGVuZ3RoIHZlcnNpb24pKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdWZmaXgpKSkKICAgICAgICAgICAgICAgKHdoZW4gKGZpbGUtZXhp
c3RzLXAgZmlsZSkKICAgICAgICAgICAgICAgICAoZGVsZXRlLWZpbGUgZmlsZSkpKSkKICAgICAg
ICAgICA7OyBVcGRhdGUgcGFja2FnZS1hbGlzdC4KICAgICAgICAgICAobGV0ICgocGtncyAoYXNz
cSBuYW1lIHBhY2thZ2UtYWxpc3QpKSkKICAgICAgICAgICAgIChkZWxldGUgcGtnLWRlc2MgcGtn
cykKICAgICAgICAgICAgICh1bmxlc3MgKGNkciBwa2dzKQogICAgICAgICAgICAgICAoc2V0cSBw
YWNrYWdlLWFsaXN0IChkZWxxIHBrZ3MgcGFja2FnZS1hbGlzdCkpKSkKICAgICAgICAgICAocGFj
a2FnZS0tcXVpY2tzdGFydC1tYXliZS1yZWZyZXNoKQogICAgICAgICAgIChtZXNzYWdlICJQYWNr
YWdlIGAlcycgZGVsZXRlZC4iCiAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1mdWxs
LW5hbWUgcGtnLWRlc2MpKSkpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLXJlaW5z
dGFsbCAocGtnKQogICJSZWluc3RhbGwgcGFja2FnZSBQS0cuClBLRyBzaG91bGQgYmUgZWl0aGVy
IGEgc3ltYm9sLCB0aGUgcGFja2FnZSBuYW1lLCBvciBhIGBwYWNrYWdlLWRlc2MnCm9iamVjdC4i
CiAgKGludGVyYWN0aXZlCiAgIChwcm9nbgogICAgIChwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFs
aXplKQogICAgIChsaXN0IChpbnRlcm4gKGNvbXBsZXRpbmctcmVhZAogICAgICAgICAgICAgICAg
ICAgICJSZWluc3RhbGwgcGFja2FnZTogIgogICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydz
eW1ib2wtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNhciAjJ2NhciBwYWNr
YWdlLWFsaXN0KSkpKSkpKQogIChwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFsaXplKQogIChwYWNr
YWdlLWRlbGV0ZQogICAoaWYgKHBhY2thZ2UtZGVzYy1wIHBrZykgcGtnIChjYWRyIChhc3NxIHBr
ZyBwYWNrYWdlLWFsaXN0KSkpCiAgICdmb3JjZSAnbm9zYXZlKQogIChwYWNrYWdlLWluc3RhbGwg
cGtnICdkb250LXNlbGVjdCkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1yZWNvbXBp
bGUgKHBrZykKICAiQnl0ZS1jb21waWxlIHBhY2thZ2UgUEtHIGFnYWluLgpQS0cgc2hvdWxkIGJl
IGVpdGhlciBhIHN5bWJvbCwgdGhlIHBhY2thZ2UgbmFtZSwgb3IgYSBgcGFja2FnZS1kZXNjJwpv
YmplY3QuIgogIChpbnRlcmFjdGl2ZSAobGlzdCAoaW50ZXJuIChjb21wbGV0aW5nLXJlYWQKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY29tcGlsZSBwYWNrYWdlOiAiCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydzeW1ib2wtbmFtZQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydjYXIgcGFja2FnZS1hbGlzdCkpKSkp
KQogIChsZXQgKChwa2ctZGVzYyAoaWYgKHBhY2thZ2UtZGVzYy1wIHBrZykKICAgICAgICAgICAg
ICAgICAgICAgIHBrZwogICAgICAgICAgICAgICAgICAgIChjYWRyIChhc3NxIHBrZyBwYWNrYWdl
LWFsaXN0KSkpKSkKICAgIDs7IERlbGV0ZSB0aGUgb2xkIC5lbGMgZmlsZXMgdG8gZW5zdXJlIHRo
YXQgd2UgZG9uJ3QgaW5hZHZlcnRlbnRseQogICAgOzsgbG9hZCB0aGVtIChpbiBjYXNlIHRoZXkg
Y29udGFpbiBieXRlIGNvZGUvbWFjcm9zIHRoYXQgYXJlIG5vdwogICAgOzsgaW52YWxpZCkuCiAg
ICAoZG9saXN0IChlbGMgKGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseQogICAgICAgICAgICAg
ICAgICAocGFja2FnZS1kZXNjLWRpciBwa2ctZGVzYykgIlxcLmVsY1xcJyIpKQogICAgICAoZGVs
ZXRlLWZpbGUgZWxjKSkKICAgIChwYWNrYWdlLS1jb21waWxlIHBrZy1kZXNjKSkpCgo7OzsjIyNh
dXRvbG9hZAooZGVmdW4gcGFja2FnZS1yZWNvbXBpbGUtYWxsICgpCiAgIkJ5dGUtY29tcGlsZSBh
bGwgaW5zdGFsbGVkIHBhY2thZ2VzLgpUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgb25seSBpbiB0
aGUgY2FzZSB0aGUgYnl0ZS1jb21waWxlZCBmaWxlcwphcmUgaW52YWxpZCBkdWUgdG8gY2hhbmdl
ZCBieXRlLWNvZGUsIG1hY3JvcyBvciB0aGUgbGlrZS4iCiAgKGludGVyYWN0aXZlKQogIChwY2Fz
ZS1kb2xpc3QgKGAoXyAscGtnLWRlc2MpIHBhY2thZ2UtYWxpc3QpCiAgICAocGFja2FnZS1yZWNv
bXBpbGUgcGtnLWRlc2MpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLWF1dG9yZW1v
dmUgKCkKICAiUmVtb3ZlIHBhY2thZ2VzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQuCgpQYWNr
YWdlcyB0aGF0IGFyZSBubyBtb3JlIG5lZWRlZCBieSBvdGhlciBwYWNrYWdlcyBpbgpgcGFja2Fn
ZS1zZWxlY3RlZC1wYWNrYWdlcycgYW5kIHRoZWlyIGRlcGVuZGVuY2llcwp3aWxsIGJlIGRlbGV0
ZWQuIgogIChpbnRlcmFjdGl2ZSkKICA7OyBJZiBgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcycg
aXMgbmlsLCBpdCB3b3VsZCBtYWtlIG5vIHNlbnNlIHRvCiAgOzsgdHJ5IHRvIHBvcHVsYXRlIGl0
IGhlcmUsIGJlY2F1c2UgdGhlbiBgcGFja2FnZS1hdXRvcmVtb3ZlJyB3aWxsCiAgOzsgZG8gYWJz
b2x1dGVseSBub3RoaW5nLgogICh3aGVuIChvciBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzCiAg
ICAgICAgICAgICh5ZXMtb3Itbm8tcAogICAgICAgICAgICAgKGZvcm1hdC1tZXNzYWdlCiAgICAg
ICAgICAgICAgImBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBpcyBlbXB0eSEgUmVhbGx5IHJl
bW92ZSBBTEwgcGFja2FnZXM/ICIpKSkKICAgIChsZXQgKChyZW1vdmFibGUgKHBhY2thZ2UtLXJl
bW92YWJsZS1wYWNrYWdlcykpKQogICAgICAoaWYgcmVtb3ZhYmxlCiAgICAgICAgICAod2hlbiAo
eS1vci1uLXAKICAgICAgICAgICAgICAgICAoZm9ybWF0ICJQYWNrYWdlcyB0byBkZWxldGU6ICVk
ICglcyksIHByb2NlZWQ/ICIKICAgICAgICAgICAgICAgICAgIChsZW5ndGggcmVtb3ZhYmxlKQog
ICAgICAgICAgICAgICAgICAgKG1hcGNvbmNhdCAjJ3N5bWJvbC1uYW1lIHJlbW92YWJsZSAiICIp
KSkKICAgICAgICAgICAgKG1hcGMgKGxhbWJkYSAocCkKICAgICAgICAgICAgICAgICAgICAocGFj
a2FnZS1kZWxldGUgKGNhZHIgKGFzc3EgcCBwYWNrYWdlLWFsaXN0KSkgdCkpCiAgICAgICAgICAg
ICAgICAgIHJlbW92YWJsZSkpCiAgICAgICAgKG1lc3NhZ2UgIk5vdGhpbmcgdG8gYXV0b3JlbW92
ZSIpKSkpKQoKDAo7Ozs7IFBhY2thZ2UgZGVzY3JpcHRpb24gYnVmZmVyLgoKOzs7IyMjYXV0b2xv
YWQKKGRlZnVuIGRlc2NyaWJlLXBhY2thZ2UgKHBhY2thZ2UpCiAgIkRpc3BsYXkgdGhlIGZ1bGwg
ZG9jdW1lbnRhdGlvbiBvZiBQQUNLQUdFIChhIHN5bWJvbCkuIgogIChpbnRlcmFjdGl2ZQogICAo
bGV0KiAoKGd1ZXNzIChvciAoZnVuY3Rpb24tY2FsbGVkLWF0LXBvaW50KQogICAgICAgICAgICAg
ICAgICAgICAoc3ltYm9sLWF0LXBvaW50KSkpKQogICAgIChyZXF1aXJlICdmaW5kZXItaW5mIG5p
bCB0KQogICAgIDs7IExvYWQgdGhlIHBhY2thZ2UgbGlzdCBpZiBuZWNlc3NhcnkgKGJ1dCBkb24n
dCBhY3RpdmF0ZSB0aGVtKS4KICAgICAodW5sZXNzIHBhY2thZ2UtLWluaXRpYWxpemVkCiAgICAg
ICAocGFja2FnZS1pbml0aWFsaXplIHQpKQogICAgIChsZXQgKChwYWNrYWdlcyAoYXBwZW5kICht
YXBjYXIgIydjYXIgcGFja2FnZS1hbGlzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
bWFwY2FyICMnY2FyIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cykKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAobWFwY2FyICMnY2FyIHBhY2thZ2UtLWJ1aWx0aW5zKSkpKQogICAgICAgKHVu
bGVzcyAobWVtcSBndWVzcyBwYWNrYWdlcykKICAgICAgICAgKHNldHEgZ3Vlc3MgbmlsKSkKICAg
ICAgIChzZXRxIHBhY2thZ2VzIChtYXBjYXIgIydzeW1ib2wtbmFtZSBwYWNrYWdlcykpCiAgICAg
ICAobGV0ICgodmFsCiAgICAgICAgICAgICAgKGNvbXBsZXRpbmctcmVhZCAoZm9ybWF0LXByb21w
dCAiRGVzY3JpYmUgcGFja2FnZSIgZ3Vlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYWNrYWdlcyBuaWwgdCBuaWwgbmlsICh3aGVuIGd1ZXNzCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC1uYW1lIGd1ZXNzKSkp
KSkKICAgICAgICAgKGxpc3QgKGFuZCAoPiAobGVuZ3RoIHZhbCkgMCkgKGludGVybiB2YWwpKSkp
KSkpCiAgKGlmIChub3QgKG9yIChwYWNrYWdlLWRlc2MtcCBwYWNrYWdlKSAoYW5kIHBhY2thZ2Ug
KHN5bWJvbHAgcGFja2FnZSkpKSkKICAgICAgKG1lc3NhZ2UgIk5vIHBhY2thZ2Ugc3BlY2lmaWVk
IikKICAgIChoZWxwLXNldHVwLXhyZWYgKGxpc3QgIydkZXNjcmliZS1wYWNrYWdlIHBhY2thZ2Up
CiAgICAgICAgICAgICAgICAgICAgIChjYWxsZWQtaW50ZXJhY3RpdmVseS1wICdpbnRlcmFjdGl2
ZSkpCiAgICAod2l0aC1oZWxwLXdpbmRvdyAoaGVscC1idWZmZXIpCiAgICAgICh3aXRoLWN1cnJl
bnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAogICAgICAgIChkZXNjcmliZS1wYWNrYWdlLTEgcGFj
a2FnZSkpKSkpCgooZGVmZmFjZSBwYWNrYWdlLWhlbHAtc2VjdGlvbi1uYW1lCiAgJygodCA6aW5o
ZXJpdCAoYm9sZCBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkpCiAgIkZhY2UgdXNlZCBv
biBzZWN0aW9uIG5hbWVzIGluIHBhY2thZ2UgZGVzY3JpcHRpb24gYnVmZmVycy4iCiAgOnZlcnNp
b24gIjI1LjEiKQoKKGRlZnVuIHBhY2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbiAobmFtZSAmcmVz
dCBzdHJpbmdzKQogICJQcmludCBcIk5BTUU6IFwiLCByaWdodCBhbGlnbmVkIHRvIHRoZSAxM3Ro
IGNvbHVtbi4KSWYgbW9yZSBTVFJJTkdTIGFyZSBwcm92aWRlZCwgaW5zZXJ0IHRoZW0gZm9sbG93
ZWQgYnkgYSBuZXdsaW5lLgpPdGhlcndpc2Ugbm8gbmV3bGluZSBpcyBpbnNlcnRlZC4iCiAgKGRl
Y2xhcmUgKGluZGVudCAxKSkKICAoaW5zZXJ0IChtYWtlLXN0cmluZyAobWF4IDAgKC0gMTEgKHN0
cmluZy13aWR0aCBuYW1lKSkpID9ccykKICAgICAgICAgIChwcm9wZXJ0aXplIChjb25jYXQgbmFt
ZSAiOiAiKSAnZm9udC1sb2NrLWZhY2UgJ3BhY2thZ2UtaGVscC1zZWN0aW9uLW5hbWUpKQogICh3
aGVuIHN0cmluZ3MKICAgIChhcHBseSAjJ2luc2VydCBzdHJpbmdzKQogICAgKGluc2VydCAiXG4i
KSkpCgooZGVjbGFyZS1mdW5jdGlvbiBsbS1jb21tZW50YXJ5ICJsaXNwLW1udCIgKCZvcHRpb25h
bCBmaWxlKSkKCihkZWZ1biBwYWNrYWdlLS1nZXQtZGVzY3JpcHRpb24gKGRlc2MpCiAgIlJldHVy
biBhIHN0cmluZyBjb250YWluaW5nIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrYWdl
IERFU0MuClRoZSBkZXNjcmlwdGlvbiBpcyByZWFkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdl
IGZpbGVzLiIKICA7OyBJbnN0YWxsZWQgcGFja2FnZXMgaGF2ZSBuaWwgZm9yIGtpbmQsIHNvIHdl
IGxvb2sgZm9yIFJFQURNRQogIDs7IGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byB0aGUgQ29tbWVu
dGFyeSBoZWFkZXIuCgogIDs7IFdlIGRvbuKAmXQgaW5jbHVkZSBSRUFETUUubWQgaGVyZSwgYmVj
YXVzZSB0aGF0IGlzIG9mdGVuIHRoZSBob21lCiAgOzsgcGFnZSBvbiBhIHNpdGUgbGlrZSBnaXRo
dWIsIGFuZCBub3Qgc3VpdGFibGUgYXMgdGhlIHBhY2thZ2UgbG9uZwogIDs7IGRlc2NyaXB0aW9u
LgogIChsZXQgKChmaWxlcyAnKCJSRUFETUUtZWxwYSIgIlJFQURNRS1lbHBhLm1kIiAiUkVBRE1F
IiAiUkVBRE1FLnJzdCIgIlJFQURNRS5vcmciKSkKICAgICAgICBmaWxlCiAgICAgICAgKHNyY2Rp
ciAocGFja2FnZS1kZXNjLWRpciBkZXNjKSkKICAgICAgICByZXN1bHQpCiAgICAod2hpbGUgKGFu
ZCBmaWxlcwogICAgICAgICAgICAgICAgKG5vdCByZXN1bHQpKQogICAgICAoc2V0cSBmaWxlIChw
b3AgZmlsZXMpKQogICAgICAod2hlbiAoZmlsZS1yZWFkYWJsZS1wIChleHBhbmQtZmlsZS1uYW1l
IGZpbGUgc3JjZGlyKSkKICAgICAgICA7OyBGb3VuZCBhIFJFQURNRS4KICAgICAgICAod2l0aC10
ZW1wLWJ1ZmZlcgogICAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIChleHBhbmQtZmlsZS1u
YW1lIGZpbGUgc3JjZGlyKSkKICAgICAgICAgIChzZXRxIHJlc3VsdCAoYnVmZmVyLXN0cmluZykp
KSkpCgogICAgKG9yCiAgICAgcmVzdWx0CgogICAgIDs7IExvb2sgZm9yIENvbW1lbnRhcnkgaGVh
ZGVyLgogICAgIChsbS1jb21tZW50YXJ5IChleHBhbmQtZmlsZS1uYW1lCiAgICAgICAgICAgICAg
ICAgICAgIChmb3JtYXQgIiVzLmVsIiAocGFja2FnZS1kZXNjLW5hbWUgZGVzYykpIHNyY2Rpcikp
CiAgICAgIiIpKSkKCihkZWZ1biBwYWNrYWdlLS1kZXNjcmliZS1hZGQtbGlicmFyeS1saW5rcyAo
KQogICJBZGQgbGlua3MgdG8gbGlicmFyeSBuYW1lcyBpbiBwYWNrYWdlIGRlc2NyaXB0aW9uLiIK
ICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJcXDxcXChbLVs6YWxudW06XV0rXFwuZWxcXClc
XD4iIG5pbCB0KQogICAgKGlmIChsb2NhdGUtbGlicmFyeSAobWF0Y2gtc3RyaW5nIDEpKQogICAg
ICAgIChtYWtlLXRleHQtYnV0dG9uIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICd4cmVmIChtYXRjaC1zdHJpbmctbm8tcHJvcGVydGll
cyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICdoZWxwLWVjaG8gIlJlYWQgdGhpcyBmaWxl
J3MgY29tbWVudGFyeSIKICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSAncGFja2FnZS0t
ZmluZGVyLXhyZWYpKSkpCgooZGVmdW4gZGVzY3JpYmUtcGFja2FnZS0xIChwa2cpCiAgIkluc2Vy
dCB0aGUgcGFja2FnZSBkZXNjcmlwdGlvbiBmb3IgUEtHLgpIZWxwZXIgZnVuY3Rpb24gZm9yIGBk
ZXNjcmliZS1wYWNrYWdlJy4iCiAgKHJlcXVpcmUgJ2xpc3AtbW50KQogIChsZXQqICgoZGVzYyAo
b3IKICAgICAgICAgICAgICAgIChpZiAocGFja2FnZS1kZXNjLXAgcGtnKSBwa2cpCiAgICAgICAg
ICAgICAgICAoY2FkciAoYXNzcSBwa2cgcGFja2FnZS1hbGlzdCkpCiAgICAgICAgICAgICAgICAo
bGV0ICgoYnVpbHQtaW4gKGFzc3EgcGtnIHBhY2thZ2UtLWJ1aWx0aW5zKSkpCiAgICAgICAgICAg
ICAgICAgIChpZiBidWlsdC1pbgogICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLWZyb20t
YnVpbHRpbiBidWlsdC1pbikKICAgICAgICAgICAgICAgICAgICAoY2FkciAoYXNzcSBwa2cgcGFj
a2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkpKSkpCiAgICAgICAgIChuYW1lIChpZiBkZXNjIChwYWNr
YWdlLWRlc2MtbmFtZSBkZXNjKSBwa2cpKQogICAgICAgICAocGtnLWRpciAoaWYgZGVzYyAocGFj
a2FnZS1kZXNjLWRpciBkZXNjKSkpCiAgICAgICAgIChyZXFzIChpZiBkZXNjIChwYWNrYWdlLWRl
c2MtcmVxcyBkZXNjKSkpCiAgICAgICAgIChyZXF1aXJlZC1ieSAoaWYgZGVzYyAocGFja2FnZS0t
dXNlZC1lbHNld2hlcmUtcCBkZXNjIG5pbCAnYWxsKSkpCiAgICAgICAgICh2ZXJzaW9uIChpZiBk
ZXNjIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBkZXNjKSkpCiAgICAgICAgIChhcmNoaXZlIChpZiBk
ZXNjIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSBkZXNjKSkpCiAgICAgICAgIChleHRyYXMgKGFuZCBk
ZXNjIChwYWNrYWdlLWRlc2MtZXh0cmFzIGRlc2MpKSkKICAgICAgICAgKHdlYnNpdGUgKGNkciAo
YXNzb2MgOnVybCBleHRyYXMpKSkKICAgICAgICAgKGNvbW1pdCAoY2RyIChhc3NvYyA6Y29tbWl0
IGV4dHJhcykpKQogICAgICAgICAoa2V5d29yZHMgKGlmIGRlc2MgKHBhY2thZ2UtZGVzYy0ta2V5
d29yZHMgZGVzYykpKQogICAgICAgICAoYnVpbHQtaW4gKGVxIHBrZy1kaXIgJ2J1aWx0aW4pKQog
ICAgICAgICAoaW5zdGFsbGFibGUgKGFuZCBhcmNoaXZlIChub3QgYnVpbHQtaW4pKSkKICAgICAg
ICAgKHN0YXR1cyAoaWYgZGVzYyAocGFja2FnZS1kZXNjLXN0YXR1cyBkZXNjKSAib3JwaGFuIikp
CiAgICAgICAgIChpbmNvbXBhdGlibGUtcmVhc29uIChwYWNrYWdlLS1pbmNvbXBhdGlibGUtcCBk
ZXNjKSkKICAgICAgICAgKHNpZ25lZCAoaWYgZGVzYyAocGFja2FnZS1kZXNjLXNpZ25lZCBkZXNj
KSkpCiAgICAgICAgIChtYWludGFpbmVyIChjZHIgKGFzc29jIDptYWludGFpbmVyIGV4dHJhcykp
KQogICAgICAgICAoYXV0aG9ycyAoY2RyIChhc3NvYyA6YXV0aG9ycyBleHRyYXMpKSkKICAgICAg
ICAgKG5ld3MgKGFuZC1sZXQqIChwa2ctZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgKChu
b3QgYnVpbHQtaW4pKQogICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlIChleHBhbmQtZmls
ZS1uYW1lICJuZXdzIiBwa2ctZGlyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZpbGUt
cmVndWxhci1wIGZpbGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICgoZmlsZS1yZWFkYWJs
ZS1wIGZpbGUpKSkKICAgICAgICAgICAgICAgICBmaWxlKSkpCiAgICAod2hlbiAoc3RyaW5nPSBz
dGF0dXMgImF2YWlsLW9ic28iKQogICAgICAoc2V0cSBzdGF0dXMgImF2YWlsYWJsZSBvYnNvbGV0
ZSIpKQogICAgKHdoZW4gaW5jb21wYXRpYmxlLXJlYXNvbgogICAgICAoc2V0cSBzdGF0dXMgImlu
Y29tcGF0aWJsZSIpKQogICAgKHByaW5jIChmb3JtYXQgIlBhY2thZ2UgJVMgaXMgJXMuXG5cbiIg
bmFtZSBzdGF0dXMpKQoKICAgIDs7IFRPRE86IFJlbW92ZSB0aGUgc3RyaW5nIGRlY29yYXRpb25z
IGFuZCByZWZvcm1hdCB0aGUgc3RyaW5ncwogICAgOzsgZm9yIGZ1dHVyZSBsMTBuLgogICAgKHBh
Y2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbiAiU3RhdHVzIikKICAgIChjb25kIChidWlsdC1pbgog
ICAgICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgKGNhcGl0YWxpemUgc3RhdHVzKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtbG9jay1mYWNlICdwYWNrYWdlLXN0YXR1cy1i
dWlsdC1pbikKICAgICAgICAgICAgICAgICAgICIuIikpCiAgICAgICAgICAocGtnLWRpcgogICAg
ICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgKGlmIChtZW1iZXIgc3RhdHVzICcoInVuc2lnbmVk
IiAiZGVwZW5kZW5jeSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnN0
YWxsZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXBpdGFsaXplIHN0YXR1
cykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1sb2NrLWZhY2UgJ3BhY2th
Z2Utc3RhdHVzLWJ1aWx0LWluKSkKICAgICAgICAgICAoaW5zZXJ0IChzdWJzdGl0dXRlLWNvbW1h
bmQta2V5cyAiIGluIGAiKSkKICAgICAgICAgICAobGV0ICgoZGlyIChhYmJyZXZpYXRlLWZpbGUt
bmFtZQogICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5CiAgICAg
ICAgICAgICAgICAgICAgICAgIChpZiAoZmlsZS1pbi1kaXJlY3RvcnktcCBwa2ctZGlyIHBhY2th
Z2UtdXNlci1kaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZS1yZWxhdGl2ZS1u
YW1lIHBrZy1kaXIgcGFja2FnZS11c2VyLWRpcikKICAgICAgICAgICAgICAgICAgICAgICAgICBw
a2ctZGlyKSkpKSkKICAgICAgICAgICAgIChoZWxwLWluc2VydC14cmVmLWJ1dHRvbiBkaXIgJ2hl
bHAtcGFja2FnZS1kZWYgcGtnLWRpcikpCiAgICAgICAgICAgKGlmIChhbmQgKHBhY2thZ2UtYnVp
bHQtaW4tcCBuYW1lKQogICAgICAgICAgICAgICAgICAgIChub3QgKHBhY2thZ2UtYnVpbHQtaW4t
cCBuYW1lIHZlcnNpb24pKSkKICAgICAgICAgICAgICAgKGluc2VydCAoc3Vic3RpdHV0ZS1jb21t
YW5kLWtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIicsXG4gICAgICAgICAgICAgc2hhZG93
aW5nIGEgIikKICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiYnVpbHQtaW4gcGFj
a2FnZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1sb2NrLWZhY2Ug
J3BhY2thZ2Utc3RhdHVzLWJ1aWx0LWluKSkKICAgICAgICAgICAgIChpbnNlcnQgKHN1YnN0aXR1
dGUtcXVvdGVzICInIikpKQogICAgICAgICAgIChpZiBzaWduZWQKICAgICAgICAgICAgICAgKGlu
c2VydCAiLiIpCiAgICAgICAgICAgICAoaW5zZXJ0ICIgKHVuc2lnbmVkKS4iKSkKICAgICAgICAg
ICAod2hlbiAoYW5kIChwYWNrYWdlLWRlc2MtcCBkZXNjKQogICAgICAgICAgICAgICAgICAgICAg
KG5vdCByZXF1aXJlZC1ieSkKICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgc3RhdHVzICco
InVuc2lnbmVkIiAiaW5zdGFsbGVkIikpKQogICAgICAgICAgICAgKGluc2VydCAiICIpCiAgICAg
ICAgICAgICAocGFja2FnZS1tYWtlLWJ1dHRvbiAiRGVsZXRlIgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJ2FjdGlvbiAjJ3BhY2thZ2UtZGVsZXRlLWJ1dHRvbi1hY3Rpb24KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlLWRlc2MgZGVzYykpKQogICAg
ICAgICAgKGluY29tcGF0aWJsZS1yZWFzb24KICAgICAgICAgICAoaW5zZXJ0IChwcm9wZXJ0aXpl
ICJJbmNvbXBhdGlibGUiICdmb250LWxvY2stZmFjZSBmb250LWxvY2std2FybmluZy1mYWNlKQog
ICAgICAgICAgICAgICAgICAgIiBiZWNhdXNlIGl0IGRlcGVuZHMgb24gIikKICAgICAgICAgICAo
aWYgKHN0cmluZ3AgaW5jb21wYXRpYmxlLXJlYXNvbikKICAgICAgICAgICAgICAgKGluc2VydCAi
RW1hY3MgIiBpbmNvbXBhdGlibGUtcmVhc29uICIuIikKICAgICAgICAgICAgIChpbnNlcnQgInVu
aW5zdGFsbGFibGUgcGFja2FnZXMuIikpKQogICAgICAgICAgKGluc3RhbGxhYmxlCiAgICAgICAg
ICAgKGluc2VydCAoY2FwaXRhbGl6ZSBzdGF0dXMpKQogICAgICAgICAgIChpbnNlcnQgIiBmcm9t
ICIgKGZvcm1hdCAiJXMiIGFyY2hpdmUpKQogICAgICAgICAgIChpbnNlcnQgIiAtLSAiKQogICAg
ICAgICAgIChwYWNrYWdlLW1ha2UtYnV0dG9uCiAgICAgICAgICAgICJJbnN0YWxsIgogICAgICAg
ICAgICAnYWN0aW9uICdwYWNrYWdlLWluc3RhbGwtYnV0dG9uLWFjdGlvbgogICAgICAgICAgICAn
cGFja2FnZS1kZXNjIGRlc2MpKQogICAgICAgICAgKHQgKGluc2VydCAoY2FwaXRhbGl6ZSBzdGF0
dXMpICIuIikpKQogICAgKGluc2VydCAiXG4iKQogICAgKHVubGVzcyAoYW5kIHBrZy1kaXIgKG5v
dCBhcmNoaXZlKSkgOyBJbnN0YWxsZWQgcGtncyBkb24ndCBoYXZlIGFyY2hpdmUuCiAgICAgIChw
YWNrYWdlLS1wcmludC1oZWxwLXNlY3Rpb24gIkFyY2hpdmUiCiAgICAgICAgKG9yIGFyY2hpdmUg
Im4vYSIpKSkKICAgIChhbmQgdmVyc2lvbgogICAgICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1z
ZWN0aW9uICJWZXJzaW9uIgogICAgICAgICAgIChwYWNrYWdlLXZlcnNpb24tam9pbiB2ZXJzaW9u
KSkpCiAgICAod2hlbiBjb21taXQKICAgICAgKHBhY2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbiAi
Q29tbWl0IiBjb21taXQpKQogICAgKHdoZW4gZGVzYwogICAgICAocGFja2FnZS0tcHJpbnQtaGVs
cC1zZWN0aW9uICJTdW1tYXJ5IgogICAgICAgIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBkZXNjKSkp
CgogICAgKHNldHEgcmVxcyAoaWYgZGVzYyAocGFja2FnZS1kZXNjLXJlcXMgZGVzYykpKQogICAg
KHdoZW4gcmVxcwogICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1zZWN0aW9uICJSZXF1aXJlcyIp
CiAgICAgIChsZXQgKChmaXJzdCB0KSkKICAgICAgICAoZG9saXN0IChyZXEgcmVxcykKICAgICAg
ICAgIChsZXQqICgobmFtZSAoY2FyIHJlcSkpCiAgICAgICAgICAgICAgICAgKHZlcnMgKGNhZHIg
cmVxKSkKICAgICAgICAgICAgICAgICAodGV4dCAoZm9ybWF0ICIlcy0lcyIgKHN5bWJvbC1uYW1l
IG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS12ZXJzaW9uLWpv
aW4gdmVycykpKQogICAgICAgICAgICAgICAgIChyZWFzb24gKGlmIChhbmQgKGxpc3RwIGluY29t
cGF0aWJsZS1yZWFzb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzcSBu
YW1lIGluY29tcGF0aWJsZS1yZWFzb24pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIg
KG5vdCBhdmFpbGFibGUpIiAiIikpKQogICAgICAgICAgICAoY29uZCAoZmlyc3QgKHNldHEgZmly
c3QgbmlsKSkKICAgICAgICAgICAgICAgICAgKCg+PSAoKyAyIChjdXJyZW50LWNvbHVtbikgKGxl
bmd0aCB0ZXh0KSAobGVuZ3RoIHJlYXNvbikpCiAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRv
dy13aWR0aCkpCiAgICAgICAgICAgICAgICAgICAoaW5zZXJ0ICIsXG4gICAgICAgICAgICAgICAi
KSkKICAgICAgICAgICAgICAgICAgKHQgKGluc2VydCAiLCAiKSkpCiAgICAgICAgICAgIChoZWxw
LWluc2VydC14cmVmLWJ1dHRvbiB0ZXh0ICdoZWxwLXBhY2thZ2UgbmFtZSkKICAgICAgICAgICAg
KGluc2VydCByZWFzb24pKSkKICAgICAgICAoaW5zZXJ0ICJcbiIpKSkKICAgICh3aGVuIHJlcXVp
cmVkLWJ5CiAgICAgIChwYWNrYWdlLS1wcmludC1oZWxwLXNlY3Rpb24gIlJlcXVpcmVkIGJ5IikK
ICAgICAgKGxldCAoKGZpcnN0IHQpKQogICAgICAgIChkb2xpc3QgKHBrZyByZXF1aXJlZC1ieSkK
ICAgICAgICAgIChsZXQgKCh0ZXh0IChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIHBrZykpKQogICAg
ICAgICAgICAoY29uZCAoZmlyc3QgKHNldHEgZmlyc3QgbmlsKSkKICAgICAgICAgICAgICAgICAg
KCg+PSAoKyAyIChjdXJyZW50LWNvbHVtbikgKGxlbmd0aCB0ZXh0KSkKICAgICAgICAgICAgICAg
ICAgICAgICAod2luZG93LXdpZHRoKSkKICAgICAgICAgICAgICAgICAgIChpbnNlcnQgIixcbiAg
ICAgICAgICAgICAgICIpKQogICAgICAgICAgICAgICAgICAodCAoaW5zZXJ0ICIsICIpKSkKICAg
ICAgICAgICAgKGhlbHAtaW5zZXJ0LXhyZWYtYnV0dG9uIHRleHQgJ2hlbHAtcGFja2FnZQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZykp
KSkKICAgICAgICAoaW5zZXJ0ICJcbiIpKSkKICAgICh3aGVuIHdlYnNpdGUKICAgICAgOzsgUHJl
ZmVyIGh0dHBzIGZvciB0aGUgd2Vic2l0ZSBvZiBwYWNrYWdlcyBvbiBjb21tb24gZG9tYWlucy4K
ICAgICAgKHdoZW4gKHN0cmluZy1tYXRjaC1wIChyeCBib2wgImh0dHA6Ly8iIChvciAiZWxwYS4i
ICJ3d3cuIiAiZ2l0LiIgIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yICJu
b25nbnUub3JnIiAiZ251Lm9yZyIgInNyLmh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiZW1hY3N3aWtpLm9yZyIgImdpdGxhYi5jb20iICJnaXRodWIuY29tIikKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3ZWJzaXRlKQogICAgICAgIDs7IEJ1dCBvbmx5IGlmIHRoZSB1c2VyIGhhcyAiaHR0cHMiIGlu
IGBwYWNrYWdlLWFyY2hpdmVzJy4KICAgICAgICAobGV0ICgoZ251IChjZHIgKGFzc29jICJnbnUi
IHBhY2thZ2UtYXJjaGl2ZXMpKSkpCiAgICAgICAgICAoYW5kIGdudSAoc3RyaW5nLW1hdGNoLXAg
Il5odHRwcyIgZ251KQogICAgICAgICAgICAgICAoc2V0cSB3ZWJzaXRlCiAgICAgICAgICAgICAg
ICAgICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIl5odHRwIiAiaHR0cHMiIHdlYnNpdGUp
KSkpKQogICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1zZWN0aW9uICJXZWJzaXRlIikKICAgICAg
KGhlbHAtaW5zZXJ0LXhyZWYtYnV0dG9uIHdlYnNpdGUgJ2hlbHAtdXJsIHdlYnNpdGUpCiAgICAg
IChpbnNlcnQgIlxuIikpCiAgICAod2hlbiBrZXl3b3JkcwogICAgICAocGFja2FnZS0tcHJpbnQt
aGVscC1zZWN0aW9uICJLZXl3b3JkcyIpCiAgICAgIChkb2xpc3QgKGsga2V5d29yZHMpCiAgICAg
ICAgKHBhY2thZ2UtbWFrZS1idXR0b24KICAgICAgICAgawogICAgICAgICAncGFja2FnZS1rZXl3
b3JkIGsKICAgICAgICAgJ2FjdGlvbiAncGFja2FnZS1rZXl3b3JkLWJ1dHRvbi1hY3Rpb24pCiAg
ICAgICAgKGluc2VydCAiICIpKQogICAgICAoaW5zZXJ0ICJcbiIpKQogICAgKHdoZW4gbWFpbnRh
aW5lcgogICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1zZWN0aW9uICJNYWludGFpbmVyIikKICAg
ICAgKHBhY2thZ2UtLXByaW50LWVtYWlsLWJ1dHRvbiBtYWludGFpbmVyKSkKICAgICh3aGVuIGF1
dGhvcnMKICAgICAgKHBhY2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbgogICAgICAgICAgKGlmICg9
IChsZW5ndGggYXV0aG9ycykgMSkKICAgICAgICAgICAgICAiQXV0aG9yIgogICAgICAgICAgICAi
QXV0aG9ycyIpKQogICAgICAocGFja2FnZS0tcHJpbnQtZW1haWwtYnV0dG9uIChwb3AgYXV0aG9y
cykpCiAgICAgIDs7IElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBhdXRob3IsIGluZGVudCB0aGUg
cmVzdCBjb3JyZWN0bHkuCiAgICAgIChkb2xpc3QgKG5hbWUgYXV0aG9ycykKICAgICAgICAoaW5z
ZXJ0IChtYWtlLXN0cmluZyAxMyA/XHMpKQogICAgICAgIChwYWNrYWdlLS1wcmludC1lbWFpbC1i
dXR0b24gbmFtZSkpKQogICAgKGxldCogKChhbGwtcGtncyAoYXBwZW5kIChjZHIgKGFzc3EgbmFt
ZSBwYWNrYWdlLWFsaXN0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIChhc3Nx
IG5hbWUgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAobGV0ICgoYmkgKGFzc3EgbmFtZSBwYWNrYWdlLS1idWlsdGlucykpKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGlmIGJpIChsaXN0IChwYWNrYWdlLS1mcm9tLWJ1aWx0aW4g
YmkpKSkpKSkKICAgICAgICAgICAob3RoZXItcGtncyAoZGVsZXRlIGRlc2MgYWxsLXBrZ3MpKSkK
ICAgICAgKHdoZW4gb3RoZXItcGtncwogICAgICAgIChwYWNrYWdlLS1wcmludC1oZWxwLXNlY3Rp
b24gIk90aGVyIHZlcnNpb25zIgogICAgICAgICAgKG1hcGNvbmNhdCAobGFtYmRhIChvcGtnKQog
ICAgICAgICAgICAgICAgICAgICAgIChsZXQqICgob3YgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIG9w
a2cpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyIChwYWNrYWdlLWRlc2MtZGly
IG9wa2cpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSAob3IgKHBhY2thZ2Ut
ZGVzYy1hcmNoaXZlIG9wa2cpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoaWYgKHN0cmluZ3AgZGlyKSAiaW5zdGFsbGVkIiBkaXIpKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAoaWYgKG5vdCBvdikgKGZvcm1hdCAiJXMiIGZyb20pCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChmb3JtYXQgIiVzICglcykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKG1ha2UtdGV4dC1idXR0b24gKHBhY2thZ2UtdmVyc2lvbi1qb2luIG92KSBuaWwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1s
b2NrLWZhY2UgJ2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAnZm9sbG93LWxpbmsgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChfYnV0dG9uKQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaWJlLXBhY2th
Z2Ugb3BrZykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20pKSkpCiAg
ICAgICAgICAgICAgICAgICAgIG90aGVyLXBrZ3MgIiwgIikKICAgICAgICAgICIuIikpKQoKICAg
IChpbnNlcnQgIlxuIikKCiAgICAobGV0ICgoc3RhcnQtb2YtZGVzY3JpcHRpb24gKHBvaW50KSkp
CiAgICAgIChpZiBidWlsdC1pbgogICAgICAgICAgOzsgRm9yIGJ1aWx0LWluIHBhY2thZ2VzLCBn
ZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20gdGhlCiAgICAgICAgICA7OyBDb21tZW50YXJ5IGhlYWRl
ci4KICAgICAgICAgIChpbnNlcnQgKG9yIChsbS1jb21tZW50YXJ5IChsb2NhdGUtZmlsZSAoZm9y
bWF0ICIlcy5lbCIgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBsb2FkLXBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBsb2FkLWZpbGUtcmVwLXN1ZmZpeGVzKSkKICAgICAgICAgICAgICAgICAg
ICAgICIiKSkKCiAgICAgICAgKGlmIChwYWNrYWdlLWluc3RhbGxlZC1wIGRlc2MpCiAgICAgICAg
ICAgIDs7IEZvciBpbnN0YWxsZWQgcGFja2FnZXMsIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbSB0
aGUKICAgICAgICAgICAgOzsgaW5zdGFsbGVkIGZpbGVzLgogICAgICAgICAgICAoaW5zZXJ0IChw
YWNrYWdlLS1nZXQtZGVzY3JpcHRpb24gZGVzYykpCgogICAgICAgICAgOzsgRm9yIG5vbi1idWls
dC1pbiwgbm9uLWluc3RhbGxlZCBwYWNrYWdlcywgZ2V0IGRlc2NyaXB0aW9uIGZyb20KICAgICAg
ICAgIDs7IHRoZSBhcmNoaXZlLgogICAgICAgICAgKGxldCogKChiYXNlbmFtZSAoZm9ybWF0ICIl
cy1yZWFkbWUudHh0IiBuYW1lKSkKICAgICAgICAgICAgICAgICByZWFkbWUtc3RyaW5nKQoKICAg
ICAgICAgICAgKHBhY2thZ2UtLXdpdGgtcmVzcG9uc2UtYnVmZmVyIChwYWNrYWdlLWFyY2hpdmUt
YmFzZSBkZXNjKQogICAgICAgICAgICAgIDpmaWxlIGJhc2VuYW1lIDpub2Vycm9yIHQKICAgICAg
ICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50
LW1heCkpCiAgICAgICAgICAgICAgICAodW5sZXNzIChib2xwKQogICAgICAgICAgICAgICAgICAo
aW5zZXJ0ID9cbikpKQogICAgICAgICAgICAgIChjbC1hc3NlcnQgKG5vdCBlbmFibGUtbXVsdGli
eXRlLWNoYXJhY3RlcnMpKQogICAgICAgICAgICAgIChzZXRxIHJlYWRtZS1zdHJpbmcKICAgICAg
ICAgICAgICAgICAgICA7OyBUaGUgcmVhZG1lLnR4dCBmaWxlcyBhcmUgZGVmaW5lZCB0byBjb250
YWluIHV0Zi04IHRleHQuCiAgICAgICAgICAgICAgICAgICAgKGRlY29kZS1jb2RpbmctcmVnaW9u
IChwb2ludC1taW4pIChwb2ludC1tYXgpICd1dGYtOCB0KSkKICAgICAgICAgICAgICB0KQogICAg
ICAgICAgICAoaW5zZXJ0IChvciByZWFkbWUtc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAg
ICJUaGlzIHBhY2thZ2UgZG9lcyBub3QgcHJvdmlkZSBhIGRlc2NyaXB0aW9uLiIpKSkpKQoKICAg
ICAgOzsgSW5zZXJ0IG5ld3MgaWYgYXZhaWxhYmxlLgogICAgICAod2hlbiBuZXdzCiAgICAgICAg
KG5ld2xpbmUpCiAgICAgICAgKHdoZW4gKGZib3VuZHAgJ21ha2Utc2VwYXJhdG9yLWxpbmUpCiAg
ICAgICAgICAoaW5zZXJ0IChtYWtlLXNlcGFyYXRvci1saW5lKSkKICAgICAgICAgIChuZXdsaW5l
KSkKICAgICAgICAoaW5zZXJ0IChwcm9wZXJ0aXplICIqIE5ld3MiICdmYWNlICdwYWNrYWdlLWhl
bHAtc2VjdGlvbi1uYW1lKQogICAgICAgICAgICAgICAgIlxuXG4iKQogICAgICAgIChpbnNlcnQt
ZmlsZS1jb250ZW50cyBuZXdzKSkKCiAgICAgIDs7IE1ha2UgbGlicmFyeSBkZXNjcmlwdGlvbnMg
aW50byBsaW5rcy4KICAgICAgKGdvdG8tY2hhciBzdGFydC1vZi1kZXNjcmlwdGlvbikKICAgICAg
KHBhY2thZ2UtLWRlc2NyaWJlLWFkZC1saWJyYXJ5LWxpbmtzKQogICAgICA7OyBNYWtlIFVSTHMg
aW4gdGhlIGRlc2NyaXB0aW9uIGludG8gbGlua3MuCiAgICAgIChnb3RvLWNoYXIgc3RhcnQtb2Yt
ZGVzY3JpcHRpb24pCiAgICAgIChicm93c2UtdXJsLWFkZC1idXR0b25zKSkpKQoKKGRlZnVuIHBh
Y2thZ2UtaW5zdGFsbC1idXR0b24tYWN0aW9uIChidXR0b24pCiAgIlJ1biBgcGFja2FnZS1pbnN0
YWxsJyBvbiB0aGUgcGFja2FnZSBCVVRUT04gcG9pbnRzIHRvLgpVc2VkIGZvciB0aGUgYGFjdGlv
bicgcHJvcGVydHkgb2YgYnV0dG9ucyBpbiB0aGUgYnVmZmVyIGNyZWF0ZWQgYnkKYGRlc2NyaWJl
LXBhY2thZ2UnLiIKICAobGV0ICgocGtnLWRlc2MgKGJ1dHRvbi1nZXQgYnV0dG9uICdwYWNrYWdl
LWRlc2MpKSkKICAgICh3aGVuICh5LW9yLW4tcCAoZm9ybWF0LW1lc3NhZ2UgIkluc3RhbGwgcGFj
a2FnZSBgJXMnPyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdl
LWRlc2MtZnVsbC1uYW1lIHBrZy1kZXNjKSkpCiAgICAgIChwYWNrYWdlLWluc3RhbGwgcGtnLWRl
c2MgbmlsKQogICAgICAoZGVzY3JpYmUtcGFja2FnZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRl
c2MpKSkpKQoKKGRlZnVuIHBhY2thZ2UtZGVsZXRlLWJ1dHRvbi1hY3Rpb24gKGJ1dHRvbikKICAi
UnVuIGBwYWNrYWdlLWRlbGV0ZScgb24gdGhlIHBhY2thZ2UgQlVUVE9OIHBvaW50cyB0by4KVXNl
ZCBmb3IgdGhlIGBhY3Rpb24nIHByb3BlcnR5IG9mIGJ1dHRvbnMgaW4gdGhlIGJ1ZmZlciBjcmVh
dGVkIGJ5CmBkZXNjcmliZS1wYWNrYWdlJy4iCiAgKGxldCAoKHBrZy1kZXNjIChidXR0b24tZ2V0
IGJ1dHRvbiAncGFja2FnZS1kZXNjKSkpCiAgICAod2hlbiAoeS1vci1uLXAgKGZvcm1hdC1tZXNz
YWdlICJEZWxldGUgcGFja2FnZSBgJXMnPyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIHBrZy1kZXNjKSkpCiAgICAgIChwYWNrYWdl
LWRlbGV0ZSBwa2ctZGVzYykKICAgICAgKGRlc2NyaWJlLXBhY2thZ2UgKHBhY2thZ2UtZGVzYy1u
YW1lIHBrZy1kZXNjKSkpKSkKCihkZWZ1biBwYWNrYWdlLWtleXdvcmQtYnV0dG9uLWFjdGlvbiAo
YnV0dG9uKQogICJTaG93IGZpbHRlcmVkIFwiKlBhY2thZ2VzKlwiIGJ1ZmZlciBmb3IgQlVUVE9O
LgpUaGUgYnVmZmVyIGlzIGZpbHRlcmVkIGJ5IHRoZSBgcGFja2FnZS1rZXl3b3JkJyBwcm9wZXJ0
eSBvZiBCVVRUT04uClVzZWQgZm9yIHRoZSBgYWN0aW9uJyBwcm9wZXJ0eSBvZiBidXR0b25zIGlu
IHRoZSBidWZmZXIgY3JlYXRlZCBieQpgZGVzY3JpYmUtcGFja2FnZScuIgogIChsZXQgKChwa2ct
a2V5d29yZCAoYnV0dG9uLWdldCBidXR0b24gJ3BhY2thZ2Uta2V5d29yZCkpKQogICAgKHBhY2th
Z2Utc2hvdy1wYWNrYWdlLWxpc3QgdCAobGlzdCBwa2cta2V5d29yZCkpKSkKCihkZWZ1biBwYWNr
YWdlLW1ha2UtYnV0dG9uICh0ZXh0ICZyZXN0IHByb3BlcnRpZXMpCiAgIkluc2VydCBidXR0b24g
bGFiZWxlZCBURVhUIHdpdGggYnV0dG9uIFBST1BFUlRJRVMgYXQgcG9pbnQuClBST1BFUlRJRVMg
YXJlIHBhc3NlZCB0byBgaW5zZXJ0LXRleHQtYnV0dG9uJywgZm9yIHdoaWNoIHRoaXMKZnVuY3Rp
b24gaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIHVzZWQgYnkgYGRlc2NyaWJlLXBhY2thZ2UtMScu
IgogIChsZXQgKChidXR0b24tdGV4dCAoaWYgKGRpc3BsYXktZ3JhcGhpYy1wKSB0ZXh0IChjb25j
YXQgIlsiIHRleHQgIl0iKSkpCiAgICAgICAgKGJ1dHRvbi1mYWNlIChpZiAoZGlzcGxheS1ncmFw
aGljLXApCiAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHJlcXVpcmUgJ2N1cy1lZGl0KSA7IGZvciB0aGUgY3VzdG9tLWJ1dHRvbiBmYWNl
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b20tYnV0dG9uKQogICAgICAgICAgICAg
ICAgICAgICAgICdsaW5rKSkpCiAgICAoYXBwbHkgIydpbnNlcnQtdGV4dC1idXR0b24gYnV0dG9u
LXRleHQgJ2ZhY2UgYnV0dG9uLWZhY2UgJ2ZvbGxvdy1saW5rIHQKICAgICAgICAgICBwcm9wZXJ0
aWVzKSkpCgooZGVmdW4gcGFja2FnZS0tZmluZGVyLWdvdG8teHJlZiAoYnV0dG9uKQogICJKdW1w
IHRvIGEgTGlzcCBmaWxlIGZvciB0aGUgQlVUVE9OIGF0IHBvaW50LiIKICAobGV0KiAoKGZpbGUg
KGJ1dHRvbi1nZXQgYnV0dG9uICd4cmVmKSkKICAgICAgICAgKGxpYiAobG9jYXRlLWxpYnJhcnkg
ZmlsZSkpKQogICAgKGlmIGxpYiAoZmluZGVyLWNvbW1lbnRhcnkgbGliKQogICAgICAobWVzc2Fn
ZSAiVW5hYmxlIHRvIGxvY2F0ZSBgJXMnIiBmaWxlKSkpKQoKKGRlZmluZS1idXR0b24tdHlwZSAn
cGFja2FnZS0tZmluZGVyLXhyZWYgJ2FjdGlvbiAjJ3BhY2thZ2UtLWZpbmRlci1nb3RvLXhyZWYp
CgooZGVmdW4gcGFja2FnZS0tcHJpbnQtZW1haWwtYnV0dG9uIChyZWNpcGllbnQpCiAgIkluc2Vy
dCBhIGJ1dHRvbiB3aG9zZSBhY3Rpb24gd2lsbCBzZW5kIGFuIGVtYWlsIHRvIFJFQ0lQSUVOVC4K
TkFNRSBzaG91bGQgaGF2ZSB0aGUgZm9ybSAoRlVMTE5BTUUgLiBFTUFJTCkgd2hlcmUgRlVMTE5B
TUUgaXMKZWl0aGVyIGEgZnVsbCBuYW1lIG9yIG5pbCwgYW5kIEVNQUlMIGlzIGEgdmFsaWQgZW1h
aWwgYWRkcmVzcy4iCiAgKHdoZW4gKGNhciByZWNpcGllbnQpCiAgICAoaW5zZXJ0IChjYXIgcmVj
aXBpZW50KSkpCiAgKHdoZW4gKGFuZCAoY2FyIHJlY2lwaWVudCkgKGNkciByZWNpcGllbnQpKQog
ICAgKGluc2VydCAiICIpKQogICh3aGVuIChjZHIgcmVjaXBpZW50KQogICAgKGluc2VydCAiPCIp
CiAgICAoaW5zZXJ0LXRleHQtYnV0dG9uIChjZHIgcmVjaXBpZW50KQogICAgICAgICAgICAgICAg
ICAgICAgICAnZm9sbG93LWxpbmsgdAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9uIChs
YW1iZGEgKF8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9zZS1tYWls
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiJXMgPCVzPiIgKGNh
ciByZWNpcGllbnQpIChjZHIgcmVjaXBpZW50KSkpKSkKICAgIChpbnNlcnQgIj4iKSkKICAoaW5z
ZXJ0ICJcbiIpKQoKDAo7Ozs7IFBhY2thZ2UgbWVudSBtb2RlLgoKKGRlZnZhci1rZXltYXAgcGFj
a2FnZS1tZW51LW1vZGUtbWFwCiAgOmRvYyAiTG9jYWwga2V5bWFwIGZvciBgcGFja2FnZS1tZW51
LW1vZGUnIGJ1ZmZlcnMuIgogIDpwYXJlbnQgdGFidWxhdGVkLWxpc3QtbW9kZS1tYXAKICAiQy1t
IiAgICMncGFja2FnZS1tZW51LWRlc2NyaWJlLXBhY2thZ2UKICAidSIgICAgICMncGFja2FnZS1t
ZW51LW1hcmstdW5tYXJrCiAgIkRFTCIgICAjJ3BhY2thZ2UtbWVudS1iYWNrdXAtdW5tYXJrCiAg
ImQiICAgICAjJ3BhY2thZ2UtbWVudS1tYXJrLWRlbGV0ZQogICJpIiAgICAgIydwYWNrYWdlLW1l
bnUtbWFyay1pbnN0YWxsCiAgIlUiICAgICAjJ3BhY2thZ2UtbWVudS1tYXJrLXVwZ3JhZGVzCiAg
InIiICAgICAjJ3JldmVydC1idWZmZXIKICAifiIgICAgICMncGFja2FnZS1tZW51LW1hcmstb2Jz
b2xldGUtZm9yLWRlbGV0aW9uCiAgInciICAgICAjJ3BhY2thZ2UtYnJvd3NlLXVybAogICJiIiAg
ICAgIydwYWNrYWdlLXJlcG9ydC1idWcKICAieCIgICAgICMncGFja2FnZS1tZW51LWV4ZWN1dGUK
ICAiaCIgICAgICMncGFja2FnZS1tZW51LXF1aWNrLWhlbHAKICAiSCIgICAgICMncGFja2FnZS1t
ZW51LWhpZGUtcGFja2FnZQogICI/IiAgICAgIydwYWNrYWdlLW1lbnUtZGVzY3JpYmUtcGFja2Fn
ZQogICIoIiAgICAgIydwYWNrYWdlLW1lbnUtdG9nZ2xlLWhpZGluZwogICIvIC8iICAgIydwYWNr
YWdlLW1lbnUtY2xlYXItZmlsdGVyCiAgIi8gYSIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnkt
YXJjaGl2ZQogICIvIGQiICAgIydwYWNrYWdlLW1lbnUtZmlsdGVyLWJ5LWRlc2NyaXB0aW9uCiAg
Ii8gayIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnkta2V5d29yZAogICIvIE4iICAgIydwYWNr
YWdlLW1lbnUtZmlsdGVyLWJ5LW5hbWUtb3ItZGVzY3JpcHRpb24KICAiLyBuIiAgICMncGFja2Fn
ZS1tZW51LWZpbHRlci1ieS1uYW1lCiAgIi8gcyIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnkt
c3RhdHVzCiAgIi8gdiIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnktdmVyc2lvbgogICIvIG0i
ICAgIydwYWNrYWdlLW1lbnUtZmlsdGVyLW1hcmtlZAogICIvIHUiICAgIydwYWNrYWdlLW1lbnUt
ZmlsdGVyLXVwZ3JhZGFibGUpCgooZWFzeS1tZW51LWRlZmluZSBwYWNrYWdlLW1lbnUtbW9kZS1t
ZW51IHBhY2thZ2UtbWVudS1tb2RlLW1hcAogICJNZW51IGZvciBgcGFja2FnZS1tZW51LW1vZGUn
LiIKICAnKCJQYWNrYWdlIgogICAgWyJEZXNjcmliZSBQYWNrYWdlIiBwYWNrYWdlLW1lbnUtZGVz
Y3JpYmUtcGFja2FnZSA6aGVscCAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBhY2th
Z2UiXQogICAgWyJPcGVuIFBhY2thZ2UgV2Vic2l0ZSIgcGFja2FnZS1icm93c2UtdXJsCiAgICAg
OmhlbHAgIk9wZW4gdGhlIHdlYnNpdGUgb2YgdGhpcyBwYWNrYWdlIl0KICAgIFsiSGVscCIgcGFj
a2FnZS1tZW51LXF1aWNrLWhlbHAgOmhlbHAgIlNob3cgc2hvcnQga2V5IGJpbmRpbmcgaGVscCBm
b3IgcGFja2FnZS1tZW51LW1vZGUiXQogICAgIi0tIgogICAgWyJSZWZyZXNoIFBhY2thZ2UgTGlz
dCIgcmV2ZXJ0LWJ1ZmZlcgogICAgIDpoZWxwICJSZWRvd25sb2FkIHRoZSBwYWNrYWdlIGFyY2hp
dmUocykiCiAgICAgOmFjdGl2ZSAobm90IHBhY2thZ2UtLWRvd25sb2Fkcy1pbi1wcm9ncmVzcyld
CiAgICBbIkV4ZWN1dGUgTWFya2VkIEFjdGlvbnMiIHBhY2thZ2UtbWVudS1leGVjdXRlIDpoZWxw
ICJQZXJmb3JtIGFsbCB0aGUgbWFya2VkIGFjdGlvbnMiXQoKICAgICItLSIKICAgIFsiTWFyayBB
bGwgQXZhaWxhYmxlIFVwZ3JhZGVzIiBwYWNrYWdlLW1lbnUtbWFyay11cGdyYWRlcwogICAgIDpo
ZWxwICJNYXJrIHBhY2thZ2VzIHRoYXQgaGF2ZSBhIG5ld2VyIHZlcnNpb24gZm9yIHVwZ3JhZGlu
ZyIKICAgICA6YWN0aXZlIChub3QgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzKV0KICAg
IFsiTWFyayBBbGwgT2Jzb2xldGUgZm9yIERlbGV0aW9uIiBwYWNrYWdlLW1lbnUtbWFyay1vYnNv
bGV0ZS1mb3ItZGVsZXRpb24gOmhlbHAgIk1hcmsgYWxsIG9ic29sZXRlIHBhY2thZ2VzIGZvciBk
ZWxldGlvbiJdCiAgICBbIk1hcmsgZm9yIEluc3RhbGwiIHBhY2thZ2UtbWVudS1tYXJrLWluc3Rh
bGwgOmhlbHAgIk1hcmsgYSBwYWNrYWdlIGZvciBpbnN0YWxsYXRpb24gYW5kIG1vdmUgdG8gdGhl
IG5leHQgbGluZSJdCiAgICBbIk1hcmsgZm9yIERlbGV0aW9uIiBwYWNrYWdlLW1lbnUtbWFyay1k
ZWxldGUgOmhlbHAgIk1hcmsgYSBwYWNrYWdlIGZvciBkZWxldGlvbiBhbmQgbW92ZSB0byB0aGUg
bmV4dCBsaW5lIl0KICAgIFsiVW5tYXJrIiBwYWNrYWdlLW1lbnUtbWFyay11bm1hcmsgOmhlbHAg
IkNsZWFyIGFueSBtYXJrcyBvbiBhIHBhY2thZ2UgYW5kIG1vdmUgdG8gdGhlIG5leHQgbGluZSJd
CgogICAgIi0tIgogICAgKCJGaWx0ZXIgUGFja2FnZXMiCiAgICAgWyJGaWx0ZXIgYnkgQXJjaGl2
ZSIgcGFja2FnZS1tZW51LWZpbHRlci1ieS1hcmNoaXZlIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMg
YnkgYXJjaGl2ZSJdCiAgICAgWyJGaWx0ZXIgYnkgRGVzY3JpcHRpb24iIHBhY2thZ2UtbWVudS1m
aWx0ZXItYnktZGVzY3JpcHRpb24gOmhlbHAgIkZpbHRlciBwYWNrYWdlcyBieSBkZXNjcmlwdGlv
biJdCiAgICAgWyJGaWx0ZXIgYnkgS2V5d29yZCIgcGFja2FnZS1tZW51LWZpbHRlci1ieS1rZXl3
b3JkIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMgYnkga2V5d29yZCJdCiAgICAgWyJGaWx0ZXIgYnkg
TmFtZSIgcGFja2FnZS1tZW51LWZpbHRlci1ieS1uYW1lIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMg
YnkgbmFtZSJdCiAgICAgWyJGaWx0ZXIgYnkgTmFtZSBvciBEZXNjcmlwdGlvbiIgcGFja2FnZS1t
ZW51LWZpbHRlci1ieS1uYW1lLW9yLWRlc2NyaXB0aW9uCiAgICAgIDpoZWxwICJGaWx0ZXIgcGFj
a2FnZXMgYnkgbmFtZSBvciBkZXNjcmlwdGlvbiJdCiAgICAgWyJGaWx0ZXIgYnkgU3RhdHVzIiBw
YWNrYWdlLW1lbnUtZmlsdGVyLWJ5LXN0YXR1cyA6aGVscCAiRmlsdGVyIHBhY2thZ2VzIGJ5IHN0
YXR1cyJdCiAgICAgWyJGaWx0ZXIgYnkgVmVyc2lvbiIgcGFja2FnZS1tZW51LWZpbHRlci1ieS12
ZXJzaW9uIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMgYnkgdmVyc2lvbiJdCiAgICAgWyJGaWx0ZXIg
TWFya2VkIiBwYWNrYWdlLW1lbnUtZmlsdGVyLW1hcmtlZCA6aGVscCAiRmlsdGVyIHBhY2thZ2Vz
IG1hcmtlZCBmb3IgdXBncmFkZSJdCiAgICAgWyJDbGVhciBGaWx0ZXIiIHBhY2thZ2UtbWVudS1j
bGVhci1maWx0ZXIgOmhlbHAgIkNsZWFyIHBhY2thZ2UgbGlzdCBmaWx0ZXIiXSkKCiAgICBbIkhp
ZGUgYnkgUmVnZXhwIiBwYWNrYWdlLW1lbnUtaGlkZS1wYWNrYWdlIDpoZWxwICJIaWRlIGFsbCBw
YWNrYWdlcyBtYXRjaGluZyBhIHJlZ2V4cCJdCiAgICBbIkRpc3BsYXkgT2xkZXIgVmVyc2lvbnMi
IHBhY2thZ2UtbWVudS10b2dnbGUtaGlkaW5nCiAgICAgOnN0eWxlIHRvZ2dsZSA6c2VsZWN0ZWQg
KG5vdCBwYWNrYWdlLW1lbnUtLWhpZGUtcGFja2FnZXMpCiAgICAgOmhlbHAgIkRpc3BsYXkgcGFj
a2FnZSBldmVuIGlmIGEgbmV3ZXIgdmVyc2lvbiBpcyBhbHJlYWR5IGluc3RhbGxlZCJdCgogICAg
Ii0tIgogICAgWyJRdWl0IiBxdWl0LXdpbmRvdyA6aGVscCAiUXVpdCBwYWNrYWdlIHNlbGVjdGlv
biJdCiAgICBbIkN1c3RvbWl6ZSIgKGN1c3RvbWl6ZS1ncm91cCAncGFja2FnZSldKSkKCihkZWZ2
YXIgcGFja2FnZS1tZW51LS1uZXctcGFja2FnZS1saXN0IG5pbAogICJMaXN0IG9mIG5ld2x5LWF2
YWlsYWJsZSBwYWNrYWdlcyBzaW5jZSBgbGlzdC1wYWNrYWdlcycgd2FzIGxhc3QgY2FsbGVkLiIp
CgooZGVmdmFyIHBhY2thZ2UtbWVudS0tdHJhbnNhY3Rpb24tc3RhdHVzIG5pbAogICJNb2RlLWxp
bmUgc3RhdHVzIG9mIG9uZ29pbmcgcGFja2FnZSB0cmFuc2FjdGlvbi4iKQoKKGRlZmluZS1kZXJp
dmVkLW1vZGUgcGFja2FnZS1tZW51LW1vZGUgdGFidWxhdGVkLWxpc3QtbW9kZSAiUGFja2FnZSBN
ZW51IgogICJNYWpvciBtb2RlIGZvciBicm93c2luZyBhIGxpc3Qgb2YgcGFja2FnZXMuClRoZSBt
b3N0IHVzZWZ1bCBjb21tYW5kcyBoZXJlIGFyZToKCiAgYHgnOiBJbnN0YWxsIHRoZSBwYWNrYWdl
IHVuZGVyIHBvaW50IGlmIGl0IGlzbid0IGFscmVhZHkgaW5zdGFsbGVkLAogICAgICAgYW5kIGRl
bGV0ZSBpdCBpZiBpdCdzIGFscmVhZHkgaW5zdGFsbGVkLAogIGBpJzogbWFyayBhIHBhY2thZ2Ug
Zm9yIGluc3RhbGxhdGlvbiwgYW5kCiAgYGQnOiBtYXJrIGEgcGFja2FnZSBmb3IgZGVsZXRpb24u
ICBVc2UgdGhlIGB4JyBjb21tYW5kIHRvIHBlcmZvcm0gdGhlCiAgICAgICBhY3Rpb25zIG9uIHRo
ZSBtYXJrZWQgZmlsZXMuClxcPHBhY2thZ2UtbWVudS1tb2RlLW1hcD4KXFx7cGFja2FnZS1tZW51
LW1vZGUtbWFwfSIKICA6aW50ZXJhY3RpdmUgbmlsCiAgKHNldHEgbW9kZS1saW5lLXByb2Nlc3Mg
JygocGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzICI6TG9hZGluZyIpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAocGFja2FnZS1tZW51LS10cmFuc2FjdGlvbi1zdGF0dXMKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0YXR1cykp
KQogIChzZXRxIHRhYnVsYXRlZC1saXN0LWZvcm1hdAogICAgICAgIGBbKCJQYWNrYWdlIiAscGFj
a2FnZS1uYW1lLWNvbHVtbi13aWR0aCBwYWNrYWdlLW1lbnUtLW5hbWUtcHJlZGljYXRlKQogICAg
ICAgICAgKCJWZXJzaW9uIiAscGFja2FnZS12ZXJzaW9uLWNvbHVtbi13aWR0aCBwYWNrYWdlLW1l
bnUtLXZlcnNpb24tcHJlZGljYXRlKQogICAgICAgICAgKCJTdGF0dXMiICAscGFja2FnZS1zdGF0
dXMtY29sdW1uLXdpZHRoICBwYWNrYWdlLW1lbnUtLXN0YXR1cy1wcmVkaWNhdGUpCiAgICAgICAg
ICAoIkFyY2hpdmUiICxwYWNrYWdlLWFyY2hpdmUtY29sdW1uLXdpZHRoIHBhY2thZ2UtbWVudS0t
YXJjaGl2ZS1wcmVkaWNhdGUpCiAgICAgICAgICAoIkRlc2NyaXB0aW9uIiAwIHBhY2thZ2UtbWVu
dS0tZGVzY3JpcHRpb24tcHJlZGljYXRlKV0pCiAgKHNldHEgdGFidWxhdGVkLWxpc3QtcGFkZGlu
ZyAyKQogIChzZXRxIHRhYnVsYXRlZC1saXN0LXNvcnQta2V5IChjb25zICJTdGF0dXMiIG5pbCkp
CiAgKGFkZC1ob29rICd0YWJ1bGF0ZWQtbGlzdC1yZXZlcnQtaG9vayAjJ3BhY2thZ2UtbWVudS0t
cmVmcmVzaCBuaWwgdCkKICAodGFidWxhdGVkLWxpc3QtaW5pdC1oZWFkZXIpCiAgKHNldHEgcmV2
ZXJ0LWJ1ZmZlci1mdW5jdGlvbiAncGFja2FnZS1tZW51LS1yZWZyZXNoLWNvbnRlbnRzKQogIChz
ZXRmIGltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24KICAgICAgICAjJ3BhY2thZ2Ut
LWltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24pCiAgKHNldGYgaW1lbnUtZXh0cmFj
dC1pbmRleC1uYW1lLWZ1bmN0aW9uCiAgICAgICAgIydwYWNrYWdlLS1pbWVudS1leHRyYWN0LWlu
ZGV4LW5hbWUtZnVuY3Rpb24pKQoKKGRlZm1hY3JvIHBhY2thZ2UtLXB1c2ggKHBrZy1kZXNjIHN0
YXR1cyBsaXN0bmFtZSkKICAiQ29udmVuaWVuY2UgbWFjcm8gZm9yIGBwYWNrYWdlLW1lbnUtLWdl
bmVyYXRlJy4KSWYgdGhlIGFsaXN0IHN0b3JlZCBpbiB0aGUgc3ltYm9sIExJU1ROQU1FIGxhY2tz
IGFuIGVudHJ5IGZvciBhCnBhY2thZ2UgUEtHLURFU0MsIGFkZCBvbmUuICBUaGUgYWxpc3QgaXMg
a2V5ZWQgd2l0aCBQS0ctREVTQy4iCiAgKGRlY2xhcmUgKG9ic29sZXRlIG5pbCAiMjcuMSIpKQog
IGAodW5sZXNzIChhc3NvYyAscGtnLWRlc2MgLGxpc3RuYW1lKQogICAgIDs7IEZJWE1FOiBTaG91
bGQgd2UgbW92ZSBzdGF0dXMgaW50byBwa2ctZGVzYz8KICAgICAocHVzaCAoY29ucyAscGtnLWRl
c2MgLHN0YXR1cykgLGxpc3RuYW1lKSkpCgooZGVmdmFyIHBhY2thZ2UtbGlzdC11bnZlcnNpb25l
ZCBuaWwKICAiSWYgbm9uLW5pbCwgaW5jbHVkZSBwYWNrYWdlcyB0aGF0IGRvbid0IGhhdmUgYSB2
ZXJzaW9uIGluIGBsaXN0LXBhY2thZ2VzJy4iKQoKKGRlZnZhciBwYWNrYWdlLWxpc3QtdW5zaWdu
ZWQgbmlsCiAgIklmIG5vbi1uaWwsIG1lbnRpb24gaW4gdGhlIGxpc3Qgd2hpY2ggcGFja2FnZXMg
d2VyZSBpbnN0YWxsZWQgd2l0aG91dCBzaWduYXR1cmUuIikKCihkZWZ2YXIgcGFja2FnZS0tZW1h
Y3MtdmVyc2lvbi1saXN0ICh2ZXJzaW9uLXRvLWxpc3QgZW1hY3MtdmVyc2lvbikKICAiVGhlIHZh
bHVlIG9mIHZhcmlhYmxlIGBlbWFjcy12ZXJzaW9uJyBhcyBhIGxpc3QuIikKCihkZWZ1biBwYWNr
YWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUgKCkKICAiU2lnbmFsIGEgdXNlci1lcnJvciBp
ZiBtYWpvciBtb2RlIGlzIG5vdCBgcGFja2FnZS1tZW51LW1vZGUnLiIKICAodW5sZXNzIChkZXJp
dmVkLW1vZGUtcCAncGFja2FnZS1tZW51LW1vZGUpCiAgICAodXNlci1lcnJvciAiVGhlIGN1cnJl
bnQgYnVmZmVyIGlzIG5vdCBhIFBhY2thZ2UgTWVudSIpKSkKCihkZWZ1biBwYWNrYWdlLS1pbmNv
bXBhdGlibGUtcCAocGtnICZvcHRpb25hbCBzaGFsbG93KQogICJSZXR1cm4gbm9uLW5pbCBpZiBQ
S0cgaGFzIG5vIGNoYW5jZSBvZiBiZWluZyBpbnN0YWxsYWJsZS4KUEtHIGlzIGEgYHBhY2thZ2Ut
ZGVzYycgb2JqZWN0LgoKSWYgU0hBTExPVyBpcyBub24tbmlsLCB0aGlzIG9ubHkgY2hlY2tzIGlm
IFBLRyBkZXBlbmRzIG9uIGEKaGlnaGVyIGBlbWFjcy12ZXJzaW9uJyB0aGFuIHRoZSBvbmUgYmVp
bmcgdXNlZC4gIE90aGVyd2lzZSwgYWxzbwpjaGVja3MgdGhlIHZpYWJpbGl0eSBvZiBkZXBlbmRl
bmNpZXMsIGFjY29yZGluZyB0bwpgcGFja2FnZS0tY29tcGF0aWJpbGl0eS10YWJsZScuCgpJZiBQ
S0cgcmVxdWlyZXMgYW4gaW5jb21wYXRpYmxlIEVtYWNzIHZlcnNpb24sIHRoZSByZXR1cm4gdmFs
dWUKaXMgdGhpcyB2ZXJzaW9uIChhcyBhIHN0cmluZykuCklmIFBLRyByZXF1aXJlcyBpbmNvbXBh
dGlibGUgcGFja2FnZXMsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBsaXN0Cm9mIHRoZXNlIGRlcGVu
ZGVuY2llcywgc2ltaWxhciB0byB0aGUgbGlzdCByZXR1cm5lZCBieQpgcGFja2FnZS1kZXNjLXJl
cXMnLiIKICAobGV0KiAoKHJlcXMgICAgKHBhY2thZ2UtZGVzYy1yZXFzIHBrZykpCiAgICAgICAg
ICh2ZXJzaW9uIChjYWRyIChhc3NxICdlbWFjcyByZXFzKSkpKQogICAgKGlmIChhbmQgdmVyc2lv
biAodmVyc2lvbi1saXN0LTwgcGFja2FnZS0tZW1hY3MtdmVyc2lvbi1saXN0IHZlcnNpb24pKQog
ICAgICAgIChwYWNrYWdlLXZlcnNpb24tam9pbiB2ZXJzaW9uKQogICAgICAodW5sZXNzIHNoYWxs
b3cKICAgICAgICAobGV0IChvdXQpCiAgICAgICAgICAoZG9saXN0IChkZXAgKHBhY2thZ2UtZGVz
Yy1yZXFzIHBrZykgb3V0KQogICAgICAgICAgICAobGV0ICgoZGVwLW5hbWUgKGNhciBkZXApKSkK
ICAgICAgICAgICAgICAodW5sZXNzIChlcSAnZW1hY3MgZGVwLW5hbWUpCiAgICAgICAgICAgICAg
ICAobGV0ICgoY3YgKGdldGhhc2ggZGVwLW5hbWUgcGFja2FnZS0tY29tcGF0aWJpbGl0eS10YWJs
ZSkpKQogICAgICAgICAgICAgICAgICAod2hlbiAodmVyc2lvbi1saXN0LTwgKG9yIGN2ICcoMCkp
IChvciAoY2FkciBkZXApICcoMCkpKQogICAgICAgICAgICAgICAgICAgIChwdXNoIGRlcCBvdXQp
KSkpKSkpKSkpKQoKKGRlZnVuIHBhY2thZ2UtZGVzYy1zdGF0dXMgKHBrZy1kZXNjKQogICJSZXR1
cm4gdGhlIHN0YXR1cyBvZiBgcGFja2FnZS1kZXNjJyBvYmplY3QgUEtHLURFU0MuIgogIChsZXQq
ICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAoZGlyIChwYWNr
YWdlLWRlc2MtZGlyIHBrZy1kZXNjKSkKICAgICAgICAgKGxsZSAoYXNzcSBuYW1lIHBhY2thZ2Ut
bG9hZC1saXN0KSkKICAgICAgICAgKGhlbGQgKGNhZHIgbGxlKSkKICAgICAgICAgKHZlcnNpb24g
KHBhY2thZ2UtZGVzYy12ZXJzaW9uIHBrZy1kZXNjKSkKICAgICAgICAgKHNpZ25lZCAob3IgKG5v
dCBwYWNrYWdlLWxpc3QtdW5zaWduZWQpCiAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRl
c2Mtc2lnbmVkIHBrZy1kZXNjKSkpKQogICAgKGNvbmQKICAgICAoKHBhY2thZ2UtdmMtcCBwa2ct
ZGVzYykgInNvdXJjZSIpCiAgICAgKChlcSBkaXIgJ2J1aWx0aW4pICJidWlsdC1pbiIpCiAgICAg
KChhbmQgbGxlIChudWxsIGhlbGQpKSAiZGlzYWJsZWQiKQogICAgICgoc3RyaW5ncCBoZWxkKQog
ICAgICAobGV0ICgoaHYgKGlmIChzdHJpbmdwIGhlbGQpICh2ZXJzaW9uLXRvLWxpc3QgaGVsZCkp
KSkKICAgICAgICAoY29uZAogICAgICAgICAoKHZlcnNpb24tbGlzdC09IHZlcnNpb24gaHYpICJo
ZWxkIikKICAgICAgICAgKCh2ZXJzaW9uLWxpc3QtPCB2ZXJzaW9uIGh2KSAib2Jzb2xldGUiKQog
ICAgICAgICAodCAiZGlzYWJsZWQiKSkpKQogICAgIChkaXIgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgO09uZSBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLgogICAgICAoY29uZAogICAg
ICAgKChub3QgKGZpbGUtZXhpc3RzLXAgZGlyKSkgImRlbGV0ZWQiKQogICAgICAgOzsgTm90IGlu
c2lkZSBgcGFja2FnZS11c2VyLWRpcicuCiAgICAgICAoKG5vdCAoZmlsZS1pbi1kaXJlY3Rvcnkt
cCBkaXIgcGFja2FnZS11c2VyLWRpcikpICJleHRlcm5hbCIpCiAgICAgICAoKGVxIHBrZy1kZXNj
IChjYWRyIChhc3NxIG5hbWUgcGFja2FnZS1hbGlzdCkpKQogICAgICAgIChpZiAobm90IHNpZ25l
ZCkgInVuc2lnbmVkIgogICAgICAgICAgKGlmIChwYWNrYWdlLS11c2VyLXNlbGVjdGVkLXAgbmFt
ZSkKICAgICAgICAgICAgICAiaW5zdGFsbGVkIiAiZGVwZW5kZW5jeSIpKSkKICAgICAgICh0ICJv
YnNvbGV0ZSIpKSkKICAgICAoKHBhY2thZ2UtLWluY29tcGF0aWJsZS1wIHBrZy1kZXNjKSAiaW5j
b21wYXQiKQogICAgICh0CiAgICAgIChsZXQqICgoaW5zIChjYWRyIChhc3NxIG5hbWUgcGFja2Fn
ZS1hbGlzdCkpKQogICAgICAgICAgICAgKGlucy12IChpZiBpbnMgKHBhY2thZ2UtZGVzYy12ZXJz
aW9uIGlucykpKSkKICAgICAgICAoY29uZAogICAgICAgICA7OyBJbnN0YWxsZWQgb2Jzb2xldGUg
cGFja2FnZXMgYXJlIGhhbmRsZWQgaW4gdGhlIGBkaXInCiAgICAgICAgIDs7IGNsYXVzZSBhYm92
ZS4gIEhlcmUgd2UgaGFuZGxlIGF2YWlsYWJsZSBvYnNvbGV0ZSwgd2hpY2gKICAgICAgICAgOzsg
YXJlIGRpc3BsYXllZCBkZXBlbmRpbmcgb24gYHBhY2thZ2UtbWVudS0taGlkZS1wYWNrYWdlcycu
CiAgICAgICAgICgoYW5kIGlucyAodmVyc2lvbi1saXN0LTw9IHZlcnNpb24gaW5zLXYpKSAiYXZh
aWwtb2JzbyIpCiAgICAgICAgICh0CiAgICAgICAgICAoaWYgKG1lbXEgbmFtZSBwYWNrYWdlLW1l
bnUtLW5ldy1wYWNrYWdlLWxpc3QpCiAgICAgICAgICAgICAgIm5ldyIgImF2YWlsYWJsZSIpKSkp
KSkpKQoKKGRlZnZhciBwYWNrYWdlLW1lbnUtLWhpZGUtcGFja2FnZXMgdAogICJXaGV0aGVyIGF2
YWlsYWJsZSBvYnNvbGV0ZSBwYWNrYWdlcyBzaG91bGQgYmUgaGlkZGVuLgpDYW4gYmUgdG9nZ2xl
ZCB3aXRoIFxcPHBhY2thZ2UtbWVudS1tb2RlLW1hcD4gXFxbcGFja2FnZS1tZW51LXRvZ2dsZS1o
aWRpbmddLgpJbnN0YWxsZWQgb2Jzb2xldGUgcGFja2FnZXMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQu
IikKCihkZWZ1biBwYWNrYWdlLW1lbnUtdG9nZ2xlLWhpZGluZyAoKQogICJJbiBQYWNrYWdlIE1l
bnUsIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIG9ic29sZXRlIGF2YWlsYWJsZSBwYWNrYWdlcy4KCkFs
c28gaGlkZSBwYWNrYWdlcyB3aG9zZSBuYW1lIG1hdGNoZXMgYSByZWdleHAgaW4gdXNlciBvcHRp
b24KYHBhY2thZ2UtaGlkZGVuLXJlZ2V4cHMnIChhIGxpc3QpLiAgVG8gYWRkIHJlZ2V4cHMgdG8g
dGhpcyBsaXN0LAp1c2UgYHBhY2thZ2UtbWVudS1oaWRlLXBhY2thZ2UnLiIKICAoaW50ZXJhY3Rp
dmUgbmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51
LW1vZGUpCiAgKHNldHEgcGFja2FnZS1tZW51LS1oaWRlLXBhY2thZ2VzCiAgICAgICAgKG5vdCBw
YWNrYWdlLW1lbnUtLWhpZGUtcGFja2FnZXMpKQogIChpZiBwYWNrYWdlLW1lbnUtLWhpZGUtcGFj
a2FnZXMKICAgICAgKG1lc3NhZ2UgIkhpZGluZyBvYnNvbGV0ZSBvciB1bndhbnRlZCBwYWNrYWdl
cyIpCiAgICAobWVzc2FnZSAiRGlzcGxheWluZyBhbGwgcGFja2FnZXMiKSkKICAocmV2ZXJ0LWJ1
ZmZlciBuaWwgJ25vLWNvbmZpcm0pKQoKKGRlZnVuIHBhY2thZ2UtLXJlbW92ZS1oaWRkZW4gKHBr
Zy1saXN0KQogICJGaWx0ZXIgUEtHLUxJU1QgYWNjb3JkaW5nIHRvIGBwYWNrYWdlLWFyY2hpdmUt
cHJpb3JpdGllcycuClBLRy1MSVNUIG11c3QgYmUgYSBsaXN0IG9mIGBwYWNrYWdlLWRlc2MnIG9i
amVjdHMsIGFsbCB3aXRoIHRoZQpzYW1lIG5hbWUsIHNvcnRlZCBieSBkZWNyZWFzaW5nIGBwYWNr
YWdlLWRlc2MtcHJpb3JpdHktdmVyc2lvbicuClJldHVybiBhIGxpc3Qgb2YgcGFja2FnZXMgdGll
ZCBmb3IgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWNjb3JkaW5nCnRvIHRoZWlyIGFyY2hpdmVzLiIK
ICAod2hlbiBwa2ctbGlzdAogICAgOzsgVmFyaWFibGUgdG9nZ2xlZCB3aXRoIGBwYWNrYWdlLW1l
bnUtdG9nZ2xlLWhpZGluZycuCiAgICAoaWYgKG5vdCBwYWNrYWdlLW1lbnUtLWhpZGUtcGFja2Fn
ZXMpCiAgICAgICAgcGtnLWxpc3QKICAgICAgKGxldCAoKGluc3RhbGxlZCAoY2FkciAoYXNzcSAo
cGFja2FnZS1kZXNjLW5hbWUgKGNhciBwa2ctbGlzdCkpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFja2FnZS1hbGlzdCkpKSkKICAgICAgICAod2hlbiBpbnN0YWxsZWQKICAg
ICAgICAgIChzZXRxIHBrZy1saXN0CiAgICAgICAgICAgICAgICAobGV0ICgoaW5zLXZlcnNpb24g
KHBhY2thZ2UtZGVzYy12ZXJzaW9uIGluc3RhbGxlZCkpKQogICAgICAgICAgICAgICAgICAoY2wt
cmVtb3ZlLWlmIChsYW1iZGEgKHApICh2ZXJzaW9uLWxpc3QtPCAocGFja2FnZS1kZXNjLXZlcnNp
b24gcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlucy12ZXJzaW9uKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbGlz
dCkpKSkKICAgICAgICAobGV0ICgoZmlsdGVyZWQtYnktcHJpb3JpdHkKICAgICAgICAgICAgICAg
KGNvbmQKICAgICAgICAgICAgICAgICgobm90IHBhY2thZ2UtbWVudS1oaWRlLWxvdy1wcmlvcml0
eSkKICAgICAgICAgICAgICAgICBwa2ctbGlzdCkKICAgICAgICAgICAgICAgICgoZXEgcGFja2Fn
ZS1tZW51LWhpZGUtbG93LXByaW9yaXR5ICdhcmNoaXZlKQogICAgICAgICAgICAgICAgIChsZXQg
KG1heC1wcmlvcml0eSBvdXQpCiAgICAgICAgICAgICAgICAgICAod2hpbGUgcGtnLWxpc3QKICAg
ICAgICAgICAgICAgICAgICAgKGxldCAoKHAgKHBvcCBwa2ctbGlzdCkpKQogICAgICAgICAgICAg
ICAgICAgICAgIChsZXQgKChwcmlvcml0eSAocGFja2FnZS1kZXNjLXByaW9yaXR5IHApKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kIG1heC1wcmlvcml0eSAoPCBwcmlvcml0eSBt
YXgtcHJpb3JpdHkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIHBrZy1saXN0
IG5pbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2ggcCBvdXQpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChzZXRxIG1heC1wcmlvcml0eSBwcmlvcml0eSkpKSkpCiAgICAgICAg
ICAgICAgICAgICAobnJldmVyc2Ugb3V0KSkpCiAgICAgICAgICAgICAgICAocGtnLWxpc3QKICAg
ICAgICAgICAgICAgICAobGlzdCAoY2FyIHBrZy1saXN0KSkpKSkpCiAgICAgICAgICAoaWYgKG5v
dCBpbnN0YWxsZWQpCiAgICAgICAgICAgICAgZmlsdGVyZWQtYnktcHJpb3JpdHkKICAgICAgICAg
ICAgKGxldCAoKGlucy12ZXJzaW9uIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBpbnN0YWxsZWQpKSkK
ICAgICAgICAgICAgICAoY2wtcmVtb3ZlLWlmIChsYW1iZGEgKHApIChvciAodmVyc2lvbi1saXN0
LT0gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucy12ZXJzaW9uKQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLXAgaW5zdGFsbGVkKSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC1ieS1wcmlvcml0eSkpKSkpKSkp
CgooZGVmY3VzdG9tIHBhY2thZ2UtaGlkZGVuLXJlZ2V4cHMgbmlsCiAgIkxpc3Qgb2YgcmVnZXhw
cyBtYXRjaGluZyB0aGUgbmFtZSBvZiBwYWNrYWdlcyB0byBoaWRlLgpJZiB0aGUgbmFtZSBvZiBh
IHBhY2thZ2UgbWF0Y2hlcyBhbnkgb2YgdGhlc2UgcmVnZXhwcyBpdCBpcwpvbWl0dGVkIGZyb20g
dGhlIHBhY2thZ2UgbWVudS4gIFRvIHRvZ2dsZSB0aGlzLCB0eXBlIFxcW3BhY2thZ2UtbWVudS10
b2dnbGUtaGlkaW5nXS4KClZhbHVlcyBjYW4gYmUgaW50ZXJhY3RpdmVseSBhZGRlZCB0byB0aGlz
IGxpc3QgYnkgdHlwaW5nClxcW3BhY2thZ2UtbWVudS1oaWRlLXBhY2thZ2VdIG9uIGEgcGFja2Fn
ZS4iCiAgOnZlcnNpb24gIjI1LjEiCiAgOnR5cGUgJyhyZXBlYXQgKHJlZ2V4cCA6dGFnICJIaWRl
IHBhY2thZ2VzIHdpdGggbmFtZSBtYXRjaGluZyIpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLXJl
ZnJlc2ggKCZvcHRpb25hbCBwYWNrYWdlcyBrZXl3b3JkcykKICAiUmUtcG9wdWxhdGUgdGhlIGB0
YWJ1bGF0ZWQtbGlzdC1lbnRyaWVzJy4KUEFDS0FHRVMgc2hvdWxkIGJlIG5pbCBvciB0LCB3aGlj
aCBtZWFucyB0byBkaXNwbGF5IGFsbCBrbm93biBwYWNrYWdlcy4KS0VZV09SRFMgc2hvdWxkIGJl
IG5pbCBvciBhIGxpc3Qgb2Yga2V5d29yZHMuIgogIDs7IENvbnN0cnVjdCBsaXN0IG9mIChQS0ct
REVTQyAuIFNUQVRVUykuCiAgKHVubGVzcyBwYWNrYWdlcyAoc2V0cSBwYWNrYWdlcyB0KSkKICAo
bGV0ICgoaGlkZGVuLW5hbWVzIChtYXBjb25jYXQgIydpZGVudGl0eSBwYWNrYWdlLWhpZGRlbi1y
ZWdleHBzICJcXHwiKSkKICAgICAgICBpbmZvLWxpc3QpCiAgICA7OyBJbnN0YWxsZWQgcGFja2Fn
ZXM6CiAgICAoZG9saXN0IChlbHQgcGFja2FnZS1hbGlzdCkKICAgICAgKGxldCAoKG5hbWUgKGNh
ciBlbHQpKSkKICAgICAgICAod2hlbiAob3IgKGVxIHBhY2thZ2VzIHQpIChtZW1xIG5hbWUgcGFj
a2FnZXMpKQogICAgICAgICAgKGRvbGlzdCAocGtnIChjZHIgZWx0KSkKICAgICAgICAgICAgKHdo
ZW4gKHBhY2thZ2UtLWhhcy1rZXl3b3JkLXAgcGtnIGtleXdvcmRzKQogICAgICAgICAgICAgIChw
dXNoIHBrZyBpbmZvLWxpc3QpKSkpKSkKCiAgICA7OyBCdWlsdC1pbiBwYWNrYWdlczoKICAgIChk
b2xpc3QgKGVsdCBwYWNrYWdlLS1idWlsdGlucykKICAgICAgKGxldCAoKHBrZyAgKHBhY2thZ2Ut
LWZyb20tYnVpbHRpbiBlbHQpKQogICAgICAgICAgICAobmFtZSAoY2FyIGVsdCkpKQogICAgICAg
ICh3aGVuIChub3QgKGVxIG5hbWUgJ2VtYWNzKSkgOyBIaWRlIHRoZSBgZW1hY3MnIHBhY2thZ2Uu
CiAgICAgICAgICAod2hlbiAoYW5kIChwYWNrYWdlLS1oYXMta2V5d29yZC1wIHBrZyBrZXl3b3Jk
cykKICAgICAgICAgICAgICAgICAgICAgKG9yIHBhY2thZ2UtbGlzdC11bnZlcnNpb25lZAogICAg
ICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLWJpLWRlc2MtdmVyc2lvbiAoY2RyIGVsdCkp
KQogICAgICAgICAgICAgICAgICAgICAob3IgKGVxIHBhY2thZ2VzIHQpIChtZW1xIG5hbWUgcGFj
a2FnZXMpKSkKICAgICAgICAgICAgKHB1c2ggcGtnIGluZm8tbGlzdCkpKSkpCgogICAgOzsgQXZh
aWxhYmxlIGFuZCBkaXNhYmxlZCBwYWNrYWdlczoKICAgICh1bmxlc3MgKGVxdWFsIHBhY2thZ2Ut
LW9sZC1hcmNoaXZlLXByaW9yaXRpZXMgcGFja2FnZS1hcmNoaXZlLXByaW9yaXRpZXMpCiAgICAg
IChwYWNrYWdlLXJlYWQtYWxsLWFyY2hpdmUtY29udGVudHMpKQogICAgKGRvbGlzdCAoZWx0IHBh
Y2thZ2UtYXJjaGl2ZS1jb250ZW50cykKICAgICAgKGxldCAoKG5hbWUgKGNhciBlbHQpKSkKICAg
ICAgICA7OyBUbyBiZSBkaXNwbGF5ZWQgaXQgbXVzdCBiZSBpbiBQQUNLQUdFUzsKICAgICAgICAo
d2hlbiAoYW5kIChvciAoZXEgcGFja2FnZXMgdCkgKG1lbXEgbmFtZSBwYWNrYWdlcykpCiAgICAg
ICAgICAgICAgICAgICA7OyBhbmQgd2UgbXVzdCBlaXRoZXIgbm90IGJlIGhpZGluZyBhbnl0aGlu
ZywKICAgICAgICAgICAgICAgICAgIChvciAobm90IHBhY2thZ2UtbWVudS0taGlkZS1wYWNrYWdl
cykKICAgICAgICAgICAgICAgICAgICAgICAobm90IHBhY2thZ2UtaGlkZGVuLXJlZ2V4cHMpCiAg
ICAgICAgICAgICAgICAgICAgICAgOzsgb3IganVzdCBub3QgaGlkaW5nIHRoaXMgc3BlY2lmaWMg
cGFja2FnZS4KICAgICAgICAgICAgICAgICAgICAgICAobm90IChzdHJpbmctbWF0Y2ggaGlkZGVu
LW5hbWVzIChzeW1ib2wtbmFtZSBuYW1lKSkpKSkKICAgICAgICAgIDs7IEhpZGUgYXZhaWxhYmxl
LW9ic29sZXRlIG9yIGxvdy1wcmlvcml0eSBwYWNrYWdlcy4KICAgICAgICAgIChkb2xpc3QgKHBr
ZyAocGFja2FnZS0tcmVtb3ZlLWhpZGRlbiAoY2RyIGVsdCkpKQogICAgICAgICAgICAod2hlbiAo
cGFja2FnZS0taGFzLWtleXdvcmQtcCBwa2cga2V5d29yZHMpCiAgICAgICAgICAgICAgKHB1c2gg
cGtnIGluZm8tbGlzdCkpKSkpKQoKICAgIDs7IFByaW50IHRoZSByZXN1bHQuCiAgICAodGFidWxh
dGVkLWxpc3QtaW5pdC1oZWFkZXIpCiAgICAoc2V0cSB0YWJ1bGF0ZWQtbGlzdC1lbnRyaWVzCiAg
ICAgICAgICAobWFwY2FyICMncGFja2FnZS1tZW51LS1wcmludC1pbmZvLXNpbXBsZSBpbmZvLWxp
c3QpKSkpCgooZGVmdW4gcGFja2FnZS1hbGwta2V5d29yZHMgKCkKICAiQ29sbGVjdCBhbGwgcGFj
a2FnZSBrZXl3b3Jkcy4iCiAgKGxldCAoKGtleS1saXN0KSkKICAgIChwYWNrYWdlLS1tYXBjIChs
YW1iZGEgKGRlc2MpCiAgICAgICAgICAgICAgICAgICAgIChzZXRxIGtleS1saXN0IChhcHBlbmQg
KHBhY2thZ2UtZGVzYy0ta2V5d29yZHMgZGVzYykKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBrZXktbGlzdCkpKSkKICAgIGtleS1saXN0KSkKCihkZWZ1biBwYWNr
YWdlLS1tYXBjIChmdW5jdGlvbiAmb3B0aW9uYWwgcGFja2FnZXMpCiAgIkNhbGwgRlVOQ1RJT04g
Zm9yIGFsbCBrbm93biBQQUNLQUdFUy4KUEFDS0FHRVMgY2FuIGJlIG5pbCBvciB0LCB3aGljaCBt
ZWFucyB0byBkaXNwbGF5IGFsbCBrbm93bgpwYWNrYWdlcywgb3IgYSBsaXN0IG9mIHBhY2thZ2Vz
LgoKQnVpbHQtaW4gcGFja2FnZXMgYXJlIGNvbnZlcnRlZCB3aXRoIGBwYWNrYWdlLS1mcm9tLWJ1
aWx0aW4nLiIKICAodW5sZXNzIHBhY2thZ2VzIChzZXRxIHBhY2thZ2VzIHQpKQogIChsZXQgKG5h
bWUpCiAgICA7OyBJbnN0YWxsZWQgcGFja2FnZXM6CiAgICAoZG9saXN0IChlbHQgcGFja2FnZS1h
bGlzdCkKICAgICAgKHNldHEgbmFtZSAoY2FyIGVsdCkpCiAgICAgICh3aGVuIChvciAoZXEgcGFj
a2FnZXMgdCkgKG1lbXEgbmFtZSBwYWNrYWdlcykpCiAgICAgICAgKG1hcGMgZnVuY3Rpb24gKGNk
ciBlbHQpKSkpCgogICAgOzsgQnVpbHQtaW4gcGFja2FnZXM6CiAgICAoZG9saXN0IChlbHQgcGFj
a2FnZS0tYnVpbHRpbnMpCiAgICAgIChzZXRxIG5hbWUgKGNhciBlbHQpKQogICAgICAod2hlbiAo
YW5kIChub3QgKGVxIG5hbWUgJ2VtYWNzKSkgOyBIaWRlIHRoZSBgZW1hY3MnIHBhY2thZ2UuCiAg
ICAgICAgICAgICAgICAgKG9yIHBhY2thZ2UtbGlzdC11bnZlcnNpb25lZAogICAgICAgICAgICAg
ICAgICAgICAocGFja2FnZS0tYmktZGVzYy12ZXJzaW9uIChjZHIgZWx0KSkpCiAgICAgICAgICAg
ICAgICAgKG9yIChlcSBwYWNrYWdlcyB0KSAobWVtcSBuYW1lIHBhY2thZ2VzKSkpCiAgICAgICAg
KGZ1bmNhbGwgZnVuY3Rpb24gKHBhY2thZ2UtLWZyb20tYnVpbHRpbiBlbHQpKSkpCgogICAgOzsg
QXZhaWxhYmxlIGFuZCBkaXNhYmxlZCBwYWNrYWdlczoKICAgIChkb2xpc3QgKGVsdCBwYWNrYWdl
LWFyY2hpdmUtY29udGVudHMpCiAgICAgIChzZXRxIG5hbWUgKGNhciBlbHQpKQogICAgICAod2hl
biAob3IgKGVxIHBhY2thZ2VzIHQpIChtZW1xIG5hbWUgcGFja2FnZXMpKQogICAgICAgIChkb2xp
c3QgKHBrZyAoY2RyIGVsdCkpCiAgICAgICAgICA7OyBIaWRlIG9ic29sZXRlIHBhY2thZ2VzLgog
ICAgICAgICAgKHVubGVzcyAocGFja2FnZS1pbnN0YWxsZWQtcCAocGFja2FnZS1kZXNjLW5hbWUg
cGtnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNj
LXZlcnNpb24gcGtnKSkKICAgICAgICAoZnVuY2FsbCBmdW5jdGlvbiBwa2cpKSkpKSkpCgooZGVm
dW4gcGFja2FnZS0taGFzLWtleXdvcmQtcCAoZGVzYyAmb3B0aW9uYWwga2V5d29yZHMpCiAgIlRl
c3QgaWYgcGFja2FnZSBERVNDIGhhcyBhbnkgb2YgdGhlIGdpdmVuIEtFWVdPUkRTLgpXaGVuIG5v
bmUgYXJlIGdpdmVuLCB0aGUgcGFja2FnZSBtYXRjaGVzLiIKICAoaWYga2V5d29yZHMKICAgICAg
KGxldCAoKGRlc2Mta2V5d29yZHMgKGFuZCBkZXNjIChwYWNrYWdlLWRlc2MtLWtleXdvcmRzIGRl
c2MpKSkKICAgICAgICAgICAgZm91bmQpCiAgICAgICAgKHdoaWxlIChhbmQgKG5vdCBmb3VuZCkg
a2V5d29yZHMpCiAgICAgICAgICAobGV0ICgoayAocG9wIGtleXdvcmRzKSkpCiAgICAgICAgICAg
IChzZXRxIGZvdW5kCiAgICAgICAgICAgICAgICAgIChvciAoc3RyaW5nPSBrIChjb25jYXQgImFy
YzoiIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSBkZXNjKSkpCiAgICAgICAgICAgICAgICAgICAgICAo
c3RyaW5nPSBrIChjb25jYXQgInN0YXR1czoiIChwYWNrYWdlLWRlc2Mtc3RhdHVzIGRlc2MpKSkK
ICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgayBkZXNjLWtleXdvcmRzKSkpKSkKICAgICAg
ICBmb3VuZCkKICAgIHQpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tZGlzcGxheSAocmVtZW1iZXIt
cG9zIHN1ZmZpeCkKICAiRGlzcGxheSB0aGUgUGFja2FnZSBNZW51LgpJZiBSRU1FTUJFUi1QT1Mg
aXMgbm9uLW5pbCwga2VlcCBwb2ludCBvbiB0aGUgc2FtZSBlbnRyeS4KCklmIFNVRkZJWCBpcyBu
b24tbmlsLCBhcHBlbmQgdGhhdCB0byBcIlBhY2thZ2VcIiBmb3IgdGhlIGZpcnN0CmNvbHVtbiBp
biB0aGUgaGVhZGVyIGxpbmUuIgogIChzZXRmIChjYXIgKGFyZWYgdGFidWxhdGVkLWxpc3QtZm9y
bWF0IDApKQogICAgICAgIChpZiBzdWZmaXgKICAgICAgICAgICAgKGNvbmNhdCAiUGFja2FnZVsi
IHN1ZmZpeCAiXSIpCiAgICAgICAgICAiUGFja2FnZSIpKQogICh0YWJ1bGF0ZWQtbGlzdC1pbml0
LWhlYWRlcikKICAodGFidWxhdGVkLWxpc3QtcHJpbnQgcmVtZW1iZXItcG9zKSkKCihkZWZ1biBw
YWNrYWdlLW1lbnUtLWdlbmVyYXRlIChyZW1lbWJlci1wb3MgJm9wdGlvbmFsIHBhY2thZ2VzIGtl
eXdvcmRzKQogICJQb3B1bGF0ZSBhbmQgZGlzcGxheSB0aGUgUGFja2FnZSBNZW51LgpJZiBSRU1F
TUJFUi1QT1MgaXMgbm9uLW5pbCwga2VlcCBwb2ludCBvbiB0aGUgc2FtZSBlbnRyeS4KUEFDS0FH
RVMgc2hvdWxkIGJlIHQsIHdoaWNoIG1lYW5zIHRvIGRpc3BsYXkgYWxsIGtub3duIHBhY2thZ2Vz
LApvciBhIGxpc3Qgb2YgcGFja2FnZSBuYW1lcyAoc3ltYm9scykgdG8gZGlzcGxheS4KCldpdGgg
S0VZV09SRFMgZ2l2ZW4sIG9ubHkgcGFja2FnZXMgd2l0aCB0aG9zZSBrZXl3b3JkcyBhcmUKc2hv
d24uIgogIChwYWNrYWdlLW1lbnUtLXJlZnJlc2ggcGFja2FnZXMga2V5d29yZHMpCiAgKHBhY2th
Z2UtbWVudS0tZGlzcGxheSByZW1lbWJlci1wb3MKICAgICAgICAgICAgICAgICAgKHdoZW4ga2V5
d29yZHMKICAgICAgICAgICAgICAgICAgICAobGV0ICgoZmlsdGVycyAobWFwY29uY2F0ICMnaWRl
bnRpdHkga2V5d29yZHMgIiwiKSkpCiAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJQYWNr
YWdlWyIgZmlsdGVycyAiXSIpKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tcHJpbnQtaW5mbyAo
cGtnKQogICJSZXR1cm4gYSBwYWNrYWdlIGVudHJ5IHN1aXRhYmxlIGZvciBgdGFidWxhdGVkLWxp
c3QtZW50cmllcycuClBLRyBoYXMgdGhlIGZvcm0gKFBLRy1ERVNDIC4gU1RBVFVTKS4KUmV0dXJu
IChQS0ctREVTQyBbTkFNRSBWRVJTSU9OIFNUQVRVUyBET0NdKS4iCiAgKHBhY2thZ2UtbWVudS0t
cHJpbnQtaW5mby1zaW1wbGUgKGNhciBwa2cpKSkKKG1ha2Utb2Jzb2xldGUgJ3BhY2thZ2UtbWVu
dS0tcHJpbnQtaW5mbwogICAgICAgICAgICAgICAncGFja2FnZS1tZW51LS1wcmludC1pbmZvLXNp
bXBsZSAiMjUuMSIpCgoMCjs7OyBQYWNrYWdlIG1lbnUgZmFjZXMKCihkZWZmYWNlIHBhY2thZ2Ut
bmFtZQogICcoKHQgOmluaGVyaXQgbGluaykpCiAgIkZhY2UgdXNlZCBvbiBwYWNrYWdlIG5hbWVz
IGluIHRoZSBwYWNrYWdlIG1lbnUuIgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2th
Z2UtZGVzY3JpcHRpb24KICAnKCh0IDppbmhlcml0IGRlZmF1bHQpKQogICJGYWNlIHVzZWQgb24g
cGFja2FnZSBkZXNjcmlwdGlvbiBzdW1tYXJpZXMgaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAgOnZl
cnNpb24gIjI1LjEiKQoKOzsgU2hhbWUgdGhpcyBoeXBoZW5hdGVzICJidWlsdC1pbiIsIHdoZW4g
ImZvbnQtbG9jay1idWlsdGluLWZhY2UiIGRvZXNuJ3QuCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVz
LWJ1aWx0LWluCiAgJygodCA6aW5oZXJpdCBmb250LWxvY2stYnVpbHRpbi1mYWNlKSkKICAiRmFj
ZSB1c2VkIG9uIHRoZSBzdGF0dXMgYW5kIHZlcnNpb24gb2YgYnVpbHQtaW4gcGFja2FnZXMuIgog
IDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVzLWV4dGVybmFsCiAgJygo
dCA6aW5oZXJpdCBwYWNrYWdlLXN0YXR1cy1idWlsdC1pbikpCiAgIkZhY2UgdXNlZCBvbiB0aGUg
c3RhdHVzIGFuZCB2ZXJzaW9uIG9mIGV4dGVybmFsIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUu
MSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0YXR1cy1hdmFpbGFibGUKICAnKCh0IDppbmhlcml0IGRl
ZmF1bHQpKQogICJGYWNlIHVzZWQgb24gdGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBhdmFpbGFi
bGUgcGFja2FnZXMuIgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVz
LW5ldwogICcoKHQgOmluaGVyaXQgKGJvbGQgcGFja2FnZS1zdGF0dXMtYXZhaWxhYmxlKSkpCiAg
IkZhY2UgdXNlZCBvbiB0aGUgc3RhdHVzIGFuZCB2ZXJzaW9uIG9mIG5ldyBwYWNrYWdlcy4iCiAg
OnZlcnNpb24gIjI1LjEiKQoKKGRlZmZhY2UgcGFja2FnZS1zdGF0dXMtaGVsZAogICcoKHQgOmlu
aGVyaXQgZm9udC1sb2NrLWNvbnN0YW50LWZhY2UpKQogICJGYWNlIHVzZWQgb24gdGhlIHN0YXR1
cyBhbmQgdmVyc2lvbiBvZiBoZWxkIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUuMSIpCgooZGVm
ZmFjZSBwYWNrYWdlLXN0YXR1cy1kaXNhYmxlZAogICcoKHQgOmluaGVyaXQgZm9udC1sb2NrLXdh
cm5pbmctZmFjZSkpCiAgIkZhY2UgdXNlZCBvbiB0aGUgc3RhdHVzIGFuZCB2ZXJzaW9uIG9mIGRp
c2FibGVkIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUuMSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0
YXR1cy1pbnN0YWxsZWQKICAnKCh0IDppbmhlcml0IGZvbnQtbG9jay1jb21tZW50LWZhY2UpKQog
ICJGYWNlIHVzZWQgb24gdGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBpbnN0YWxsZWQgcGFja2Fn
ZXMuIgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVzLWZyb20tc291
cmNlCiAgJygodCA6aW5oZXJpdCBmb250LWxvY2stbmVnYXRpb24tY2hhci1mYWNlKSkKICAiRmFj
ZSB1c2VkIG9uIHRoZSBzdGF0dXMgYW5kIHZlcnNpb24gb2YgaW5zdGFsbGVkIHBhY2thZ2VzLiIK
ICA6dmVyc2lvbiAiMjkuMSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0YXR1cy1kZXBlbmRlbmN5CiAg
JygodCA6aW5oZXJpdCBwYWNrYWdlLXN0YXR1cy1pbnN0YWxsZWQpKQogICJGYWNlIHVzZWQgb24g
dGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBkZXBlbmRlbmN5IHBhY2thZ2VzLiIKICA6dmVyc2lv
biAiMjUuMSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0YXR1cy11bnNpZ25lZAogICcoKHQgOmluaGVy
aXQgZm9udC1sb2NrLXdhcm5pbmctZmFjZSkpCiAgIkZhY2UgdXNlZCBvbiB0aGUgc3RhdHVzIGFu
ZCB2ZXJzaW9uIG9mIHVuc2lnbmVkIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUuMSIpCgooZGVm
ZmFjZSBwYWNrYWdlLXN0YXR1cy1pbmNvbXBhdAogICcoKHQgOmluaGVyaXQgZXJyb3IpKQogICJG
YWNlIHVzZWQgb24gdGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBpbmNvbXBhdCBwYWNrYWdlcy4i
CiAgOnZlcnNpb24gIjI1LjEiKQoKKGRlZmZhY2UgcGFja2FnZS1zdGF0dXMtYXZhaWwtb2Jzbwog
ICcoKHQgOmluaGVyaXQgcGFja2FnZS1zdGF0dXMtaW5jb21wYXQpKQogICJGYWNlIHVzZWQgb24g
dGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBhdmFpbC1vYnNvIHBhY2thZ2VzLiIKICA6dmVyc2lv
biAiMjUuMSIpCgoMCjs7OyBQYWNrYWdlIG1lbnUgcHJpbnRpbmcKCihkZWZ1biBwYWNrYWdlLW1l
bnUtLXByaW50LWluZm8tc2ltcGxlIChwa2cpCiAgIlJldHVybiBhIHBhY2thZ2UgZW50cnkgc3Vp
dGFibGUgZm9yIGB0YWJ1bGF0ZWQtbGlzdC1lbnRyaWVzJy4KUEtHIGlzIGEgYHBhY2thZ2UtZGVz
Yycgb2JqZWN0LgpSZXR1cm4gKFBLRy1ERVNDIFtOQU1FIFZFUlNJT04gU1RBVFVTIERPQ10pLiIK
ICAobGV0KiAoKHN0YXR1cyAgKHBhY2thZ2UtZGVzYy1zdGF0dXMgcGtnKSkKICAgICAgICAgKGZh
Y2UgKHBjYXNlIHN0YXR1cwogICAgICAgICAgICAgICAgICgiYnVpbHQtaW4iICAncGFja2FnZS1z
dGF0dXMtYnVpbHQtaW4pCiAgICAgICAgICAgICAgICAgKCJleHRlcm5hbCIgICdwYWNrYWdlLXN0
YXR1cy1leHRlcm5hbCkKICAgICAgICAgICAgICAgICAoImF2YWlsYWJsZSIgJ3BhY2thZ2Utc3Rh
dHVzLWF2YWlsYWJsZSkKICAgICAgICAgICAgICAgICAoImF2YWlsLW9ic28iICdwYWNrYWdlLXN0
YXR1cy1hdmFpbC1vYnNvKQogICAgICAgICAgICAgICAgICgibmV3IiAgICAgICAncGFja2FnZS1z
dGF0dXMtbmV3KQogICAgICAgICAgICAgICAgICgiaGVsZCIgICAgICAncGFja2FnZS1zdGF0dXMt
aGVsZCkKICAgICAgICAgICAgICAgICAoImRpc2FibGVkIiAgJ3BhY2thZ2Utc3RhdHVzLWRpc2Fi
bGVkKQogICAgICAgICAgICAgICAgICgiaW5zdGFsbGVkIiAncGFja2FnZS1zdGF0dXMtaW5zdGFs
bGVkKQogICAgICAgICAgICAgICAgICgic291cmNlIiAgICAncGFja2FnZS1zdGF0dXMtZnJvbS1z
b3VyY2UpCiAgICAgICAgICAgICAgICAgKCJkZXBlbmRlbmN5IiAncGFja2FnZS1zdGF0dXMtZGVw
ZW5kZW5jeSkKICAgICAgICAgICAgICAgICAoInVuc2lnbmVkIiAgJ3BhY2thZ2Utc3RhdHVzLXVu
c2lnbmVkKQogICAgICAgICAgICAgICAgICgiaW5jb21wYXQiICAncGFja2FnZS1zdGF0dXMtaW5j
b21wYXQpCiAgICAgICAgICAgICAgICAgKF8gICAgICAgICAgICAnZm9udC1sb2NrLXdhcm5pbmct
ZmFjZSkpKSkgOyBvYnNvbGV0ZS4KICAgIChsaXN0IHBrZwogICAgICAgICAgYFsoLChzeW1ib2wt
bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnKSkKICAgICAgICAgICAgIGZhY2UgcGFja2FnZS1u
YW1lCiAgICAgICAgICAgICBmb250LWxvY2stZmFjZSBwYWNrYWdlLW5hbWUKICAgICAgICAgICAg
IGZvbGxvdy1saW5rIHQKICAgICAgICAgICAgIHBhY2thZ2UtZGVzYyAscGtnCiAgICAgICAgICAg
ICBhY3Rpb24gcGFja2FnZS1tZW51LWRlc2NyaWJlLXBhY2thZ2UpCiAgICAgICAgICAgICwocHJv
cGVydGl6ZQogICAgICAgICAgICAgIChpZiAocGFja2FnZS12Yy1wIHBrZykKICAgICAgICAgICAg
ICAgICAgKHByb2duCiAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmUgJ3BhY2thZ2UtdmMpCiAg
ICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtdmMtY29tbWl0IHBrZykpCiAgICAgICAgICAgICAg
ICAocGFja2FnZS12ZXJzaW9uLWpvaW4KICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXZl
cnNpb24gcGtnKSkpCiAgICAgICAgICAgICAgJ2ZvbnQtbG9jay1mYWNlIGZhY2UpCiAgICAgICAg
ICAgICwocHJvcGVydGl6ZSBzdGF0dXMgJ2ZvbnQtbG9jay1mYWNlIGZhY2UpCiAgICAgICAgICAg
ICwocHJvcGVydGl6ZSAob3IgKHBhY2thZ2UtZGVzYy1hcmNoaXZlIHBrZykgIiIpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWxvY2stZmFjZSBmYWNlKQogICAgICAg
ICAgICAsKHByb3BlcnRpemUgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBrZykKICAgICAgICAgICAg
ICAgICAgICAgICAgICdmb250LWxvY2stZmFjZSAncGFja2FnZS1kZXNjcmlwdGlvbildKSkpCgoo
ZGVmdmFyIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMgbmlsCiAgImBwYWNrYWdl
LWFyY2hpdmUtY29udGVudHMnIGJlZm9yZSB0aGUgbGF0ZXN0IHJlZnJlc2guIikKCihkZWZ1biBw
YWNrYWdlLW1lbnUtLXJlZnJlc2gtY29udGVudHMgKCZvcHRpb25hbCBfYXJnIF9ub2NvbmZpcm0p
CiAgIkluIFBhY2thZ2UgTWVudSwgZG93bmxvYWQgdGhlIEVtYWNzIExpc3AgcGFja2FnZSBhcmNo
aXZlLgpGZXRjaCB0aGUgY29udGVudHMgb2YgZWFjaCBhcmNoaXZlIHNwZWNpZmllZCBpbgpgcGFj
a2FnZS1hcmNoaXZlcycsIGFuZCB0aGVuIHJlZnJlc2ggdGhlIHBhY2thZ2UgbWVudS4KCmBwYWNr
YWdlLW1lbnUtbW9kZScgc2V0cyBgcmV2ZXJ0LWJ1ZmZlci1mdW5jdGlvbicgdG8gdGhpcwpmdW5j
dGlvbi4gIFRoZSBhcmdzIEFSRyBhbmQgTk9DT05GSVJNLCBwYXNzZWQgZnJvbQpgcmV2ZXJ0LWJ1
ZmZlcicsIGFyZSBpZ25vcmVkLiIKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2Rl
KQogIChzZXRxIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMgcGFja2FnZS1hcmNo
aXZlLWNvbnRlbnRzKQogIChzZXRxIHBhY2thZ2UtbWVudS0tbmV3LXBhY2thZ2UtbGlzdCBuaWwp
CiAgKHBhY2thZ2UtcmVmcmVzaC1jb250ZW50cyBwYWNrYWdlLW1lbnUtYXN5bmMpKQooZGVmaW5l
LW9ic29sZXRlLWZ1bmN0aW9uLWFsaWFzICdwYWNrYWdlLW1lbnUtcmVmcmVzaCAncmV2ZXJ0LWJ1
ZmZlciAiMjcuMSIpCgooZGVmdW4gcGFja2FnZS1tZW51LWhpZGUtcGFja2FnZSAoKQogICJIaWRl
IGluIFBhY2thZ2UgTWVudSBwYWNrYWdlcyB0aGF0IG1hdGNoIGEgcmVnZXhwLgpQcm9tcHQgZm9y
IHRoZSByZWdleHAgdG8gbWF0Y2ggYWdhaW5zdCBwYWNrYWdlIG5hbWVzLgpUaGUgZGVmYXVsdCBy
ZWdleHAgd2lsbCBoaWRlIG9ubHkgdGhlIHBhY2thZ2Ugd2hvc2UgbmFtZSBpcyBhdCBwb2ludC4K
ClRoZSByZWdleHAgaXMgYWRkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIHVzZXIgb3B0aW9uCmBwYWNr
YWdlLWhpZGRlbi1yZWdleHBzJyBhbmQgc2F2ZWQgZm9yIGZ1dHVyZSBzZXNzaW9ucy4KClRvIHVu
aGlkZSBhIHBhY2thZ2UsIHR5cGUKYFxcW2N1c3RvbWl6ZS12YXJpYWJsZV0gUkVUIHBhY2thZ2Ut
aGlkZGVuLXJlZ2V4cHMnLgoKVHlwZSBcXFtwYWNrYWdlLW1lbnUtdG9nZ2xlLWhpZGluZ10gdG8g
dG9nZ2xlIHBhY2thZ2UgaGlkaW5nLiIKICAoZGVjbGFyZSAoaW50ZXJhY3RpdmUtb25seSAiY2hh
bmdlIGBwYWNrYWdlLWhpZGRlbi1yZWdleHBzJyBpbnN0ZWFkLiIpKQogIChpbnRlcmFjdGl2ZSBu
aWwgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9k
ZSkKICAobGV0KiAoKG5hbWUgKHdoZW4gKGRlcml2ZWQtbW9kZS1wICdwYWNrYWdlLW1lbnUtbW9k
ZSkKICAgICAgICAgICAgICAgICAoY29uY2F0ICJcXGAiIChyZWdleHAtcXVvdGUgKHN5bWJvbC1u
YW1lIChwYWNrYWdlLWRlc2MtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICh0YWJ1bGF0ZWQtbGlzdC1nZXQtaWQpKSkpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAiXFwnIikpKQogICAgICAgICAocmUgKHJlYWQtc3RyaW5nICJI
aWRlIHBhY2thZ2VzIG1hdGNoaW5nIHJlZ2V4cDogIiBuYW1lKSkpCiAgICA7OyBUZXN0IGlmIGl0
IGlzIHZhbGlkLgogICAgKHN0cmluZy1tYXRjaCByZSAiIikKICAgIChwdXNoIHJlIHBhY2thZ2Ut
aGlkZGVuLXJlZ2V4cHMpCiAgICAoY3VzdG9taXplLXNhdmUtdmFyaWFibGUgJ3BhY2thZ2UtaGlk
ZGVuLXJlZ2V4cHMgcGFja2FnZS1oaWRkZW4tcmVnZXhwcykKICAgIChwYWNrYWdlLW1lbnUtLXBv
c3QtcmVmcmVzaCkKICAgIChsZXQgKChoaWRkZW4KICAgICAgICAgICAoY2wtcmVtb3ZlLWlmLW5v
dCAobGFtYmRhIChlKSAoc3RyaW5nLW1hdGNoIHJlIChzeW1ib2wtbmFtZSAoY2FyIGUpKSkpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkpCiAg
ICAgIChtZXNzYWdlICJQYWNrYWdlcyB0byBoaWRlOiAlZC4gIFR5cGUgYCVzJyB0byB0b2dnbGUg
b3IgYCVzJyB0byBjdXN0b21pemUiCiAgICAgICAgICAgICAgIChsZW5ndGggaGlkZGVuKQogICAg
ICAgICAgICAgICAoc3Vic3RpdHV0ZS1jb21tYW5kLWtleXMgIlxcW3BhY2thZ2UtbWVudS10b2dn
bGUtaGlkaW5nXSIpCiAgICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNvbW1hbmQta2V5cyAiXFxb
Y3VzdG9taXplLXZhcmlhYmxlXSBSRVQgcGFja2FnZS1oaWRkZW4tcmVnZXhwcyIpKSkpKQoKCihk
ZWZ1biBwYWNrYWdlLW1lbnUtZGVzY3JpYmUtcGFja2FnZSAoJm9wdGlvbmFsIGJ1dHRvbikKICAi
RGVzY3JpYmUgdGhlIGN1cnJlbnQgcGFja2FnZS4KSWYgb3B0aW9uYWwgYXJnIEJVVFRPTiBpcyBu
b24tbmlsLCBkZXNjcmliZSBpdHMgYXNzb2NpYXRlZCBwYWNrYWdlLiIKICAoaW50ZXJhY3RpdmUg
bmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChsZXQgKChwa2ctZGVzYyAoaWYgYnV0dG9uIChidXR0
b24tZ2V0IGJ1dHRvbiAncGFja2FnZS1kZXNjKQogICAgICAgICAgICAgICAgICAgICh0YWJ1bGF0
ZWQtbGlzdC1nZXQtaWQpKSkpCiAgICAoaWYgcGtnLWRlc2MKICAgICAgICAoZGVzY3JpYmUtcGFj
a2FnZSBwa2ctZGVzYykKICAgICAgKHVzZXItZXJyb3IgIk5vIHBhY2thZ2UgaGVyZSIpKSkpCgo7
OyBmaXhtZSBudW1lcmljIGFyZ3VtZW50CihkZWZ1biBwYWNrYWdlLW1lbnUtbWFyay1kZWxldGUg
KCZvcHRpb25hbCBfbnVtKQogICJNYXJrIGEgcGFja2FnZSBmb3IgZGVsZXRpb24gYW5kIG1vdmUg
dG8gdGhlIG5leHQgbGluZS4iCiAgKGludGVyYWN0aXZlICJwIiBwYWNrYWdlLW1lbnUtbW9kZSkK
ICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChpZiAobWVtYmVyIChwYWNr
YWdlLW1lbnUtZ2V0LXN0YXR1cykKICAgICAgICAgICAgICAnKCJpbnN0YWxsZWQiICJzb3VyY2Ui
ICJkZXBlbmRlbmN5IiAib2Jzb2xldGUiICJ1bnNpZ25lZCIpKQogICAgICAodGFidWxhdGVkLWxp
c3QtcHV0LXRhZyAiRCIgdCkKICAgIChmb3J3YXJkLWxpbmUpKSkKCihkZWZ1biBwYWNrYWdlLW1l
bnUtbWFyay1pbnN0YWxsICgmb3B0aW9uYWwgX251bSkKICAiTWFyayBhIHBhY2thZ2UgZm9yIGlu
c3RhbGxhdGlvbiBhbmQgbW92ZSB0byB0aGUgbmV4dCBsaW5lLiIKICAoaW50ZXJhY3RpdmUgInAi
IHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUp
CiAgKGlmIChtZW1iZXIgKHBhY2thZ2UtbWVudS1nZXQtc3RhdHVzKSAnKCJhdmFpbGFibGUiICJh
dmFpbC1vYnNvIiAibmV3IiAiZGVwZW5kZW5jeSIpKQogICAgICAodGFidWxhdGVkLWxpc3QtcHV0
LXRhZyAiSSIgdCkKICAgIChmb3J3YXJkLWxpbmUpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtbWFy
ay11bm1hcmsgKCZvcHRpb25hbCBfbnVtKQogICJDbGVhciBhbnkgbWFya3Mgb24gYSBwYWNrYWdl
IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUuIgogIChpbnRlcmFjdGl2ZSAicCIgcGFja2FnZS1t
ZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9kZSkKICAodGFidWxh
dGVkLWxpc3QtcHV0LXRhZyAiICIgdCkpCgooZGVmdW4gcGFja2FnZS1tZW51LWJhY2t1cC11bm1h
cmsgKCkKICAiQmFjayB1cCBvbmUgbGluZSBhbmQgY2xlYXIgYW55IG1hcmtzIG9uIHRoYXQgcGFj
a2FnZS4iCiAgKGludGVyYWN0aXZlIG5pbCBwYWNrYWdlLW1lbnUtbW9kZSkKICAocGFja2FnZS0t
ZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChmb3J3YXJkLWxpbmUgLTEpCiAgKHRhYnVsYXRl
ZC1saXN0LXB1dC10YWcgIiAiKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtbWFyay1vYnNvbGV0ZS1m
b3ItZGVsZXRpb24gKCkKICAiTWFyayBhbGwgb2Jzb2xldGUgcGFja2FnZXMgZm9yIGRlbGV0aW9u
LiIKICAoaW50ZXJhY3RpdmUgbmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1
cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKHNhdmUtZXhjdXJzaW9uCiAgICAoZ290by1jaGFyIChw
b2ludC1taW4pKQogICAgKHdoaWxlIChub3QgKGVvYnApKQogICAgICAoaWYgKGVxdWFsIChwYWNr
YWdlLW1lbnUtZ2V0LXN0YXR1cykgIm9ic29sZXRlIikKICAgICAgICAgICh0YWJ1bGF0ZWQtbGlz
dC1wdXQtdGFnICJEIiB0KQogICAgICAgIChmb3J3YXJkLWxpbmUgMSkpKSkpCgooZGVmdmFyIHBh
Y2thZ2UtLXF1aWNrLWhlbHAta2V5cwogICcoKCgibWFyayBmb3IgaW5zdGFsbGF0aW9uLCIgLiA5
KQogICAgICgibWFyayBmb3IgZGVsZXRpb24sIiAuIDkpICJ1bm1hcmssIiAoImV4ZWN1dGUgbWFy
a2VkIGFjdGlvbnMiIC4gMSkpCiAgICAoIm5leHQsIiAicHJldmlvdXMiKQogICAgKCJIaWRlLXBh
Y2thZ2UsIiAiKC10b2dnbGUtaGlkZGVuIikKICAgICgiZy1yZWZyZXNoLWNvbnRlbnRzLCIgIi8t
ZmlsdGVyLCIgImhlbHAiKSkpCgooZGVmdW4gcGFja2FnZS0tcHJldHRpZnktcXVpY2staGVscC1r
ZXkgKGRlc2MpCiAgIlByZXR0aWZ5IERFU0MgdG8gYmUgZGlzcGxheWVkIGFzIGEgaGVscCBtZW51
LiIKICAoaWYgKGxpc3RwIGRlc2MpCiAgICAgIChpZiAobGlzdHAgKGNkciBkZXNjKSkKICAgICAg
ICAgIChtYXBjb25jYXQgIydwYWNrYWdlLS1wcmV0dGlmeS1xdWljay1oZWxwLWtleSBkZXNjICIg
ICAiKQogICAgICAgIChsZXQgKChwbGFjZSAoY2RyIGRlc2MpKQogICAgICAgICAgICAgIChvdXQg
KGNvcHktc2VxdWVuY2UgKGNhciBkZXNjKSkpKQogICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRp
ZXMgcGxhY2UgKDErIHBsYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhmYWNl
IGhlbHAta2V5LWJpbmRpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQpCiAg
ICAgICAgICBvdXQpKQogICAgKHBhY2thZ2UtLXByZXR0aWZ5LXF1aWNrLWhlbHAta2V5IChjb25z
IGRlc2MgMCkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtcXVpY2staGVscCAoKQogICJTaG93IHNo
b3J0IGtleSBiaW5kaW5nIGhlbHAgZm9yIGBwYWNrYWdlLW1lbnUtbW9kZScuClRoZSBmdWxsIGxp
c3Qgb2Yga2V5cyBjYW4gYmUgdmlld2VkIHdpdGggXFxbZGVzY3JpYmUtbW9kZV0uIgogIChpbnRl
cmFjdGl2ZSBuaWwgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdl
LW1lbnUtbW9kZSkKICAobWVzc2FnZSAobWFwY29uY2F0ICMncGFja2FnZS0tcHJldHRpZnktcXVp
Y2staGVscC1rZXkKICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UtLXF1aWNrLWhlbHAta2V5
cyAiXG4iKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LWdldC1zdGF0dXMgKCkKICAiUmV0dXJuIHN0
YXR1cyB0ZXh0IG9mIHBhY2thZ2UgYXQgcG9pbnQgaW4gUGFja2FnZSBNZW51LiIKICAocGFja2Fn
ZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChsZXQqICgoaWQgKHRhYnVsYXRlZC1saXN0
LWdldC1pZCkpCiAgICAgICAgIChlbnRyeSAoYW5kIGlkIChhc3NvYyBpZCB0YWJ1bGF0ZWQtbGlz
dC1lbnRyaWVzKSkpKQogICAgKGlmIGVudHJ5CiAgICAgICAgKGFyZWYgKGNhZHIgZW50cnkpIDIp
CiAgICAgICIiKSkpCgooZGVmdW4gcGFja2FnZS1hcmNoaXZlLXByaW9yaXR5IChhcmNoaXZlKQog
ICJSZXR1cm4gdGhlIHByaW9yaXR5IG9mIEFSQ0hJVkUuCgpUaGUgYXJjaGl2ZSBwcmlvcml0aWVz
IGFyZSBzcGVjaWZpZWQgaW4KYHBhY2thZ2UtYXJjaGl2ZS1wcmlvcml0aWVzJy4gIElmIG5vdCBn
aXZlbiB0aGVyZSwgdGhlIHByaW9yaXR5CmRlZmF1bHRzIHRvIDAuIgogIChvciAoY2RyIChhc3Nv
YyBhcmNoaXZlIHBhY2thZ2UtYXJjaGl2ZS1wcmlvcml0aWVzKSkKICAgICAgMCkpCgooZGVmdW4g
cGFja2FnZS1kZXNjLXByaW9yaXR5LXZlcnNpb24gKHBrZy1kZXNjKQogICJSZXR1cm4gdGhlIHZl
cnNpb24gUEtHLURFU0Mgd2l0aCB0aGUgYXJjaGl2ZSBwcmlvcml0eSBwcmVwZW5kZWQuCgpUaGlz
IGFsbG93cyBmb3IgZWFzeSBjb21wYXJpc29uIG9mIHBhY2thZ2UgdmVyc2lvbnMgZnJvbQpkaWZm
ZXJlbnQgYXJjaGl2ZXMgaWYgYXJjaGl2ZSBwcmlvcml0aWVzIGFyZSBtZWFudCB0byBiZSB0YWtl
biBpbgpjb25zaWRlcmF0aW9uLiIKICAoY29ucyAocGFja2FnZS1kZXNjLXByaW9yaXR5IHBrZy1k
ZXNjKQogICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBwa2ctZGVzYykpKQoKKGRlZnVuIHBh
Y2thZ2UtbWVudS0tZmluZC11cGdyYWRlcyAoKQogICJJbiBQYWNrYWdlIE1lbnUsIHJldHVybiBh
biBhbGlzdCBvZiBwYWNrYWdlcyB0aGF0IGNhbiBiZSB1cGdyYWRlZC4KVGhlIGFsaXN0IGhhcyB0
aGUgc2FtZSBmb3JtIGFzIGBwYWNrYWdlLWFsaXN0JywgbmFtZWx5IGEgbGlzdApvZiAoUEtHIC4g
REVTQ1MpLCBidXQgd2hlcmUgREVTQ1MgaXMgdGhlIGBwYWNrYWdlLWRlc2MnIG9iamVjdApjb3Jy
ZXNwb25kaW5nIHRvIHRoZSBuZXdlciB2ZXJzaW9uLiIKICAobGV0IChpbnN0YWxsZWQgYXZhaWxh
YmxlIHVwZ3JhZGVzKQogICAgOzsgQnVpbGQgbGlzdCBvZiBpbnN0YWxsZWQvYXZhaWxhYmxlIHBh
Y2thZ2VzIGluIHRoaXMgYnVmZmVyLgogICAgKGRvbGlzdCAoZW50cnkgdGFidWxhdGVkLWxpc3Qt
ZW50cmllcykKICAgICAgOzsgRU5UUlkgaXMgKFBLRy1ERVNDIFtOQU1FIFZFUlNJT04gU1RBVFVT
IERPQ10pCiAgICAgIChsZXQgKChwa2ctZGVzYyAoY2FyIGVudHJ5KSkKICAgICAgICAgICAgKHN0
YXR1cyAoYXJlZiAoY2FkciBlbnRyeSkgMikpKQogICAgICAgIChjb25kICgobWVtYmVyIHN0YXR1
cyAnKCJpbnN0YWxsZWQiICJkZXBlbmRlbmN5IiAidW5zaWduZWQiICJleHRlcm5hbCIpKQogICAg
ICAgICAgICAgICAocHVzaCBwa2ctZGVzYyBpbnN0YWxsZWQpKQogICAgICAgICAgICAgICgobWVt
YmVyIHN0YXR1cyAnKCJhdmFpbGFibGUiICJuZXciKSkKICAgICAgICAgICAgICAgKHNldHEgYXZh
aWxhYmxlIChwYWNrYWdlLS1hcHBlbmQtdG8tYWxpc3QgcGtnLWRlc2MgYXZhaWxhYmxlKSkpKSkp
CiAgICA7OyBMb29wIHRocm91Z2ggbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMsIGZpbmRpbmcg
dXBncmFkZXMuCiAgICAoZG9saXN0IChwa2ctZGVzYyBpbnN0YWxsZWQpCiAgICAgIChsZXQqICgo
bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAgICAgKGF2YWlsLXBr
ZyAoY2FkciAoYXNzcSBuYW1lIGF2YWlsYWJsZSkpKSkKICAgICAgICAoYW5kIGF2YWlsLXBrZwog
ICAgICAgICAgICAgKHZlcnNpb24tbGlzdC08IChwYWNrYWdlLWRlc2MtcHJpb3JpdHktdmVyc2lv
biBwa2ctZGVzYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXBy
aW9yaXR5LXZlcnNpb24gYXZhaWwtcGtnKSkKICAgICAgICAgICAgIChwdXNoIChjb25zIG5hbWUg
YXZhaWwtcGtnKSB1cGdyYWRlcykpKSkKICAgIHVwZ3JhZGVzKSkKCihkZWZ2YXIgcGFja2FnZS1t
ZW51LS1tYXJrLXVwZ3JhZGVzLXBlbmRpbmcgbmlsCiAgIldoZXRoZXIgbWFyay11cGdyYWRlcyBp
cyB3YWl0aW5nIGZvciBhIHJlZnJlc2ggdG8gZmluaXNoLiIpCgooZGVmdW4gcGFja2FnZS1tZW51
LS1tYXJrLXVwZ3JhZGVzLTEgKCkKICAiTWFyayBhbGwgdXBncmFkYWJsZSBwYWNrYWdlcyBpbiB0
aGUgUGFja2FnZSBNZW51LgpJbXBsZW1lbnRhdGlvbiBvZiBgcGFja2FnZS1tZW51LW1hcmstdXBn
cmFkZXMnLiIKICAoc2V0cSBwYWNrYWdlLW1lbnUtLW1hcmstdXBncmFkZXMtcGVuZGluZyBuaWwp
CiAgKGxldCAoKHVwZ3JhZGVzIChwYWNrYWdlLW1lbnUtLWZpbmQtdXBncmFkZXMpKSkKICAgIChp
ZiAobnVsbCB1cGdyYWRlcykKICAgICAgICAobWVzc2FnZSAiTm8gcGFja2FnZXMgdG8gdXBncmFk
ZSIpCiAgICAgICh3aWRlbikKICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgKGdvdG8tY2hh
ciAocG9pbnQtbWluKSkKICAgICAgICAod2hpbGUgKG5vdCAoZW9icCkpCiAgICAgICAgICAobGV0
KiAoKHBrZy1kZXNjICh0YWJ1bGF0ZWQtbGlzdC1nZXQtaWQpKQogICAgICAgICAgICAgICAgICh1
cGdyYWRlIChjZHIgKGFzc3EgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKSB1cGdyYWRlcykp
KSkKICAgICAgICAgICAgKGNvbmQgKChudWxsIHVwZ3JhZGUpCiAgICAgICAgICAgICAgICAgICAo
Zm9yd2FyZC1saW5lIDEpKQogICAgICAgICAgICAgICAgICAoKGVxdWFsIHBrZy1kZXNjIHVwZ3Jh
ZGUpCiAgICAgICAgICAgICAgICAgICAocGFja2FnZS1tZW51LW1hcmstaW5zdGFsbCkpCiAgICAg
ICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAocGFja2FnZS1tZW51LW1hcmstZGVs
ZXRlKSkpKSkpCiAgICAgIChtZXNzYWdlICJQYWNrYWdlcyBtYXJrZWQgZm9yIHVwZ3JhZGluZzog
JWQiCiAgICAgICAgICAgICAgIChsZW5ndGggdXBncmFkZXMpKSkpKQoKCihkZWZ1biBwYWNrYWdl
LW1lbnUtbWFyay11cGdyYWRlcyAoKQogICJNYXJrIGFsbCB1cGdyYWRhYmxlIHBhY2thZ2VzIGlu
IHRoZSBQYWNrYWdlIE1lbnUuCkZvciBlYWNoIGluc3RhbGxlZCBwYWNrYWdlIHdpdGggYSBuZXdl
ciB2ZXJzaW9uIGF2YWlsYWJsZSwgcGxhY2UKYW4gKEkpbnN0YWxsIGZsYWcgb24gdGhlIGF2YWls
YWJsZSB2ZXJzaW9uIGFuZCBhIChEKWVsZXRlIGZsYWcgb24KdGhlIGluc3RhbGxlZCB2ZXJzaW9u
LiAgQSBzdWJzZXF1ZW50IFxcW3BhY2thZ2UtbWVudS1leGVjdXRlXQpjYWxsIHdpbGwgdXBncmFk
ZSB0aGUgcGFja2FnZS4KCklmIHRoZXJlJ3MgYW4gYXN5bmMgcmVmcmVzaCBvcGVyYXRpb24gaW4g
cHJvZ3Jlc3MsIHRoZSBmbGFncyB3aWxsCmJlIHBsYWNlZCBhcyBwYXJ0IG9mIGBwYWNrYWdlLW1l
bnUtLXBvc3QtcmVmcmVzaCcgaW5zdGVhZCBvZgppbW1lZGlhdGVseS4iCiAgKGludGVyYWN0aXZl
IG5pbCBwYWNrYWdlLW1lbnUtbW9kZSkKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1t
b2RlKQogIChpZiAobm90IHBhY2thZ2UtLWRvd25sb2Fkcy1pbi1wcm9ncmVzcykKICAgICAgKHBh
Y2thZ2UtbWVudS0tbWFyay11cGdyYWRlcy0xKQogICAgKHNldHEgcGFja2FnZS1tZW51LS1tYXJr
LXVwZ3JhZGVzLXBlbmRpbmcgdCkKICAgIChtZXNzYWdlICJXYWl0aW5nIGZvciByZWZyZXNoIHRv
IGZpbmlzaC4uLiIpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLWxpc3QtdG8tcHJvbXB0IChwYWNr
YWdlcyAmb3B0aW9uYWwgaW5jbHVkZS1kZXBlbmRlbmNpZXMpCiAgIlJldHVybiBhIHN0cmluZyBs
aXN0aW5nIFBBQ0tBR0VTIHRoYXQncyB1c2FibGUgaW4gYSBwcm9tcHQuClBBQ0tBR0VTIGlzIGEg
bGlzdCBvZiBgcGFja2FnZS1kZXNjJyBvYmplY3RzLgpGb3JtYXRzIHRoZSByZXR1cm5lZCBzdHJp
bmcgdG8gYmUgdXNhYmxlIGluIGEgbWluaWJ1ZmZlcgpwcm9tcHQgKHNlZSBgcGFja2FnZS1tZW51
LS1wcm9tcHQtdHJhbnNhY3Rpb24tcCcpLgoKSWYgSU5DTFVERS1ERVBFTkRFTkNJRVMsIGFsc28g
aW5jbHVkZSB0aGUgbnVtYmVyIG9mIHVuaW5zdGFsbGVkCmRlcGVuZGVuY2llcy4iCiAgOzsgVGhl
IGNhc2Ugd2hlcmUgYHBhY2thZ2UnIGlzIGVtcHR5IGlzIGhhbmRsZWQgaW4KICA7OyBgcGFja2Fn
ZS1tZW51LS1wcm9tcHQtdHJhbnNhY3Rpb24tcCcgYmVsb3cuCiAgKGZvcm1hdCAiJWQgKCVzKSVz
IgogICAgICAgICAgKGxlbmd0aCBwYWNrYWdlcykKICAgICAgICAgIChtYXBjb25jYXQgIydwYWNr
YWdlLWRlc2MtZnVsbC1uYW1lIHBhY2thZ2VzICIgIikKICAgICAgICAgIChsZXQgKChkZXBzCiAg
ICAgICAgICAgICAgICAgKHNlcS1yZW1vdmUKICAgICAgICAgICAgICAgICAgIydwYWNrYWdlLWlu
c3RhbGxlZC1wCiAgICAgICAgICAgICAgICAgIChkZWxldGUtZHVwcwogICAgICAgICAgICAgICAg
ICAgKGFwcGx5CiAgICAgICAgICAgICAgICAgICAgIyduY29uYwogICAgICAgICAgICAgICAgICAg
IChtYXBjYXIgKGxhbWJkYSAocGFja2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHBhY2thZ2UtLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBh
Y2thZ2UtZGVzYy1uYW1lIHBhY2thZ2UpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBh
Y2thZ2VzKSkpKSkpCiAgICAgICAgICAgIChpZiAoYW5kIGluY2x1ZGUtZGVwZW5kZW5jaWVzIGRl
cHMpCiAgICAgICAgICAgICAgICAoaWYgKGxlbmd0aD0gZGVwcyAxKQogICAgICAgICAgICAgICAg
ICAgIChmb3JtYXQgIiBwbHVzIDEgZGVwZW5kZW5jeSIpCiAgICAgICAgICAgICAgICAgIChmb3Jt
YXQgIiBwbHVzICVkIGRlcGVuZGVuY2llcyIgKGxlbmd0aCBkZXBzKSkpCiAgICAgICAgICAgICAg
IiIpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS1wcm9tcHQtdHJhbnNhY3Rpb24tcCAoZGVsZXRl
IGluc3RhbGwgdXBncmFkZSkKICAiUHJvbXB0IHRoZSB1c2VyIGFib3V0IERFTEVURSwgSU5TVEFM
TCwgYW5kIFVQR1JBREUuCkRFTEVURSwgSU5TVEFMTCwgYW5kIFVQR1JBREUgYXJlIGxpc3RzIG9m
IGBwYWNrYWdlLWRlc2MnIG9iamVjdHMuCkVpdGhlciBtYXkgYmUgbmlsLCBidXQgbm90IGFsbC4i
CiAgKHktb3Itbi1wCiAgIChjb25jYXQKICAgICh3aGVuIGRlbGV0ZQogICAgICAoZm9ybWF0ICJQ
YWNrYWdlcyB0byBkZWxldGU6ICVzLiAgIgogICAgICAgICAgICAgIChwYWNrYWdlLW1lbnUtLWxp
c3QtdG8tcHJvbXB0IGRlbGV0ZSkpKQogICAgKHdoZW4gaW5zdGFsbAogICAgICAoZm9ybWF0ICJQ
YWNrYWdlcyB0byBpbnN0YWxsOiAlcy4gICIKICAgICAgICAgICAgICAocGFja2FnZS1tZW51LS1s
aXN0LXRvLXByb21wdCBpbnN0YWxsIHQpKSkKICAgICh3aGVuIHVwZ3JhZGUKICAgICAgKGZvcm1h
dCAiUGFja2FnZXMgdG8gdXBncmFkZTogJXMuICAiCiAgICAgICAgICAgICAgKHBhY2thZ2UtbWVu
dS0tbGlzdC10by1wcm9tcHQgdXBncmFkZSkpKQogICAgIlByb2NlZWQ/ICIpKSkKCgooZGVmdW4g
cGFja2FnZS1tZW51LS1wYXJ0aXRpb24tdHJhbnNhY3Rpb24gKGluc3RhbGwgZGVsZXRlKQogICJS
ZXR1cm4gYW4gYWxpc3QgZGVzY3JpYmluZyBhbiBJTlNUQUxMIERFTEVURSB0cmFuc2FjdGlvbi4K
QWxpc3QgY29udGFpbnMgdGhyZWUgZW50cmllcywgdXBncmFkZSwgZGVsZXRlLCBhbmQgaW5zdGFs
bCwgZWFjaAp3aXRoIGEgbGlzdCBvZiBwYWNrYWdlIG5hbWVzLgoKVGhlIHVwZ3JhZGUgZW50cnkg
Y29udGFpbnMgYW55IGBwYWNrYWdlLWRlc2MnIG9iamVjdHMgaW4gSU5TVEFMTAp3aG9zZSBuYW1l
IGNvaW5jaWRlcyB3aXRoIGFuIG9iamVjdCBpbiBERUxFVEUuICBUaGUgZGVsZXRlIGFuZAp0aGUg
aW5zdGFsbCBlbnRyaWVzIGFyZSB0aGUgc2FtZSBhcyBERUxFVEUgYW5kIElOU1RBTEwgd2l0aCBz
dWNoCm9iamVjdHMgcmVtb3ZlZC4iCiAgKGxldCogKCh1cGcgKGNsLWludGVyc2VjdGlvbiBpbnN0
YWxsIGRlbGV0ZSA6a2V5ICMncGFja2FnZS1kZXNjLW5hbWUpKQogICAgICAgICAoaW5zIChjbC1z
ZXQtZGlmZmVyZW5jZSBpbnN0YWxsIHVwZyA6a2V5ICMncGFja2FnZS1kZXNjLW5hbWUpKQogICAg
ICAgICAoZGVsIChjbC1zZXQtZGlmZmVyZW5jZSBkZWxldGUgdXBnIDprZXkgIydwYWNrYWdlLWRl
c2MtbmFtZSkpKQogICAgYCgoZGVsZXRlIC4gLGRlbCkgKGluc3RhbGwgLiAsaW5zKSAodXBncmFk
ZSAuICx1cGcpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS1wZXJmb3JtLXRyYW5zYWN0aW9uIChp
bnN0YWxsLWxpc3QgZGVsZXRlLWxpc3QpCiAgIkluc3RhbGwgcGFja2FnZXMgaW4gSU5TVEFMTC1M
SVNUIGFuZCBkZWxldGUgREVMRVRFLUxJU1QuClJldHVybiBuaWwgaWYgdGhlcmUgd2VyZSBubyBl
cnJvcnM7IG5vbi1uaWwgb3RoZXJ3aXNlLiIKICAobGV0ICgoZXJyb3JzIG5pbCkpCiAgICAoaWYg
aW5zdGFsbC1saXN0CiAgICAgICAgKGxldCAoKHN0YXR1cy1mb3JtYXQgKGZvcm1hdCAiOkluc3Rh
bGxpbmcgJSVkLyVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0
aCBpbnN0YWxsLWxpc3QpKSkKICAgICAgICAgICAgICAoaSAwKQogICAgICAgICAgICAgIChwYWNr
YWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0YXR1cykpCiAgICAgICAgICAoZG9saXN0IChwa2cgaW5z
dGFsbC1saXN0KQogICAgICAgICAgICAoc2V0cSBwYWNrYWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0
YXR1cwogICAgICAgICAgICAgICAgICAoZm9ybWF0IHN0YXR1cy1mb3JtYXQgKGNsLWluY2YgaSkp
KQogICAgICAgICAgICAoZm9yY2UtbW9kZS1saW5lLXVwZGF0ZSkKICAgICAgICAgICAgKHJlZGlz
cGxheSAnZm9yY2UpCiAgICAgICAgICAgIDs7IERvbid0IG1hcmsgYXMgc2VsZWN0ZWQsIGBwYWNr
YWdlLW1lbnUtZXhlY3V0ZScgYWxyZWFkeQogICAgICAgICAgICA7OyBkb2VzIHRoYXQuCiAgICAg
ICAgICAgIChwYWNrYWdlLWluc3RhbGwgcGtnICdkb250LXNlbGVjdCkpKSkKICAgIChsZXQgKChw
YWNrYWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0YXR1cyAiOkRlbGV0aW5nIikpCiAgICAgIChmb3Jj
ZS1tb2RlLWxpbmUtdXBkYXRlKQogICAgICAocmVkaXNwbGF5ICdmb3JjZSkKICAgICAgKGRvbGlz
dCAoZWx0IChwYWNrYWdlLS1zb3J0LWJ5LWRlcGVuZGVuY2UgZGVsZXRlLWxpc3QpKQogICAgICAg
IChjb25kaXRpb24tY2FzZS11bmxlc3MtZGVidWcgZXJyCiAgICAgICAgICAgIChsZXQgKChpbmhp
Yml0LW1lc3NhZ2UgKG9yIGluaGliaXQtbWVzc2FnZSBwYWNrYWdlLW1lbnUtYXN5bmMpKSkKICAg
ICAgICAgICAgICAocGFja2FnZS1kZWxldGUgZWx0IG5pbCAnbm9zYXZlKSkKICAgICAgICAgIChl
cnJvcgogICAgICAgICAgIChwdXNoIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIGVsdCkgZXJyb3Jz
KQogICAgICAgICAgIChtZXNzYWdlICJFcnJvciB0cnlpbmcgdG8gZGVsZXRlIGAlcyc6ICVTIgog
ICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIGVsdCkgZXJyKSkpKSkK
ICAgIGVycm9ycykpCgooZGVmdW4gcGFja2FnZS0tdXBkYXRlLXNlbGVjdGVkLXBhY2thZ2VzIChh
ZGQgcmVtb3ZlKQogICJVcGRhdGUgdGhlIGBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBsaXN0
IGFjY29yZGluZyB0byBBREQgYW5kIFJFTU9WRS4KQUREIGFuZCBSRU1PVkUgbXVzdCBiZSBkaXNq
b2ludCBsaXN0cyBvZiBwYWNrYWdlIG5hbWVzIChvcgpgcGFja2FnZS1kZXNjJyBvYmplY3RzKSB0
byBiZSBhZGRlZCBhbmQgcmVtb3ZlZCB0byB0aGUgc2VsZWN0ZWQKcGFja2FnZXMgbGlzdCwgcmVz
cGVjdGl2ZWx5LiIKICAoZG9saXN0IChwIGFkZCkKICAgIChjbC1wdXNobmV3IChpZiAocGFja2Fn
ZS1kZXNjLXAgcCkgKHBhY2thZ2UtZGVzYy1uYW1lIHApIHApCiAgICAgICAgICAgICAgICBwYWNr
YWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkKICAoZG9saXN0IChwIHJlbW92ZSkKICAgIChzZXRxIHBh
Y2thZ2Utc2VsZWN0ZWQtcGFja2FnZXMKICAgICAgICAgIChyZW1vdmUgKGlmIChwYWNrYWdlLWRl
c2MtcCBwKSAocGFja2FnZS1kZXNjLW5hbWUgcCkgcCkKICAgICAgICAgICAgICAgICAgcGFja2Fn
ZS1zZWxlY3RlZC1wYWNrYWdlcykpKQogICh3aGVuIChvciBhZGQgcmVtb3ZlKQogICAgKHBhY2th
Z2UtLXNhdmUtc2VsZWN0ZWQtcGFja2FnZXMgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcykpKQoK
KGRlZnVuIHBhY2thZ2UtbWVudS1leGVjdXRlICgmb3B0aW9uYWwgbm9xdWVyeSkKICAiUGVyZm9y
bSBtYXJrZWQgUGFja2FnZSBNZW51IGFjdGlvbnMuClBhY2thZ2VzIG1hcmtlZCBmb3IgaW5zdGFs
bGF0aW9uIGFyZSBkb3dubG9hZGVkIGFuZCBpbnN0YWxsZWQsCnBhY2thZ2VzIG1hcmtlZCBmb3Ig
ZGVsZXRpb24gYXJlIHJlbW92ZWQsIGFuZCBwYWNrYWdlcyBtYXJrZWQgZm9yCnVwZ3JhZGluZyBh
cmUgZG93bmxvYWRlZCBhbmQgdXBncmFkZWQuCgpJZiBubyBwYWNrYWdlcyBhcmUgbWFya2VkLCB0
aGUgYWN0aW9uIHRha2VuIGRlcGVuZHMgb24gdGhlIHN0YXRlCm9mIHRoZSBwYWNrYWdlIHVuZGVy
IHBvaW50LiAgSWYgaXQncyBub3QgYWxyZWFkeSBpbnN0YWxsZWQsIHRoaXMKY29tbWFuZCB3aWxs
IGluc3RhbGwgdGhlIHBhY2thZ2UsIGFuZCBpZiBpdCdzIGluc3RhbGxlZCwgaXQgd2lsbApkZWxl
dGUgdGhlIHBhY2thZ2UuCgpPcHRpb25hbCBhcmd1bWVudCBOT1FVRVJZIG5vbi1uaWwgbWVhbnMg
ZG8gbm90IGFzayB0aGUgdXNlciB0byBjb25maXJtLiIKICAoaW50ZXJhY3RpdmUgbmlsIHBhY2th
Z2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKGxl
dCAoaW5zdGFsbC1saXN0IGRlbGV0ZS1saXN0IGNtZCBwa2ctZGVzYykKICAgIChzYXZlLWV4Y3Vy
c2lvbgogICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAod2hpbGUgKG5vdCAoZW9i
cCkpCiAgICAgICAgKHNldHEgY21kIChjaGFyLWFmdGVyKSkKICAgICAgICAodW5sZXNzIChlcSBj
bWQgP1xzKQogICAgICAgICAgOzsgVGhpcyBpcyB0aGUga2V5IFBLRy1ERVNDLgogICAgICAgICAg
KHNldHEgcGtnLWRlc2MgKHRhYnVsYXRlZC1saXN0LWdldC1pZCkpCiAgICAgICAgICAoY29uZCAo
KGVxIGNtZCA/RCkKICAgICAgICAgICAgICAgICAocHVzaCBwa2ctZGVzYyBkZWxldGUtbGlzdCkp
CiAgICAgICAgICAgICAgICAoKGVxIGNtZCA/SSkKICAgICAgICAgICAgICAgICAocHVzaCBwa2ct
ZGVzYyBpbnN0YWxsLWxpc3QpKSkpCiAgICAgICAgKGZvcndhcmQtbGluZSkpKQogICAgOzsgTm90
aGluZyBtYXJrZWQuCiAgICAodW5sZXNzIChvciBkZWxldGUtbGlzdCBpbnN0YWxsLWxpc3QpCiAg
ICAgIDs7IE5vdCBvbiBhIHBhY2thZ2UgbGluZS4KICAgICAgKHVubGVzcyAodGFidWxhdGVkLWxp
c3QtZ2V0LWlkKQogICAgICAgICh1c2VyLWVycm9yICJObyBvcGVyYXRpb25zIHNwZWNpZmllZCIp
KQogICAgICAobGV0KiAoKGlkICh0YWJ1bGF0ZWQtbGlzdC1nZXQtaWQpKQogICAgICAgICAgICAg
KHN0YXR1cyAocGFja2FnZS1tZW51LWdldC1zdGF0dXMpKSkKICAgICAgICAoY29uZAogICAgICAg
ICAoKG1lbWJlciBzdGF0dXMgJygiaW5zdGFsbGVkIikpCiAgICAgICAgICAocHVzaCBpZCBkZWxl
dGUtbGlzdCkpCiAgICAgICAgICgobWVtYmVyIHN0YXR1cyAnKCJhdmFpbGFibGUiICJhdmFpbC1v
YnNvIiAibmV3IiAiZGVwZW5kZW5jeSIpKQogICAgICAgICAgKHB1c2ggaWQgaW5zdGFsbC1saXN0
KSkKICAgICAgICAgKHQgKHVzZXItZXJyb3IgIk5vIGRlZmF1bHQgYWN0aW9uIGF2YWlsYWJsZSBm
b3Igc3RhdHVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKSkpKSkKICAgIChs
ZXQtYWxpc3QgKHBhY2thZ2UtbWVudS0tcGFydGl0aW9uLXRyYW5zYWN0aW9uIGluc3RhbGwtbGlz
dCBkZWxldGUtbGlzdCkKICAgICAgKHdoZW4gKG9yIG5vcXVlcnkKICAgICAgICAgICAgICAgIChw
YWNrYWdlLW1lbnUtLXByb21wdC10cmFuc2FjdGlvbi1wIC5kZWxldGUgLmluc3RhbGwgLnVwZ3Jh
ZGUpKQogICAgICAgIChsZXQgKChtZXNzYWdlLXRlbXBsYXRlCiAgICAgICAgICAgICAgIChjb25j
YXQgIlsgIgogICAgICAgICAgICAgICAgICAgICAgICh3aGVuIC5kZWxldGUKICAgICAgICAgICAg
ICAgICAgICAgICAgIChmb3JtYXQgIkRlbGV0ZSAlZCAiIChsZW5ndGggLmRlbGV0ZSkpKQogICAg
ICAgICAgICAgICAgICAgICAgICh3aGVuIC5pbnN0YWxsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAoZm9ybWF0ICJJbnN0YWxsICVkICIgKGxlbmd0aCAuaW5zdGFsbCkpKQogICAgICAgICAgICAg
ICAgICAgICAgICh3aGVuIC51cGdyYWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0
ICJVcGdyYWRlICVkICIgKGxlbmd0aCAudXBncmFkZSkpKQogICAgICAgICAgICAgICAgICAgICAg
ICJdIikpKQogICAgICAgICAgKG1lc3NhZ2UgIk9wZXJhdGlvbiAlcyBzdGFydGVkIiBtZXNzYWdl
LXRlbXBsYXRlKQogICAgICAgICAgOzsgUGFja2FnZXMgYmVpbmcgdXBncmFkZWQgYXJlIG5vdCBt
YXJrZWQgYXMgc2VsZWN0ZWQuCiAgICAgICAgICAocGFja2FnZS0tdXBkYXRlLXNlbGVjdGVkLXBh
Y2thZ2VzIC5pbnN0YWxsIC5kZWxldGUpCiAgICAgICAgICAodW5sZXNzIChwYWNrYWdlLW1lbnUt
LXBlcmZvcm0tdHJhbnNhY3Rpb24gaW5zdGFsbC1saXN0IGRlbGV0ZS1saXN0KQogICAgICAgICAg
ICA7OyBJZiB0aGVyZSB3ZXJlbid0IGVycm9ycywgb3V0cHV0IGRhdGEuCiAgICAgICAgICAgIChp
Zi1sZXQqICgocmVtb3ZhYmxlIChwYWNrYWdlLS1yZW1vdmFibGUtcGFja2FnZXMpKSkKICAgICAg
ICAgICAgICAgIChtZXNzYWdlICJPcGVyYXRpb24gZmluaXNoZWQuICBQYWNrYWdlcyB0aGF0IGFy
ZSBubyBsb25nZXIgbmVlZGVkOiAlZC4gIFR5cGUgYCVzJyB0byByZW1vdmUgdGhlbSIKICAgICAg
ICAgICAgICAgICAgICAgICAgIChsZW5ndGggcmVtb3ZhYmxlKQogICAgICAgICAgICAgICAgICAg
ICAgICAgKHN1YnN0aXR1dGUtY29tbWFuZC1rZXlzICJcXFtwYWNrYWdlLWF1dG9yZW1vdmVdIikp
CiAgICAgICAgICAgICAgKG1lc3NhZ2UgIk9wZXJhdGlvbiAlcyBmaW5pc2hlZCIgbWVzc2FnZS10
ZW1wbGF0ZSkpKSkpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS12ZXJzaW9uLXByZWRpY2F0ZSAo
QSBCKQogICJQcmVkaWNhdGUgdG8gc29ydCBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgdGhlIHZl
cnNpb24gY29sdW1uLgpUaGlzIGlzIHVzZWQgZm9yIGB0YWJ1bGF0ZWQtbGlzdC1mb3JtYXQnIGlu
IGBwYWNrYWdlLW1lbnUtbW9kZScuIgogIChsZXQgKCh2QSAob3IgKHZlcnNpb24tdG8tbGlzdCAo
YXJlZiAoY2FkciBBKSAxKSkgJygwKSkpCiAgICAgICAgKHZCIChvciAodmVyc2lvbi10by1saXN0
IChhcmVmIChjYWRyIEIpIDEpKSAnKDApKSkpCiAgICAoaWYgKHZlcnNpb24tbGlzdC09IHZBIHZC
KQogICAgICAgIChwYWNrYWdlLW1lbnUtLW5hbWUtcHJlZGljYXRlIEEgQikKICAgICAgKHZlcnNp
b24tbGlzdC08IHZBIHZCKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tc3RhdHVzLXByZWRpY2F0
ZSAoQSBCKQogICJQcmVkaWNhdGUgdG8gc29ydCBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgdGhl
IHN0YXR1cyBjb2x1bW4uClRoaXMgaXMgdXNlZCBmb3IgYHRhYnVsYXRlZC1saXN0LWZvcm1hdCcg
aW4gYHBhY2thZ2UtbWVudS1tb2RlJy4iCiAgKGxldCAoKHNBIChhcmVmIChjYWRyIEEpIDIpKQog
ICAgICAgIChzQiAoYXJlZiAoY2FkciBCKSAyKSkpCiAgICAoY29uZCAoKHN0cmluZz0gc0Egc0Ip
CiAgICAgICAgICAgKHBhY2thZ2UtbWVudS0tbmFtZS1wcmVkaWNhdGUgQSBCKSkKICAgICAgICAg
ICgoc3RyaW5nPSBzQSAibmV3IikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAibmV3Iikgbmls
KQogICAgICAgICAgKChzdHJpbmctcHJlZml4LXAgImF2YWlsIiBzQSkKICAgICAgICAgICAoaWYg
KHN0cmluZy1wcmVmaXgtcCAiYXZhaWwiIHNCKQogICAgICAgICAgICAgICAocGFja2FnZS1tZW51
LS1uYW1lLXByZWRpY2F0ZSBBIEIpCiAgICAgICAgICAgICB0KSkKICAgICAgICAgICgoc3RyaW5n
LXByZWZpeC1wICJhdmFpbCIgc0IpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAiaW5zdGFs
bGVkIikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAiaW5zdGFsbGVkIikgbmlsKQogICAgICAg
ICAgKChzdHJpbmc9IHNBICJkZXBlbmRlbmN5IikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAi
ZGVwZW5kZW5jeSIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAic291cmNlIikgdCkKICAg
ICAgICAgICgoc3RyaW5nPSBzQiAic291cmNlIikgbmlsKQogICAgICAgICAgKChzdHJpbmc9IHNB
ICJ1bnNpZ25lZCIpIHQpCiAgICAgICAgICAoKHN0cmluZz0gc0IgInVuc2lnbmVkIikgbmlsKQog
ICAgICAgICAgKChzdHJpbmc9IHNBICJoZWxkIikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAi
aGVsZCIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAiZXh0ZXJuYWwiKSB0KQogICAgICAg
ICAgKChzdHJpbmc9IHNCICJleHRlcm5hbCIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAi
YnVpbHQtaW4iKSB0KQogICAgICAgICAgKChzdHJpbmc9IHNCICJidWlsdC1pbiIpIG5pbCkKICAg
ICAgICAgICgoc3RyaW5nPSBzQSAib2Jzb2xldGUiKSB0KQogICAgICAgICAgKChzdHJpbmc9IHNC
ICJvYnNvbGV0ZSIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAiaW5jb21wYXQiKSB0KQog
ICAgICAgICAgKChzdHJpbmc9IHNCICJpbmNvbXBhdCIpIG5pbCkKICAgICAgICAgICh0IChzdHJp
bmc8IHNBIHNCKSkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLWRlc2NyaXB0aW9uLXByZWRpY2F0
ZSAoQSBCKQogICJQcmVkaWNhdGUgdG8gc29ydCBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgdGhl
IGRlc2NyaXB0aW9uIGNvbHVtbi4KVGhpcyBpcyB1c2VkIGZvciBgdGFidWxhdGVkLWxpc3QtZm9y
bWF0JyBpbiBgcGFja2FnZS1tZW51LW1vZGUnLiIKICAobGV0ICgoZEEgKGFyZWYgKGNhZHIgQSkg
KGlmIChjZHIgcGFja2FnZS1hcmNoaXZlcykgNCAzKSkpCiAgICAgICAgKGRCIChhcmVmIChjYWRy
IEIpIChpZiAoY2RyIHBhY2thZ2UtYXJjaGl2ZXMpIDQgMykpKSkKICAgIChpZiAoc3RyaW5nPSBk
QSBkQikKICAgICAgICAocGFja2FnZS1tZW51LS1uYW1lLXByZWRpY2F0ZSBBIEIpCiAgICAgIChz
dHJpbmc8IGRBIGRCKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tbmFtZS1wcmVkaWNhdGUgKEEg
QikKICAiUHJlZGljYXRlIHRvIHNvcnQgXCIqUGFja2FnZXMqXCIgYnVmZmVyIGJ5IHRoZSBuYW1l
IGNvbHVtbi4KVGhpcyBpcyB1c2VkIGZvciBgdGFidWxhdGVkLWxpc3QtZm9ybWF0JyBpbiBgcGFj
a2FnZS1tZW51LW1vZGUnLiIKICAoc3RyaW5nPCAoc3ltYm9sLW5hbWUgKHBhY2thZ2UtZGVzYy1u
YW1lIChjYXIgQSkpKQogICAgICAgICAgIChzeW1ib2wtbmFtZSAocGFja2FnZS1kZXNjLW5hbWUg
KGNhciBCKSkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLWFyY2hpdmUtcHJlZGljYXRlIChBIEIp
CiAgIlByZWRpY2F0ZSB0byBzb3J0IFwiKlBhY2thZ2VzKlwiIGJ1ZmZlciBieSB0aGUgYXJjaGl2
ZSBjb2x1bW4uClRoaXMgaXMgdXNlZCBmb3IgYHRhYnVsYXRlZC1saXN0LWZvcm1hdCcgaW4gYHBh
Y2thZ2UtbWVudS1tb2RlJy4iCiAgKGxldCAoKGEgKG9yIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSAo
Y2FyIEEpKSAiIikpCiAgICAgICAgKGIgKG9yIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSAoY2FyIEIp
KSAiIikpKQogICAgKGlmIChzdHJpbmc9IGEgYikKICAgICAgICAocGFja2FnZS1tZW51LS1uYW1l
LXByZWRpY2F0ZSBBIEIpCiAgICAgIChzdHJpbmc8IGEgYikpKSkKCihkZWZ1biBwYWNrYWdlLW1l
bnUtLXBvcHVsYXRlLW5ldy1wYWNrYWdlLWxpc3QgKCkKICAiRGVjaWRlIHdoaWNoIHBhY2thZ2Vz
IGFyZSBuZXcgaW4gYHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cycuClN0b3JlIHRoaXMgbGlzdCBp
biBgcGFja2FnZS1tZW51LS1uZXctcGFja2FnZS1saXN0Jy4iCiAgOzsgRmluZCB3aGljaCBwYWNr
YWdlcyBhcmUgbmV3LgogICh3aGVuIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMK
ICAgIChkb2xpc3QgKGVsdCBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMpCiAgICAgICh1bmxlc3Mg
KGFzc3EgKGNhciBlbHQpIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMpCiAgICAg
ICAgKHB1c2ggKGNhciBlbHQpIHBhY2thZ2UtbWVudS0tbmV3LXBhY2thZ2UtbGlzdCkpKQogICAg
KHNldHEgcGFja2FnZS1tZW51LS1vbGQtYXJjaGl2ZS1jb250ZW50cyBuaWwpKSkKCihkZWZ1biBw
YWNrYWdlLW1lbnUtLWZpbmQtYW5kLW5vdGlmeS11cGdyYWRlcyAoKQogICJOb3RpZnkgdGhlIHVz
ZXIgb2YgdXBncmFkYWJsZSBwYWNrYWdlcy4iCiAgKHdoZW4tbGV0KiAoKHVwZ3JhZGVzIChwYWNr
YWdlLW1lbnUtLWZpbmQtdXBncmFkZXMpKSkKICAgIChtZXNzYWdlICJQYWNrYWdlcyB0aGF0IGNh
biBiZSB1cGdyYWRlZDogJWQ7IHR5cGUgYCVzJyB0byBtYXJrIGZvciB1cGdyYWRpbmcuIgogICAg
ICAgICAgICAgKGxlbmd0aCB1cGdyYWRlcykKICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNvbW1h
bmQta2V5cyAiXFxbcGFja2FnZS1tZW51LW1hcmstdXBncmFkZXNdIikpKSkKCgooZGVmdW4gcGFj
a2FnZS1tZW51LS1wb3N0LXJlZnJlc2ggKCkKICAiUmV2ZXJ0IFwiKlBhY2thZ2VzKlwiIGJ1ZmZl
ciBhbmQgY2hlY2sgZm9yIG5ldyBwYWNrYWdlcyBhbmQgdXBncmFkZXMuCkRvIG5vdGhpbmcgaWYg
dGhlcmUncyBubyAqUGFja2FnZXMqIGJ1ZmZlci4KClRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFm
dGVyIGBwYWNrYWdlLXJlZnJlc2gtY29udGVudHMnIGFuZCBpdAppcyBhZGRlZCB0byBgcG9zdC1j
b21tYW5kLWhvb2snIGJ5IGFueSBmdW5jdGlvbiB3aGljaCBhbHRlcnMgdGhlCnBhY2thZ2UgZGF0
YWJhc2UgKGBwYWNrYWdlLWluc3RhbGwnIGFuZCBgcGFja2FnZS1kZWxldGUnKS4gIFdoZW4KcnVu
LCBpdCByZW1vdmVzIGl0c2VsZiBmcm9tIGBwb3N0LWNvbW1hbmQtaG9vaycuIgogIChyZW1vdmUt
aG9vayAncG9zdC1jb21tYW5kLWhvb2sgIydwYWNrYWdlLW1lbnUtLXBvc3QtcmVmcmVzaCkKICAo
bGV0ICgoYnVmIChnZXQtYnVmZmVyICIqUGFja2FnZXMqIikpKQogICAgKHdoZW4gKGJ1ZmZlci1s
aXZlLXAgYnVmKQogICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWYKICAgICAgICAocGFja2Fn
ZS1tZW51LS1wb3B1bGF0ZS1uZXctcGFja2FnZS1saXN0KQogICAgICAgIChydW4taG9va3MgJ3Rh
YnVsYXRlZC1saXN0LXJldmVydC1ob29rKQogICAgICAgICh0YWJ1bGF0ZWQtbGlzdC1wcmludCAn
cmVtZW1iZXIgJ3VwZGF0ZSkpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS1tYXJrLW9yLW5vdGlm
eS11cGdyYWRlcyAoKQogICJJZiB0aGVyZSdzIGEgKlBhY2thZ2VzKiBidWZmZXIsIGNoZWNrIGZv
ciB1cGdyYWRlcyBhbmQgcG9zc2libHkgbWFyayB0aGVtLgpEbyBub3RoaW5nIGlmIHRoZXJlJ3Mg
bm8gKlBhY2thZ2VzKiBidWZmZXIuICBJZiB0aGVyZSBhcmUKdXBncmFkZXMsIG1hcmsgdGhlbSBp
ZiBgcGFja2FnZS1tZW51LS1tYXJrLXVwZ3JhZGVzLXBlbmRpbmcnIGlzCm5vbi1uaWwsIG90aGVy
d2lzZSBqdXN0IG5vdGlmeSB0aGUgdXNlciB0aGF0IHRoZXJlIGFyZSB1cGdyYWRlcy4KVGhpcyBm
dW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYHBhY2thZ2UtcmVmcmVzaC1jb250ZW50cycuIgogIChs
ZXQgKChidWYgKGdldC1idWZmZXIgIipQYWNrYWdlcyoiKSkpCiAgICAod2hlbiAoYnVmZmVyLWxp
dmUtcCBidWYpCiAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZgogICAgICAgIChpZiBwYWNr
YWdlLW1lbnUtLW1hcmstdXBncmFkZXMtcGVuZGluZwogICAgICAgICAgICAocGFja2FnZS1tZW51
LS1tYXJrLXVwZ3JhZGVzLTEpCiAgICAgICAgICAocGFja2FnZS1tZW51LS1maW5kLWFuZC1ub3Rp
ZnktdXBncmFkZXMpKSkpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBsaXN0LXBhY2thZ2VzICgm
b3B0aW9uYWwgbm8tZmV0Y2gpCiAgIkRpc3BsYXkgYSBsaXN0IG9mIHBhY2thZ2VzLgpUaGlzIGZp
cnN0IGZldGNoZXMgdGhlIHVwZGF0ZWQgbGlzdCBvZiBwYWNrYWdlcyBiZWZvcmUKZGlzcGxheWlu
ZywgdW5sZXNzIGEgcHJlZml4IGFyZ3VtZW50IE5PLUZFVENIIGlzIHNwZWNpZmllZC4KVGhlIGxp
c3QgaXMgZGlzcGxheWVkIGluIGEgYnVmZmVyIG5hbWVkIGAqUGFja2FnZXMqJywgYW5kCmluY2x1
ZGVzIHRoZSBwYWNrYWdlJ3MgdmVyc2lvbiwgYXZhaWxhYmlsaXR5IHN0YXR1cywgYW5kIGEKc2hv
cnQgZGVzY3JpcHRpb24uIgogIChpbnRlcmFjdGl2ZSAiUCIpCiAgKHJlcXVpcmUgJ2ZpbmRlci1p
bmYgbmlsIHQpCiAgOzsgSW5pdGlhbGl6ZSB0aGUgcGFja2FnZSBzeXN0ZW0gaWYgbmVjZXNzYXJ5
LgogICh1bmxlc3MgcGFja2FnZS0taW5pdGlhbGl6ZWQKICAgIChwYWNrYWdlLWluaXRpYWxpemUg
dCkpCiAgOzsgSW50ZWdyYXRlIHRoZSBwYWNrYWdlLW1lbnUgd2l0aCB1cGRhdGluZyB0aGUgYXJj
aGl2ZXMuCiAgKGFkZC1ob29rICdwYWNrYWdlLS1wb3N0LWRvd25sb2FkLWFyY2hpdmVzLWhvb2sK
ICAgICAgICAgICAgIydwYWNrYWdlLW1lbnUtLXBvc3QtcmVmcmVzaCkKICAoYWRkLWhvb2sgJ3Bh
Y2thZ2UtLXBvc3QtZG93bmxvYWQtYXJjaGl2ZXMtaG9vawogICAgICAgICAgICAjJ3BhY2thZ2Ut
bWVudS0tbWFyay1vci1ub3RpZnktdXBncmFkZXMgJ2FwcGVuZCkKCiAgOzsgR2VuZXJhdGUgdGhl
IFBhY2thZ2UgTWVudS4KICAobGV0ICgoYnVmIChnZXQtYnVmZmVyLWNyZWF0ZSAiKlBhY2thZ2Vz
KiIpKSkKICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZgogICAgICA7OyBTaW5jZSBzb21lIHBh
Y2thZ2VzIGhhdmUgdGhlaXIgZGVzY3JpcHRpb25zIGluY2x1ZGUgbm9uLUFTQ0lJCiAgICAgIDs7
IGNoYXJhY3RlcnMuLi4KICAgICAgKHNldHEgYnVmZmVyLWZpbGUtY29kaW5nLXN5c3RlbSAndXRm
LTgpCiAgICAgIChwYWNrYWdlLW1lbnUtbW9kZSkKCiAgICAgIDs7IEZldGNoIHRoZSByZW1vdGUg
bGlzdCBvZiBwYWNrYWdlcy4KICAgICAgKHVubGVzcyBuby1mZXRjaCAocGFja2FnZS1tZW51LS1y
ZWZyZXNoLWNvbnRlbnRzKSkKCiAgICAgIDs7IElmIHdlJ3JlIG5vdCBhc3luYywgdGhpcyB3b3Vs
ZCBiZSByZWR1bmRhbnQuCiAgICAgICh3aGVuIHBhY2thZ2UtbWVudS1hc3luYwogICAgICAgIChw
YWNrYWdlLW1lbnUtLWdlbmVyYXRlIG5pbCB0KSkpCiAgICA7OyBUaGUgcGFja2FnZSBtZW51IGJ1
ZmZlciBoYXMga2V5YmluZGluZ3MuICBJZiB0aGUgdXNlciB0eXBlcwogICAgOzsgYE0teCBsaXN0
LXBhY2thZ2VzJywgdGhhdCBzdWdnZXN0cyBpdCBzaG91bGQgYmVjb21lIGN1cnJlbnQuCiAgICAo
cG9wLXRvLWJ1ZmZlci1zYW1lLXdpbmRvdyBidWYpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZhbGlh
cyAncGFja2FnZS1saXN0LXBhY2thZ2VzICdsaXN0LXBhY2thZ2VzKQoKOzsgVXNlZCBpbiBmaW5k
ZXIuZWwKKGRlZnVuIHBhY2thZ2Utc2hvdy1wYWNrYWdlLWxpc3QgKCZvcHRpb25hbCBwYWNrYWdl
cyBrZXl3b3JkcykKICAiRGlzcGxheSBQQUNLQUdFUyBpbiBhICpQYWNrYWdlcyogYnVmZmVyLgpU
aGlzIGlzIHNpbWlsYXIgdG8gYGxpc3QtcGFja2FnZXMnLCBidXQgaXQgZG9lcyBub3QgZmV0Y2gg
dGhlCnVwZGF0ZWQgbGlzdCBvZiBwYWNrYWdlcywgYW5kIGl0IG9ubHkgZGlzcGxheXMgcGFja2Fn
ZXMgd2l0aApuYW1lcyBpbiBQQUNLQUdFUyAod2hpY2ggc2hvdWxkIGJlIGEgbGlzdCBvZiBzeW1i
b2xzKS4KCldoZW4gS0VZV09SRFMgYXJlIGdpdmVuLCBvbmx5IHBhY2thZ2VzIHdpdGggdGhvc2Ug
S0VZV09SRFMgYXJlCnNob3duLiIKICAoaW50ZXJhY3RpdmUpCiAgKHJlcXVpcmUgJ2ZpbmRlci1p
bmYgbmlsIHQpCiAgKGxldCogKChidWYgKGdldC1idWZmZXItY3JlYXRlICIqUGFja2FnZXMqIikp
CiAgICAgICAgICh3aW4gKGdldC1idWZmZXItd2luZG93IGJ1ZikpKQogICAgKHdpdGgtY3VycmVu
dC1idWZmZXIgYnVmCiAgICAgIChwYWNrYWdlLW1lbnUtbW9kZSkKICAgICAgKHBhY2thZ2UtbWVu
dS0tZ2VuZXJhdGUgbmlsIHBhY2thZ2VzIGtleXdvcmRzKSkKICAgIChpZiB3aW4KICAgICAgICAo
c2VsZWN0LXdpbmRvdyB3aW4pCiAgICAgIChzd2l0Y2gtdG8tYnVmZmVyIGJ1ZikpKSkKCihkZWZ1
biBwYWNrYWdlLW1lbnUtLWZpbHRlci1ieSAocHJlZGljYXRlIHN1ZmZpeCkKICAiRmlsdGVyIFwi
KlBhY2thZ2VzKlwiIGJ1ZmZlciBieSBQUkVESUNBVEUgYW5kIGFkZCBTVUZGSVggdG8gaGVhZGVy
LgpQUkVESUNBVEUgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBh
cmd1bWVudCwgYQpgcGFja2FnZS1kZXNjJyBvYmplY3QsIGFuZCByZXR1cm5zIHQgaWYgdGhhdCBv
YmplY3Qgc2hvdWxkIGJlCmxpc3RlZCBpbiB0aGUgUGFja2FnZSBNZW51LgoKU1VGRklYIGlzIHBh
c3NlZCBvbiB0byBgcGFja2FnZS1tZW51LS1kaXNwbGF5JyBhbmQgaXMgYWRkZWQgdG8KdGhlIGhl
YWRlciBsaW5lIG9mIHRoZSBmaXJzdCBjb2x1bW4uIgogIDs7IFVwZGF0ZSBgdGFidWxhdGVkLWxp
c3QtZW50cmllcycgc28gdGhhdCBpdCBjb250YWlucyBhbGwKICA7OyBwYWNrYWdlcyBiZWZvcmUg
c2VhcmNoaW5nLgogIChwYWNrYWdlLW1lbnUtLXJlZnJlc2ggdCBuaWwpCiAgKGxldCAoZm91bmQt
ZW50cmllcykKICAgIChkb2xpc3QgKGVudHJ5IHRhYnVsYXRlZC1saXN0LWVudHJpZXMpCiAgICAg
ICh3aGVuIChmdW5jYWxsIHByZWRpY2F0ZSAoY2FyIGVudHJ5KSkKICAgICAgICAocHVzaCBlbnRy
eSBmb3VuZC1lbnRyaWVzKSkpCiAgICAoaWYgZm91bmQtZW50cmllcwogICAgICAgIChwcm9nbgog
ICAgICAgICAgKHNldHEgdGFidWxhdGVkLWxpc3QtZW50cmllcyBmb3VuZC1lbnRyaWVzKQogICAg
ICAgICAgKHBhY2thZ2UtbWVudS0tZGlzcGxheSB0IHN1ZmZpeCkpCiAgICAgICh1c2VyLWVycm9y
ICJObyBwYWNrYWdlcyBmb3VuZCIpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LWZpbHRlci1ieS1h
cmNoaXZlIChhcmNoaXZlKQogICJGaWx0ZXIgdGhlIFwiKlBhY2thZ2VzKlwiIGJ1ZmZlciBieSBB
UkNISVZFLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgZnJvbSBwYWNrYWdlIGFyY2hpdmUgQVJDSElW
RS4KCldoZW4gY2FsbGVkIGludGVyYWN0aXZlbHksIHByb21wdCBmb3IgQVJDSElWRSwgd2hpY2gg
Y2FuIGJlIGEKY29tbWEtc2VwYXJhdGVkIHN0cmluZy4gIElmIEFSQ0hJVkUgaXMgZW1wdHksIHNo
b3cgYWxsIHBhY2thZ2VzLgoKV2hlbiBjYWxsZWQgZnJvbSBMaXNwLCBBUkNISVZFIGNhbiBiZSBh
IHN0cmluZyBvciBhIGxpc3Qgb2YKc3RyaW5ncy4gIElmIEFSQ0hJVkUgaXMgbmlsIG9yIHRoZSBl
bXB0eSBzdHJpbmcsIHNob3cgYWxsCnBhY2thZ2VzLiIKICAoaW50ZXJhY3RpdmUgKGxpc3QgKGNv
bXBsZXRpbmctcmVhZC1tdWx0aXBsZQogICAgICAgICAgICAgICAgICAgICAgIkZpbHRlciBieSBh
cmNoaXZlIChjb21tYSBzZXBhcmF0ZWQpOiAiCiAgICAgICAgICAgICAgICAgICAgICAobWFwY2Fy
ICMnY2FyIHBhY2thZ2UtYXJjaGl2ZXMpKSkKICAgICAgICAgICAgICAgcGFja2FnZS1tZW51LW1v
ZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9kZSkKICAobGV0ICgoYXJjaGl2
ZXMgKGVuc3VyZS1saXN0IGFyY2hpdmUpKSkKICAgIChwYWNrYWdlLW1lbnUtLWZpbHRlci1ieQog
ICAgIChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgKGxldCAoKHBrZy1hcmNoaXZlIChwYWNrYWdl
LWRlc2MtYXJjaGl2ZSBwa2ctZGVzYykpKQogICAgICAgICAob3IgKG51bGwgYXJjaGl2ZXMpCiAg
ICAgICAgICAgICAoYW5kIHBrZy1hcmNoaXZlCiAgICAgICAgICAgICAgICAgIChtZW1iZXIgcGtn
LWFyY2hpdmUgYXJjaGl2ZXMpKSkpKQogICAgIChjb25jYXQgImFyY2hpdmU6IiAoc3RyaW5nLWpv
aW4gYXJjaGl2ZXMgIiwiKSkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtZmlsdGVyLWJ5LWRlc2Ny
aXB0aW9uIChkZXNjcmlwdGlvbikKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdlcypcIiBidWZmZXIg
YnkgREVTQ1JJUFRJT04gcmVnZXhwLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBhIGRlc2Ny
aXB0aW9uIHRoYXQgbWF0Y2hlcyByZWdleHAKREVTQ1JJUFRJT04uCgpXaGVuIGNhbGxlZCBpbnRl
cmFjdGl2ZWx5LCBwcm9tcHQgZm9yIERFU0NSSVBUSU9OLgoKSWYgREVTQ1JJUFRJT04gaXMgbmls
IG9yIHRoZSBlbXB0eSBzdHJpbmcsIHNob3cgYWxsIHBhY2thZ2VzLiIKICAoaW50ZXJhY3RpdmUg
KGxpc3QgKHJlYWQtcmVnZXhwICJGaWx0ZXIgYnkgZGVzY3JpcHRpb24gKHJlZ2V4cCkiKSkKICAg
ICAgICAgICAgICAgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdl
LW1lbnUtbW9kZSkKICAoaWYgKG9yIChub3QgZGVzY3JpcHRpb24pIChzdHJpbmctZW1wdHktcCBk
ZXNjcmlwdGlvbikpCiAgICAgIChwYWNrYWdlLW1lbnUtLWdlbmVyYXRlIHQgdCkKICAgIChwYWNr
YWdlLW1lbnUtLWZpbHRlci1ieSAobGFtYmRhIChwa2ctZGVzYykKICAgICAgICAgICAgICAgICAg
ICAgICAgKHN0cmluZy1tYXRjaCBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBwa2ctZGVzYykpKQogICAgICAgICAg
ICAgICAgICAgICAgKGZvcm1hdCAiZGVzYzolcyIgZGVzY3JpcHRpb24pKSkpCgooZGVmdW4gcGFj
a2FnZS1tZW51LWZpbHRlci1ieS1rZXl3b3JkIChrZXl3b3JkKQogICJGaWx0ZXIgdGhlIFwiKlBh
Y2thZ2VzKlwiIGJ1ZmZlciBieSBLRVlXT1JELgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBz
cGVjaWZpZWQgS0VZV09SRC4KCldoZW4gY2FsbGVkIGludGVyYWN0aXZlbHksIHByb21wdCBmb3Ig
S0VZV09SRCwgd2hpY2ggY2FuIGJlIGEKY29tbWEtc2VwYXJhdGVkIHN0cmluZy4gIElmIEtFWVdP
UkQgaXMgZW1wdHksIHNob3cgYWxsIHBhY2thZ2VzLgoKV2hlbiBjYWxsZWQgZnJvbSBMaXNwLCBL
RVlXT1JEIGNhbiBiZSBhIHN0cmluZyBvciBhIGxpc3Qgb2YKc3RyaW5ncy4gIElmIEtFWVdPUkQg
aXMgbmlsIG9yIHRoZSBlbXB0eSBzdHJpbmcsIHNob3cgYWxsCnBhY2thZ2VzLiIKICAoaW50ZXJh
Y3RpdmUgKGxpc3QgKGNvbXBsZXRpbmctcmVhZC1tdWx0aXBsZQogICAgICAgICAgICAgICAgICAg
ICAgIktleXdvcmRzIChjb21tYSBzZXBhcmF0ZWQpOiAiCiAgICAgICAgICAgICAgICAgICAgICAo
cGFja2FnZS1hbGwta2V5d29yZHMpKSkKICAgICAgICAgICAgICAgcGFja2FnZS1tZW51LW1vZGUp
CiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9kZSkKICAod2hlbiAoc3RyaW5ncCBr
ZXl3b3JkKQogICAgKHNldHEga2V5d29yZCAobGlzdCBrZXl3b3JkKSkpCiAgKGlmIChub3Qga2V5
d29yZCkKICAgICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQogICAgKHBhY2thZ2UtbWVu
dS0tZmlsdGVyLWJ5IChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgICAo
cGFja2FnZS0taGFzLWtleXdvcmQtcCBwa2ctZGVzYyBrZXl3b3JkKSkKICAgICAgICAgICAgICAg
ICAgICAgIChjb25jYXQgImtleXdvcmQ6IiAoc3RyaW5nLWpvaW4ga2V5d29yZCAiLCIpKSkpKQoK
KGRlZmluZS1vYnNvbGV0ZS1mdW5jdGlvbi1hbGlhcwogICdwYWNrYWdlLW1lbnUtZmlsdGVyICMn
cGFja2FnZS1tZW51LWZpbHRlci1ieS1rZXl3b3JkICIyNy4xIikKCihkZWZ1biBwYWNrYWdlLW1l
bnUtZmlsdGVyLWJ5LW5hbWUtb3ItZGVzY3JpcHRpb24gKG5hbWUtb3ItZGVzY3JpcHRpb24pCiAg
IkZpbHRlciB0aGUgXCIqUGFja2FnZXMqXCIgYnVmZmVyIGJ5IE5BTUUtT1ItREVTQ1JJUFRJT04g
cmVnZXhwLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBhIG5hbWUtb3ItZGVzY3JpcHRpb24g
dGhhdCBtYXRjaGVzIHJlZ2V4cApOQU1FLU9SLURFU0NSSVBUSU9OLgoKV2hlbiBjYWxsZWQgaW50
ZXJhY3RpdmVseSwgcHJvbXB0IGZvciBOQU1FLU9SLURFU0NSSVBUSU9OLgoKSWYgTkFNRS1PUi1E
RVNDUklQVElPTiBpcyBuaWwgb3IgdGhlIGVtcHR5IHN0cmluZywgc2hvdyBhbGwKcGFja2FnZXMu
IgogIChpbnRlcmFjdGl2ZSAobGlzdCAocmVhZC1yZWdleHAgIkZpbHRlciBieSBuYW1lIG9yIGRl
c2NyaXB0aW9uIChyZWdleHApIikpCiAgICAgICAgICAgICAgIHBhY2thZ2UtbWVudS1tb2RlKQog
IChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKGlmIChvciAobm90IG5hbWUt
b3ItZGVzY3JpcHRpb24pIChzdHJpbmctZW1wdHktcCBuYW1lLW9yLWRlc2NyaXB0aW9uKSkKICAg
ICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQogICAgKHBhY2thZ2UtbWVudS0tZmlsdGVy
LWJ5IChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgICAob3IgKHN0cmlu
Zy1tYXRjaCBuYW1lLW9yLWRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBwa2ctZGVzYykpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIG5hbWUtb3ItZGVzY3JpcHRpb24KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC1uYW1lCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtn
LWRlc2MpKSkpKQogICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAibmFtZS1vci1kZXNjOiVz
IiBuYW1lLW9yLWRlc2NyaXB0aW9uKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS1maWx0ZXItYnkt
bmFtZSAobmFtZSkKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgTkFNRSBy
ZWdleHAuCkRpc3BsYXkgb25seSBwYWNrYWdlcyB3aXRoIG5hbWUgdGhhdCBtYXRjaGVzIHJlZ2V4
cCBOQU1FLgoKV2hlbiBjYWxsZWQgaW50ZXJhY3RpdmVseSwgcHJvbXB0IGZvciBOQU1FLgoKSWYg
TkFNRSBpcyBuaWwgb3IgdGhlIGVtcHR5IHN0cmluZywgc2hvdyBhbGwgcGFja2FnZXMuIgogIChp
bnRlcmFjdGl2ZSAobGlzdCAocmVhZC1yZWdleHAgIkZpbHRlciBieSBuYW1lIChyZWdleHApIikp
CiAgICAgICAgICAgICAgIHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFj
a2FnZS1tZW51LW1vZGUpCiAgKGlmIChvciAobm90IG5hbWUpIChzdHJpbmctZW1wdHktcCBuYW1l
KSkKICAgICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQogICAgKHBhY2thZ2UtbWVudS0t
ZmlsdGVyLWJ5IChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgICAoc3Ry
aW5nLW1hdGNoLXAgbmFtZSAoc3ltYm9sLW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVzYykpKSkKICAgICAg
ICAgICAgICAgICAgICAgIChmb3JtYXQgIm5hbWU6JXMiIG5hbWUpKSkpCgooZGVmdW4gcGFja2Fn
ZS1tZW51LWZpbHRlci1ieS1zdGF0dXMgKHN0YXR1cykKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdl
cypcIiBidWZmZXIgYnkgU1RBVFVTLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBzcGVjaWZp
ZWQgU1RBVFVTLgoKV2hlbiBjYWxsZWQgaW50ZXJhY3RpdmVseSwgcHJvbXB0IGZvciBTVEFUVVMs
IHdoaWNoIGNhbiBiZSBhCmNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuICBJZiBTVEFUVVMgaXMgZW1w
dHksIHNob3cgYWxsIHBhY2thZ2VzLgoKV2hlbiBjYWxsZWQgZnJvbSBMaXNwLCBTVEFUVVMgY2Fu
IGJlIGEgc3RyaW5nIG9yIGEgbGlzdCBvZgpzdHJpbmdzLiAgSWYgU1RBVFVTIGlzIG5pbCBvciB0
aGUgZW1wdHkgc3RyaW5nLCBzaG93IGFsbApwYWNrYWdlcy4iCiAgKGludGVyYWN0aXZlIChsaXN0
IChjb21wbGV0aW5nLXJlYWQgIkZpbHRlciBieSBzdGF0dXM6ICIKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAnKCJhdmFpbC1vYnNvIgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJidWlsdC1pbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJkZXBlbmRlbmN5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4
dGVybmFsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlbGQiCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wYXQiCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGVkIgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICJuZXciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAidW5zaWduZWQiKSkpCiAgICAgICAgICAgICAgIHBhY2thZ2UtbWVudS1tb2RlKQog
IChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKGlmIChvciAobm90IHN0YXR1
cykgKHN0cmluZy1lbXB0eS1wIHN0YXR1cykpCiAgICAgIChwYWNrYWdlLW1lbnUtLWdlbmVyYXRl
IHQgdCkKICAgIChsZXQgKChzdGF0dXMtbGlzdAogICAgICAgICAgIChpZiAobGlzdHAgc3RhdHVz
KQogICAgICAgICAgICAgICBzdGF0dXMKICAgICAgICAgICAgIChzcGxpdC1zdHJpbmcgc3RhdHVz
ICIsIikpKSkKICAgICAgKHBhY2thZ2UtbWVudS0tZmlsdGVyLWJ5CiAgICAgICAobGFtYmRhIChw
a2ctZGVzYykKICAgICAgICAgKG1lbWJlciAocGFja2FnZS1kZXNjLXN0YXR1cyBwa2ctZGVzYykg
c3RhdHVzLWxpc3QpKQogICAgICAgKGZvcm1hdCAic3RhdHVzOiVzIiAoc3RyaW5nLWpvaW4gc3Rh
dHVzLWxpc3QgIiwiKSkpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LWZpbHRlci1ieS12ZXJzaW9u
ICh2ZXJzaW9uIHByZWRpY2F0ZSkKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdlcypcIiBidWZmZXIg
YnkgVkVSU0lPTiBhbmQgUFJFRElDQVRFLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBhIG1h
dGNoaW5nIHZlcnNpb24uCgpXaGVuIGNhbGxlZCBpbnRlcmFjdGl2ZWx5LCBwcm9tcHQgZm9yIG9u
ZSBvZiB0aGUgcXVhbGlmaWVycyBgPCcsCmA+JyBvciBgPScsIGFuZCBhIHBhY2thZ2UgdmVyc2lv
bi4gIFNob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhcyBhCmxvd2VyIChgPCcpLCBlcXVhbCAoYD0n
KSBvciBoaWdoZXIgKGA+JykgdmVyc2lvbiB0aGFuIHRoZQpzcGVjaWZpZWQgb25lLgoKV2hlbiBj
YWxsZWQgZnJvbSBMaXNwLCBWRVJTSU9OIHNob3VsZCBiZSBhIHZlcnNpb24gc3RyaW5nIGFuZApQ
UkVESUNBVEUgc2hvdWxkIGJlIHRoZSBzeW1ib2wgYD0nLCBgPCcgb3IgYD4nLgoKSWYgVkVSU0lP
TiBpcyBuaWwgb3IgdGhlIGVtcHR5IHN0cmluZywgc2hvdyBhbGwgcGFja2FnZXMuIgogIChpbnRl
cmFjdGl2ZSAobGV0ICgoY2hvaWNlIChpbnRlcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGNoYXItdG8tc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1j
aGFyLWNob2ljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWx0ZXIgYnkgdmVy
c2lvbj8gW1R5cGUgPSwgPCwgPiBvciBxXSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJyg/PCA/PiA/PSA/cSkpKSkpKQogICAgICAgICAgICAgICAgIChpZiAoZXEgY2hvaWNlICdx
KQogICAgICAgICAgICAgICAgICAgICAnKHF1aXQgbmlsKQogICAgICAgICAgICAgICAgICAgKGxp
c3QgKHJlYWQtZnJvbS1taW5pYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNh
dCAiRmlsdGVyIGJ5IHZlcnNpb24gKCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChwY2FzZSBjaG9pY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc9ICI9
IGVxdWFsIHRvIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ICI8IGxl
c3MgdGhhbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnPiAiPiBncmVh
dGVyIHRoYW4iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOiAiKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSkpKQogICAgICAgICAgICAgICBwYWNrYWdlLW1l
bnUtbW9kZSkKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogICh1bmxlc3Mg
KGVxdWFsIHByZWRpY2F0ZSAncXVpdCkKICAgIChpZiAob3IgKG5vdCB2ZXJzaW9uKSAoc3RyaW5n
LWVtcHR5LXAgdmVyc2lvbikpCiAgICAgICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQog
ICAgICAocGFja2FnZS1tZW51LS1maWx0ZXItYnkKICAgICAgIChsZXQgKChmdW4gKHBjYXNlIHBy
ZWRpY2F0ZQogICAgICAgICAgICAgICAgICAgICgnPSAjJ3ZlcnNpb24tbGlzdC09KQogICAgICAg
ICAgICAgICAgICAgICgnPCAjJ3ZlcnNpb24tbGlzdC08KQogICAgICAgICAgICAgICAgICAgICgn
PiAobGFtYmRhIChhIGIpIChub3QgKHZlcnNpb24tbGlzdC08PSBhIGIpKSkpCiAgICAgICAgICAg
ICAgICAgICAgKF8gKGVycm9yICJVbmtub3duIHByZWRpY2F0ZTogJXMiIHByZWRpY2F0ZSkpKSkK
ICAgICAgICAgICAgICh2ZXIgKHZlcnNpb24tdG8tbGlzdCB2ZXJzaW9uKSkpCiAgICAgICAgIChs
YW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgIChmdW5jYWxsIGZ1biAocGFja2FnZS1kZXNjLXZl
cnNpb24gcGtnLWRlc2MpIHZlcikpKQogICAgICAgKGZvcm1hdCAidmVyc2lvbnM6JXMlcyIgcHJl
ZGljYXRlIHZlcnNpb24pKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS1maWx0ZXItbWFya2VkICgp
CiAgIkZpbHRlciBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgbm9uLWVtcHR5IHVwZ3JhZGUgbWFy
ay4KVW5saWtlIG90aGVyIGZpbHRlcnMsIHRoaXMgbGVhdmVzIHRoZSBtYXJrcyBpbnRhY3QuIgog
IChpbnRlcmFjdGl2ZSBuaWwgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1w
YWNrYWdlLW1lbnUtbW9kZSkKICAod2lkZW4pCiAgKGxldCAoZm91bmQtZW50cmllcyBtYXJrIHBr
Zy1pZCBlbnRyeSBtYXJrcykKICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAoZ290by1jaGFyIChw
b2ludC1taW4pKQogICAgICAod2hpbGUgKG5vdCAoZW9icCkpCiAgICAgICAgKHNldHEgbWFyayAo
Y2hhci1hZnRlcikpCiAgICAgICAgKHVubGVzcyAoZXEgbWFyayA/XHMpCiAgICAgICAgICAoc2V0
cSBwa2ctaWQgKHRhYnVsYXRlZC1saXN0LWdldC1pZCkpCiAgICAgICAgICAoc2V0cSBlbnRyeSAo
cGFja2FnZS1tZW51LS1wcmludC1pbmZvLXNpbXBsZSBwa2ctaWQpKQogICAgICAgICAgKHB1c2gg
ZW50cnkgZm91bmQtZW50cmllcykKICAgICAgICAgIDs7IHJlbWVtYmVyIHRoZSBtYXJrCiAgICAg
ICAgICAocHVzaCAoY29ucyBwa2ctaWQgbWFyaykgbWFya3MpKQogICAgICAgIChmb3J3YXJkLWxp
bmUpKQogICAgICAoaWYgZm91bmQtZW50cmllcwogICAgICAgICAgKHByb2duCiAgICAgICAgICAg
IChzZXRxIHRhYnVsYXRlZC1saXN0LWVudHJpZXMgZm91bmQtZW50cmllcykKICAgICAgICAgICAg
KHBhY2thZ2UtbWVudS0tZGlzcGxheSB0IG5pbCkKICAgICAgICAgICAgOzsgcmVkbyB0aGUgbWFy
a3MsIGJ1dCB3ZSBtdXN0IHJlbWVtYmVyIHRoZSBtYXJrcyEhCiAgICAgICAgICAgIChnb3RvLWNo
YXIgKHBvaW50LW1pbikpCiAgICAgICAgICAgICh3aGlsZSAobm90IChlb2JwKSkKICAgICAgICAg
ICAgICAoc2V0cSBtYXJrIChjZHIgKGFzc3EgKHRhYnVsYXRlZC1saXN0LWdldC1pZCkgbWFya3Mp
KSkKICAgICAgICAgICAgICAodGFidWxhdGVkLWxpc3QtcHV0LXRhZyAoY2hhci10by1zdHJpbmcg
bWFyaykgdCkpKQogICAgICAgICh1c2VyLWVycm9yICJObyBwYWNrYWdlcyBmb3VuZCIpKSkpKQoK
KGRlZnVuIHBhY2thZ2UtbWVudS1maWx0ZXItdXBncmFkYWJsZSAoKQogICJGaWx0ZXIgXCIqUGFj
a2FnZXMqXCIgYnVmZmVyIHRvIHNob3cgb25seSB1cGdyYWRhYmxlIHBhY2thZ2VzLiIKICAoaW50
ZXJhY3RpdmUgbmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChsZXQgKChwa2dzIChtYXBjYXIgIydj
YXIgKHBhY2thZ2UtbWVudS0tZmluZC11cGdyYWRlcykpKSkKICAgIChwYWNrYWdlLW1lbnUtLWZp
bHRlci1ieQogICAgIChsYW1iZGEgKHBrZykKICAgICAgIChtZW1xbCAocGFja2FnZS1kZXNjLW5h
bWUgcGtnKSBwa2dzKSkKICAgICAidXBncmFkYWJsZSIpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUt
Y2xlYXItZmlsdGVyICgpCiAgIkNsZWFyIGFueSBmaWx0ZXIgY3VycmVudGx5IGFwcGxpZWQgdG8g
dGhlIFwiKlBhY2thZ2VzKlwiIGJ1ZmZlci4iCiAgKGludGVyYWN0aXZlIG5pbCBwYWNrYWdlLW1l
bnUtbW9kZSkKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdl
LW1lbnUtLWdlbmVyYXRlIHQgdCkpCgooZGVmdW4gcGFja2FnZS1saXN0LXBhY2thZ2VzLW5vLWZl
dGNoICgpCiAgIkRpc3BsYXkgYSBsaXN0IG9mIHBhY2thZ2VzLgpEb2VzIG5vdCBmZXRjaCB0aGUg
dXBkYXRlZCBsaXN0IG9mIHBhY2thZ2VzIGJlZm9yZSBkaXNwbGF5aW5nLgpUaGUgbGlzdCBpcyBk
aXNwbGF5ZWQgaW4gYSBidWZmZXIgbmFtZWQgYCpQYWNrYWdlcyonLiIKICAoaW50ZXJhY3RpdmUp
CiAgKGxpc3QtcGFja2FnZXMgdCkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1nZXQt
dmVyc2lvbiAoKQogICJSZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlIGlu
IHdoaWNoIHRoaXMgaXMgdXNlZC4KQXNzdW1lcyBpdCBpcyB1c2VkIGZyb20gYW4gRWxpc3AgZmls
ZSBwbGFjZWQgaW5zaWRlIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5Cm9mIGFuIGluc3RhbGxlZCBF
TFBBIHBhY2thZ2UuClRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgKG9yIG5pbCBpbiBjYXNl
IHdlIGNhbid0IGZpbmQgaXQpLgpJdCB3b3JrcyBpbiBtb3JlIGNhc2VzIGlmIHRoZSBjYWxsIGlz
IGluIHRoZSBmaWxlIHdoaWNoIGNvbnRhaW5zCnRoZSBgVmVyc2lvbjonIGhlYWRlci4iCiAgOzsg
SW4gYSBzZW5zZSwgdGhpcyBpcyBhIGxpZSwgYnV0IGl0IGRvZXMganVzdCB3aGF0IHdlIHdhbnQ6
IHByZWNvbXB1dGUKICA7OyB0aGUgdmVyc2lvbiBhdCBjb21waWxlIHRpbWUgYW5kIGhhcmRjb2Rl
cyBpdCBpbnRvIHRoZSAuZWxjIGZpbGUhCiAgKGRlY2xhcmUgKHB1cmUgdCkpCiAgOzsgSGFjayBh
bGVydCEKICAobGV0ICgoZmlsZSAob3IgKG1hY3JvZXhwLWZpbGUtbmFtZSkgYnVmZmVyLWZpbGUt
bmFtZSkpKQogICAgKGNvbmQKICAgICAoKG51bGwgZmlsZSkgbmlsKQogICAgIDs7IFBhY2thZ2Vz
IGFyZSBub3JtYWxseSBpbnN0YWxsZWQgaW50byBkaXJlY3RvcmllcyBuYW1lZCAiPHBrZz4tPHZl
cnM+IiwKICAgICA7OyBzbyBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlcmUuCiAgICAg
KChzdHJpbmctbWF0Y2ggIi9bXi9dKy1cXChbMC05XVxcKD86WzAtOS5dXFx8cHJlXFx8YmV0YVxc
fGFscGhhXFx8c25hcHNob3RcXCkrXFwpL1teL10rXFwnIiBmaWxlKQogICAgICAobWF0Y2gtc3Ry
aW5nIDEgZmlsZSkpCiAgICAgOzsgRm9yIHBhY2thZ2VzIHJ1biBzdHJhaWdodCBmcm9tIHRoZSBh
biBlbHBhLmdpdCBjbG9uZSwgdGhlcmUncyBubwogICAgIDs7ICItPHZlcnM+IiBpbiB0aGUgZGly
ZWN0b3J5IG5hbWUsIHNvIHdlIGhhdmUgdG8gZmV0Y2ggdGhlIHZlcnNpb24KICAgICA7OyB0aGUg
aGFyZCB3YXkuCiAgICAgKHQKICAgICAgKGxldCogKChwa2dkaXIgKGZpbGUtbmFtZS1kaXJlY3Rv
cnkgZmlsZSkpCiAgICAgICAgICAgICAocGtnbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSAo
ZGlyZWN0b3J5LWZpbGUtbmFtZSBwa2dkaXIpKSkKICAgICAgICAgICAgIChtYWluZmlsZSAoZXhw
YW5kLWZpbGUtbmFtZSAoY29uY2F0IHBrZ25hbWUgIi5lbCIpIHBrZ2RpcikpKQogICAgICAgICh1
bmxlc3MgKGZpbGUtcmVhZGFibGUtcCBtYWluZmlsZSkgKHNldHEgbWFpbmZpbGUgZmlsZSkpCiAg
ICAgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCBtYWluZmlsZSkKICAgICAgICAgIChyZXF1aXJl
ICdsaXNwLW1udCkKICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAgIChpbnNl
cnQtZmlsZS1jb250ZW50cyBtYWluZmlsZSkKICAgICAgICAgICAgKG9yIChsbS1oZWFkZXIgInBh
Y2thZ2UtdmVyc2lvbiIpCiAgICAgICAgICAgICAgICAobG0taGVhZGVyICJ2ZXJzaW9uIikpKSkp
KSkpKQoKDAo7Ozs7IFF1aWNrc3RhcnQ6IHByZWNvbXB1dGUgYWN0aXZhdGlvbiBhY3Rpb25zIGZv
ciBmYXN0ZXIgc3RhcnQgdXAuCgo7OyBBY3RpdmF0aW5nIHBhY2thZ2VzIHZpYSBgcGFja2FnZS1p
bml0aWFsaXplJyBpcyBjb3N0bHk6IGZvciBOIGluc3RhbGxlZAo7OyBwYWNrYWdlcywgaXQgbmVl
ZHMgdG8gcmVhZCBhbGwgTiA8cGtnPi1wa2cuZWwgZmlsZXMgZmlyc3QgdG8gZGVjaWRlCjs7IHdo
aWNoIHBhY2thZ2VzIHRvIGFjdGl2YXRlLCBhbmQgdGhlbiBhZ2FpbiBOIDxwa2c+LWF1dG9sb2Fk
cy5lbCBmaWxlcy4KOzsgVG8gc3BlZWQgdGhpcyB1cCwgd2UgcHJlY29tcHV0ZSBhIG1lZ2EtYXV0
b2xvYWRzIGZpbGUgd2hpY2ggaXMgdGhlCjs7IGNvbmNhdGVuYXRpb24gb2YgYWxsIHRob3NlIDxw
a2c+LWF1dG9sb2Fkcy5lbCwgc28gd2UgY2FuIGFjdGl2YXRlCjs7IGFsbCBwYWNrYWdlcyBieSBs
b2FkaW5nIHRoaXMgb25lIGZpbGUgKGFuZCBoZW5jZSB3aXRob3V0IGluaXRpYWxpemluZwo7OyBw
YWNrYWdlLmVsKS4KCjs7IE90aGVyIHRoYW4gc3BlZWRpbmcgdGhpbmdzIHVwLCB0aGlzIGFsc28g
b2ZmZXJzIGEgYm9vdHN0cmFwIGZlYXR1cmU6Cjs7IGl0IGxldHMgdXMgYWN0aXZhdGUgcGFja2Fn
ZXMgYWNjb3JkaW5nIHRvIGBwYWNrYWdlLWxvYWQtbGlzdCcgYW5kCjs7IGBwYWNrYWdlLXVzZXIt
ZGlyJyBldmVuIGJlZm9yZSB0aG9zZSB2YXJzIGFyZSBzZXQuCgooZGVmY3VzdG9tIHBhY2thZ2Ut
cXVpY2tzdGFydCBuaWwKICAiUHJlY29tcHV0ZSBhY3RpdmF0aW9uIGFjdGlvbnMgdG8gc3BlZWQg
dXAgc3RhcnR1cC4KVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGBwYWNrYWdlLXF1aWNrc3RhcnQt
cmVmcmVzaCcgZXZlcnkgdGltZSB0aGUKYWN0aXZhdGlvbnMgbmVlZCB0byBiZSBjaGFuZ2VkLCBz
dWNoIGFzIHdoZW4gYHBhY2thZ2UtbG9hZC1saXN0JyBpcyBtb2RpZmllZC4iCiAgOnR5cGUgJ2Jv
b2xlYW4KICA6dmVyc2lvbiAiMjcuMSIpCgo7OzsjIyNhdXRvbG9hZAooZGVmY3VzdG9tIHBhY2th
Z2UtcXVpY2tzdGFydC1maWxlCiAgKGxvY2F0ZS11c2VyLWVtYWNzLWZpbGUgInBhY2thZ2UtcXVp
Y2tzdGFydC5lbCIpCiAgIkxvY2F0aW9uIG9mIHRoZSBmaWxlIHVzZWQgdG8gc3BlZWQgdXAgYWN0
aXZhdGlvbiBvZiBwYWNrYWdlcyBhdCBzdGFydHVwLiIKICA6dHlwZSAnZmlsZQogIDpncm91cCAn
YXBwbGljYXRpb25zCiAgOmluaXRpYWxpemUgIydjdXN0b20taW5pdGlhbGl6ZS1kZWxheQogIDp2
ZXJzaW9uICIyNy4xIikKCihkZWZ1biBwYWNrYWdlLS1xdWlja3N0YXJ0LW1heWJlLXJlZnJlc2gg
KCkKICAoaWYgcGFja2FnZS1xdWlja3N0YXJ0CiAgICAgIDs7IEZJWE1FOiBEZWxheSByZWZyZXNo
IGluIGNhc2Ugd2UncmUgaW5zdGFsbGluZy9kZWxldGluZwogICAgICA7OyBzZXZlcmFsIHBhY2th
Z2VzIQogICAgICAocGFja2FnZS1xdWlja3N0YXJ0LXJlZnJlc2gpCiAgICAoZGVsZXRlLWZpbGUg
KGNvbmNhdCBwYWNrYWdlLXF1aWNrc3RhcnQtZmlsZSAiYyIpKQogICAgKGRlbGV0ZS1maWxlIHBh
Y2thZ2UtcXVpY2tzdGFydC1maWxlKSkpCgooZGVmdW4gcGFja2FnZS1xdWlja3N0YXJ0LXJlZnJl
c2ggKCkKICAiKFJlKUdlbmVyYXRlIHRoZSBgcGFja2FnZS1xdWlja3N0YXJ0LWZpbGUnLiIKICAo
aW50ZXJhY3RpdmUpCiAgKHBhY2thZ2UtaW5pdGlhbGl6ZSAnbm8tYWN0aXZhdGUpCiAgKHJlcXVp
cmUgJ2luZm8pCiAgKGxldCAoKHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtncyAoKSkKICAgICAgICA7
OyBQcmV0ZW5kIHdlIGhhdmVuJ3QgYWN0aXZhdGVkIGFueXRoaW5nIHlldCEKICAgICAgICAocGFj
a2FnZS1hY3RpdmF0ZWQtbGlzdCAoKSkKICAgICAgICA7OyBNYWtlIHN1cmUgd2UgY2FuIGxvYWQg
dGhpcyBmaWxlIHdpdGhvdXQgbG9hZC1zb3VyY2UtZmlsZS1mdW5jdGlvbi4KICAgICAgICAoY29k
aW5nLXN5c3RlbS1mb3Itd3JpdGUgJ2VtYWNzLWludGVybmFsKQogICAgICAgIDs7IEVuc3VyZSB0
aGF0IGBwcCcgYW5kIGBwcmluMS10by1zdHJpbmcnIGNhbGxzIGZ1cnRoZXIgZG93bgogICAgICAg
IDs7IGFyZW4ndCB0cnVuY2F0ZWQuCiAgICAgICAgKHByaW50LWxlbmd0aCBuaWwpCiAgICAgICAg
KHByaW50LWxldmVsIG5pbCkKICAgICAgICAoSW5mby1kaXJlY3RvcnktbGlzdCAnKCIiKSkpCiAg
ICAoZG9saXN0IChlbHQgcGFja2FnZS1hbGlzdCkKICAgICAgKGNvbmRpdGlvbi1jYXNlIGVycgog
ICAgICAgICAgKHBhY2thZ2UtYWN0aXZhdGUgKGNhciBlbHQpKQogICAgICAgIDs7IERvbid0IGxl
dCBmYWlsdXJlIG9mIGFjdGl2YXRpb24gb2YgYSBwYWNrYWdlIGFyYml0cmFyaWx5IHN0b3AKICAg
ICAgICA7OyBhY3RpdmF0aW9uIG9mIGZ1cnRoZXIgcGFja2FnZXMuCiAgICAgICAgKGVycm9yICht
ZXNzYWdlICIlcyIgKGVycm9yLW1lc3NhZ2Utc3RyaW5nIGVycikpKSkpCiAgICAoc2V0cSBwYWNr
YWdlLS1xdWlja3N0YXJ0LXBrZ3MgKG5yZXZlcnNlIHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtncykp
CiAgICAod2l0aC10ZW1wLWZpbGUgcGFja2FnZS1xdWlja3N0YXJ0LWZpbGUKICAgICAgKGVtYWNz
LWxpc3AtbW9kZSkgICAgICAgICAgICAgICAgIDtGb3IgYHN5bnRheC1wcHNzJy4KICAgICAgKGlu
c2VydCAiOzs7IFF1aWNrc3RhcnQgZmlsZSB0byBhY3RpdmF0ZSBhbGwgcGFja2FnZXMgYXQgc3Rh
cnR1cCAgLSotIGxleGljYWwtYmluZGluZzp0IC0qLVxuIikKICAgICAgKGluc2VydCAiOzsgwqHC
oSBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBgcGFja2FnZS1xdWlja3N0YXJ0LXJlZnJl
c2gnLCBETyBOT1QgRURJVCAhIVxuXG4iKQogICAgICAoZG9saXN0IChwa2cgcGFja2FnZS0tcXVp
Y2tzdGFydC1wa2dzKQogICAgICAgIChsZXQqICgoZmlsZQogICAgICAgICAgICAgICAgOzsgUHJl
ZmVyIHVuY29tcGlsZWQgZmlsZXMgKGFuZCBkb24ndCBhY2NlcHQgLnNvIGZpbGVzKS4KICAgICAg
ICAgICAgICAgIChsZXQgKChsb2FkLXN1ZmZpeGVzICcoIi5lbCIgIi5lbGMiKSkpCiAgICAgICAg
ICAgICAgICAgIChsb2NhdGUtbGlicmFyeSAocGFja2FnZS0tYXV0b2xvYWRzLWZpbGUtbmFtZSBw
a2cpKSkpCiAgICAgICAgICAgICAgIChwZmlsZSAocHJpbjEtdG8tc3RyaW5nIGZpbGUpKSkKICAg
ICAgICAgIChpbnNlcnQgIihsZXQgKChsb2FkLXRydWUtZmlsZS1uYW1lICIgcGZpbGUgIilcClwo
bG9hZC1maWxlLW5hbWUgIiBwZmlsZSAiKSlcbiIpCiAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29u
dGVudHMgZmlsZSkKICAgICAgICAgIDs7IEZpeHVwIHRoZSBzcGVjaWFsICMkIHJlYWRlciBmb3Jt
IGFuZCB0aHJvdyBhd2F5IGNvbW1lbnRzLgogICAgICAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9y
d2FyZCAiI1xcJFxcfF47XFwoLipcblxcKSIgbmlsICdtb3ZlKQogICAgICAgICAgICAodW5sZXNz
IChwcHNzLXN0cmluZy10ZXJtaW5hdG9yIChzYXZlLW1hdGNoLWRhdGEgKHN5bnRheC1wcHNzKSkp
CiAgICAgICAgICAgICAgKHJlcGxhY2UtbWF0Y2ggKGlmIChtYXRjaC1lbmQgMSkgIiIgcGZpbGUp
IHQgdCkpKQogICAgICAgICAgKHVubGVzcyAoYm9scCkgKGluc2VydCAiXG4iKSkKICAgICAgICAg
IChpbnNlcnQgIilcbiIpKSkKICAgICAgKHBwIGAoZGVmdmFyIHBhY2thZ2UtYWN0aXZhdGVkLWxp
c3QpIChjdXJyZW50LWJ1ZmZlcikpCiAgICAgIChwcCBgKHNldHEgcGFja2FnZS1hY3RpdmF0ZWQt
bGlzdAogICAgICAgICAgICAgICAgIChkZWxldGUtZHVwcwogICAgICAgICAgICAgICAgICAoYXBw
ZW5kICcsKG1hcGNhciAjJ3BhY2thZ2UtZGVzYy1uYW1lIHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtn
cykKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLWFjdGl2YXRlZC1saXN0KSkpCiAg
ICAgICAgICAoY3VycmVudC1idWZmZXIpKQogICAgICAobGV0ICgoaW5mby1kaXJzIChidXRsYXN0
IEluZm8tZGlyZWN0b3J5LWxpc3QpKSkKICAgICAgICAod2hlbiBpbmZvLWRpcnMKICAgICAgICAg
IChwcCBgKHByb2duIChyZXF1aXJlICdpbmZvKQogICAgICAgICAgICAgICAgICAgICAgKGluZm8t
aW5pdGlhbGl6ZSkKICAgICAgICAgICAgICAgICAgICAgIChzZXRxIEluZm8tZGlyZWN0b3J5LWxp
c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgJyxpbmZvLWRpcnMgSW5mby1k
aXJlY3RvcnktbGlzdCkpKQogICAgICAgICAgICAgIChjdXJyZW50LWJ1ZmZlcikpKSkKICAgICAg
OzsgVXNlIGBccycgaW5zdGVhZCBvZiBhIHNwYWNlIGNoYXJhY3Rlciwgc28gdGhpcyBjb2RlIGNo
dW5rIGlzIG5vdAogICAgICA7OyBtaXN0YWtlbiBmb3IgYW4gYWN0dWFsIGZpbGUtbG9jYWwgc2Vj
dGlvbiBvZiBwYWNrYWdlLmVsLgogICAgICAoaW5zZXJ0ICIMCjs7IExvY2FsXHNWYXJpYWJsZXM6
Cjs7IHZlcnNpb24tY29udHJvbDogbmV2ZXIKOzsgbm8tdXBkYXRlLWF1dG9sb2FkczogdAo7OyBi
eXRlLWNvbXBpbGUtd2FybmluZ3M6IChub3QgbWFrZS1sb2NhbCkKOzsgRW5kOgoiKSkKICAgIDs7
IEZJWE1FOiBEbyBpdCBhc3luY2hyb25vdXNseSBpbiBhbiBFbWFjcyBzdWJwcm9jZXNzLCBhbmQK
ICAgIDs7IGRvbid0IHNob3cgdGhlIGJ5dGUtY29tcGlsZXIgd2FybmluZ3MuCiAgICAoYnl0ZS1j
b21waWxlLWZpbGUgcGFja2FnZS1xdWlja3N0YXJ0LWZpbGUpKSkKCihkZWZ1biBwYWNrYWdlLS1p
bWVudS1wcmV2LWluZGV4LXBvc2l0aW9uLWZ1bmN0aW9uICgpCiAgIk1vdmUgcG9pbnQgdG8gcHJl
dmlvdXMgbGluZSBpbiBwYWNrYWdlLW1lbnUgYnVmZmVyLgpUaGlzIGZ1bmN0aW9uIGlzIHVzZWQg
YXMgYSB2YWx1ZSBmb3IKYGltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24nLiIKICAo
dW5sZXNzIChib2JwKQogICAgKGZvcndhcmQtbGluZSAtMSkpKQoKKGRlZnVuIHBhY2thZ2UtLWlt
ZW51LWV4dHJhY3QtaW5kZXgtbmFtZS1mdW5jdGlvbiAoKQogICJSZXR1cm4gaW1lbnUgbmFtZSBm
b3IgbGluZSBhdCBwb2ludC4KVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgdmFsdWUgZm9yCmBp
bWVudS1leHRyYWN0LWluZGV4LW5hbWUtZnVuY3Rpb24nLiAgUG9pbnQgc2hvdWxkIGJlIGF0IHRo
ZQpiZWdpbm5pbmcgb2YgdGhlIGxpbmUuIgogIChsZXQgKChwYWNrYWdlLWRlc2MgKHRhYnVsYXRl
ZC1saXN0LWdldC1pZCkpKQogICAgKGZvcm1hdCAiJXMgKCVzKTogJXMiCiAgICAgICAgICAgIChw
YWNrYWdlLWRlc2MtbmFtZSBwYWNrYWdlLWRlc2MpCiAgICAgICAgICAgIChwYWNrYWdlLXZlcnNp
b24tam9pbiAocGFja2FnZS1kZXNjLXZlcnNpb24gcGFja2FnZS1kZXNjKSkKICAgICAgICAgICAg
KHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBhY2thZ2UtZGVzYykpKSkKCihkZWZ1biBwYWNrYWdlLS1x
dWVyeS1kZXNjICgmb3B0aW9uYWwgYWxpc3QpCiAgIlF1ZXJ5IHRoZSB1c2VyIGZvciBhIHBhY2th
Z2Ugb3IgcmV0dXJuIHRoZSBwYWNrYWdlIGF0IHBvaW50LgpUaGUgb3B0aW9uYWwgYXJndW1lbnQg
QUxJU1QgbXVzdCBjb25zaXN0IG9mIGVsZW1lbnRzIHdpdGggdGhlCmZvcm0gKFBLRy1OQU1FIFBL
Ry1ERVNDKS4gIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0bwpgcGFja2FnZS1h
bGlzdCcuIgogIChvciAodGFidWxhdGVkLWxpc3QtZ2V0LWlkKQogICAgICAobGV0ICgoYWxpc3Qg
KG9yIGFsaXN0IHBhY2thZ2UtYWxpc3QpKSkKICAgICAgICAoY2FkciAoYXNzb2MgKGNvbXBsZXRp
bmctcmVhZCAiUGFja2FnZTogIiBhbGlzdCBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAgYWxp
c3QgIydzdHJpbmc9KSkpKSkKCihkZWZ1biBwYWNrYWdlLWJyb3dzZS11cmwgKGRlc2MgJm9wdGlv
bmFsIHNlY29uZGFyeSkKICAiT3BlbiB0aGUgd2Vic2l0ZSBvZiB0aGUgcGFja2FnZSB1bmRlciBw
b2ludCBpbiBhIGJyb3dzZXIuCmBicm93c2UtdXJsJyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUg
YnJvd3NlciB0byBiZSB1c2VkLiAgSWYKU0VDT05EQVJZIChpbnRlcmFjdGl2ZWx5LCB0aGUgcHJl
Zml4KSwgdXNlIHRoZSBzZWNvbmRhcnkgYnJvd3Nlci4KREVTQyBtdXN0IGJlIGEgYHBhY2thZ2Ut
ZGVzYycgb2JqZWN0LiIKICAoaW50ZXJhY3RpdmUgKGxpc3QgKHBhY2thZ2UtLXF1ZXJ5LWRlc2Mp
CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtcHJlZml4LWFyZykKICAgICAgICAgICAgICAg
cGFja2FnZS1tZW51LW1vZGUpCiAgKHVubGVzcyBkZXNjCiAgICAodXNlci1lcnJvciAiTm8gcGFj
a2FnZSBoZXJlIikpCiAgKGxldCAoKHVybCAoY2RyIChhc3NvYyA6dXJsIChwYWNrYWdlLWRlc2Mt
ZXh0cmFzIGRlc2MpKSkpKQogICAgKHVubGVzcyB1cmwKICAgICAgKHVzZXItZXJyb3IgIk5vIHdl
YnNpdGUgZm9yICVzIiAocGFja2FnZS1kZXNjLW5hbWUgZGVzYykpKQogICAgKGlmIHNlY29uZGFy
eQogICAgICAgIChmdW5jYWxsIGJyb3dzZS11cmwtc2Vjb25kYXJ5LWJyb3dzZXItZnVuY3Rpb24g
dXJsKQogICAgICAoYnJvd3NlLXVybCB1cmwpKSkpCgooZGVjbGFyZS1mdW5jdGlvbiBpZXRmLWRy
dW1zLXBhcnNlLWFkZHJlc3MgImlldGYtZHJ1bXMiCiAgICAgICAgICAgICAgICAgIChzdHJpbmcg
Jm9wdGlvbmFsIGRlY29kZSkpCgooZGVmdW4gcGFja2FnZS1tYWludGFpbmVycyAocGtnLWRlc2Mg
Jm9wdGlvbmFsIG5vLWVycm9yKQogICJSZXR1cm4gYW4gZW1haWwgYWRkcmVzcyBmb3IgdGhlIG1h
aW50YWluZXJzIG9mIFBLRy1ERVNDLgpUaGUgZW1haWwgYWRkcmVzcyBtYXkgY29udGFpbiBjb21t
YXMsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQptYWludGFpbmVycy4gIElmIG5vIG1haW50YWluZXJz
IGFyZSBmb3VuZCwgYW4gZXJyb3Igd2lsbCBiZQpzaWduYWxlZC4gIElmIHRoZSBvcHRpb25hbCBh
cmd1bWVudCBOTy1FUlJPUiBpcyBub24tbmlsIG5vIGVycm9yCndpbGwgYmUgc2lnbmFsZWQgaW4g
dGhhdCBjYXNlLiIKICAodW5sZXNzIChwYWNrYWdlLWRlc2MtcCBwa2ctZGVzYykKICAgIChlcnJv
ciAiSW52YWxpZCBwYWNrYWdlIGRlc2NyaXB0aW9uOiAlUyIgcGtnLWRlc2MpKQogIChsZXQqICgo
bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAoZXh0cmFzIChwYWNr
YWdlLWRlc2MtZXh0cmFzIHBrZy1kZXNjKSkKICAgICAgICAgKG1haW50IChhbGlzdC1nZXQgOm1h
aW50YWluZXIgZXh0cmFzKSkpCiAgICAoY29uZAogICAgICgoYW5kIChudWxsIG1haW50KSAobnVs
bCBuby1lcnJvcikpCiAgICAgICh1c2VyLWVycm9yICJQYWNrYWdlIGAlcycgaGFzIG5vIGV4cGxp
Y2l0IG1haW50YWluZXIiIG5hbWUpKQogICAgICgoYW5kIChub3QgKHByb2duCiAgICAgICAgICAg
ICAgICAgIChyZXF1aXJlICdpZXRmLWRydW1zKQogICAgICAgICAgICAgICAgICAoaWV0Zi1kcnVt
cy1wYXJzZS1hZGRyZXNzIChjZHIgbWFpbnQpKSkpCiAgICAgICAgICAgKG51bGwgbm8tZXJyb3Ip
KQogICAgICAodXNlci1lcnJvciAiUGFja2FnZSBgJXMnIGhhcyBubyBtYWludGFpbmVyIGFkZHJl
c3MiIG5hbWUpKQogICAgICgobm90IChudWxsIG1haW50KSkKICAgICAgKHdpdGgtdGVtcC1idWZm
ZXIKICAgICAgICAocGFja2FnZS0tcHJpbnQtZW1haWwtYnV0dG9uIG1haW50KQogICAgICAgIChz
dHJpbmctdHJpbSAoc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMgKGJ1ZmZlci1zdHJpbmcpKSkpKSkp
KQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtcmVwb3J0LWJ1ZyAoZGVzYykKICAiUHJl
cGFyZSBhIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgbWFpbnRhaW5lcnMgb2YgYSBwYWNrYWdlLgpE
RVNDIG11c3QgYmUgYSBgcGFja2FnZS1kZXNjJyBvYmplY3QuIgogIChpbnRlcmFjdGl2ZSAobGlz
dCAocGFja2FnZS0tcXVlcnktZGVzYyBwYWNrYWdlLWFsaXN0KSkKICAgICAgICAgICAgICAgcGFj
a2FnZS1tZW51LW1vZGUpCiAgKGxldCAoKG1haW50IChwYWNrYWdlLW1haW50YWluZXJzIGRlc2Mp
KQogICAgICAgIChuYW1lIChzeW1ib2wtbmFtZSAocGFja2FnZS1kZXNjLW5hbWUgZGVzYykpKQog
ICAgICAgIHZhcnMpCiAgICAoZG9saXN0LXdpdGgtcHJvZ3Jlc3MtcmVwb3J0ZXIgKGdyb3VwIGN1
c3RvbS1jdXJyZW50LWdyb3VwLWFsaXN0KQogICAgICAgICJTY2FubmluZyBmb3IgbW9kaWZpZWQg
dXNlciBvcHRpb25zLi4uIgogICAgICAoZG9saXN0IChlbnQgKGdldCAoY2RyIGdyb3VwKSAnY3Vz
dG9tLWdyb3VwKSkKICAgICAgICAod2hlbiAoYW5kIChjdXN0b20tdmFyaWFibGUtcCAoY2FyIGVu
dCkpCiAgICAgICAgICAgICAgICAgICAoYm91bmRwIChjYXIgZW50KSkKICAgICAgICAgICAgICAg
ICAgIChub3QgKGVxCiAgICAgICAgICAgICAgICAgICAgICAgICA7OyBXZSBhcmUgbm90IHVzaW5n
IGBjdXN0b20tLXN0YW5kYXJkLXZhbHVlJwogICAgICAgICAgICAgICAgICAgICAgICAgOzsgdG8g
cmV0YWluIGNvbXBhdGliaWxpdHkgZm9yIEVtYWNzIDI3LgogICAgICAgICAgICAgICAgICAgICAg
ICAgKGV2YWwgKGNhciAoZ2V0IChjYXIgZW50KSAnc3RhbmRhcmQtdmFsdWUpKSB0KQogICAgICAg
ICAgICAgICAgICAgICAgICAgKGRlZmF1bHQtdG9wbGV2ZWwtdmFsdWUgKGNhciBlbnQpKSkpCiAg
ICAgICAgICAgICAgICAgICAoZmlsZS1pbi1kaXJlY3RvcnktcCAoY2FyIGdyb3VwKSAocGFja2Fn
ZS1kZXNjLWRpciBkZXNjKSkpCiAgICAgICAgICAocHVzaCAoY2FyIGVudCkgdmFycykpKSkKICAg
IChkbGV0ICgocmVwb3J0ZXItcHJvbXB0LWZvci1zdW1tYXJ5LXAgdCkpCiAgICAgIChyZXBvcnRl
ci1zdWJtaXQtYnVnLXJlcG9ydCBtYWludCBuYW1lIHZhcnMpKSkpCgo7Ozs7IEludHJvc3BlY3Rp
b24KCihkZWZ1biBwYWNrYWdlLWdldC1kZXNjcmlwdG9yIChwa2ctbmFtZSkKICAiUmV0dXJuIHRo
ZSBgcGFja2FnZS1kZXNjJyBvZiBQS0ctTkFNRS4iCiAgKHVubGVzcyBwYWNrYWdlLS1pbml0aWFs
aXplZCAocGFja2FnZS1pbml0aWFsaXplICduby1hY3RpdmF0ZSkpCiAgKG9yIChwYWNrYWdlLS1n
ZXQtYWN0aXZhdGFibGUtcGtnIHBrZy1uYW1lKQogICAgICAoY2FkciAoYXNzcSBwa2ctbmFtZSBw
YWNrYWdlLWFsaXN0KSkKICAgICAgKGNhZHIgKGFzc3EgcGtnLW5hbWUgcGFja2FnZS1hcmNoaXZl
LWNvbnRlbnRzKSkpKQoKKHByb3ZpZGUgJ3BhY2thZ2UpCgo7OzsgcGFja2FnZS5lbCBlbmRzIGhl
cmUKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--=-=-Content-Type: application/x-tar
Content-Disposition: attachment; filename=package-vc.tar
Content-Transfer-Encoding: base64

cGFja2FnZS12Yy0wLjEuMC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1
MAAwMDAxNzUwADAwMDAwMDAwMDAwADE0NDY3NzMyNzI1ADAxMzA2NgAgNQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw
YWNrYWdlLXZjLTAuMS4wL3BhY2thZ2UtdmMtcGtnLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUw
ADAwMDE3NTAAMDAwMDAwMDA2NTYAMTQ0Njc3MzI3MjUAMDE2MTc3ACAwAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcGhpbGlwAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABwaGlsaXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7
IEdlbmVyYXRlZCBwYWNrYWdlIGRlc2NyaXB0aW9uIGZyb20gcGFja2FnZS12Yy5lbCAgLSotIG5v
LWJ5dGUtY29tcGlsZTogdCAtKi0KKGRlZmluZS1wYWNrYWdlICJwYWNrYWdlLXZjIiAiMC4xLjAi
ICJNYW5hZ2UgcGFja2FnZXMgZnJvbSBWQyBjaGVja291dHMiICcoKGVtYWNzICIyOS4xIikgKHBh
Y2thZ2UgIjEuMS4xIikpIDpjb21taXQgImI2YjBhMTRlODY3NTIwNzEyODllNmFhMGUyYTQxYzU5
YTE1YmZkNDkiIDp1cmwgImh0dHBzOi8vZWxwYS5nbnUub3JnL3BhY2thZ2VzL3BhY2thZ2UtdmMu
aHRtbCIgOmF1dGhvcnMgJygoIlBoaWxpcCBLYWx1ZGVyY2ljIiAuICJwaGlsaXBrQHBvc3Rlby5u
ZXQiKSkgOm1haW50YWluZXIgJygiUGhpbGlwIEthbHVkZXJjaWMiIC4gInBoaWxpcGtAcG9zdGVv
Lm5ldCIpIDprZXl3b3JkcyAnKCJ0b29scyIpKQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFj
a2FnZS12Yy0wLjEuMC9wYWNrYWdlLXZjLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAw
MDAxNzUwADAwMDAwMTI0MTMwADE0NDY3NjQwMjM1ADAxNTQwNAAgMAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ozsg
cGFja2FnZS12Yy5lbCAtLS0gTWFuYWdlIHBhY2thZ2VzIGZyb20gVkMgY2hlY2tvdXRzICAgICAt
Ki0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0KCjs7IENvcHlyaWdodCAoQykgMjAyMi0yMDIzIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKOzsgQXV0aG9yOiBQaGlsaXAgS2FsdWRlcmNp
YyA8cGhpbGlwa0Bwb3N0ZW8ubmV0Pgo7OyBLZXl3b3JkczogdG9vbHMKOzsgVmVyc2lvbjogMC4x
LjAKOzsgUGFja2FnZS1SZXF1aXJlczogKChlbWFjcyAiMjkuMSIpIChwYWNrYWdlICIxLjEuMSIp
KQoKOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgoKOzsgR05VIEVtYWNzIGlzIGZy
ZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKOzsgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkKOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24g
MyBvZiB0aGUgTGljZW5zZSwgb3IKOzsgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KCjs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAo7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgo7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCjs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCgo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo7OyBhbG9uZyB3aXRoIEdOVSBFbWFjcy4g
IElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVu
dGFyeToKCjs7IFdoaWxlIHBhY2thZ2VzIG1hbmFnZWQgYnkgcGFja2FnZS5lbCB1c2UgdGFyYmFs
bHMgZm9yIGRpc3RyaWJ1dGluZwo7OyB0aGUgc291cmNlIGNvZGUsIHRoaXMgZXh0ZW5zaW9uIGFs
bG93cyBmb3IgcGFja2FnZXMgdG8gYmUgZmV0Y2hlZAo7OyBhbmQgdXBncmFkZWQgZGlyZWN0bHkg
ZnJvbSBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCjs7Cjs7IFRvIGluc3RhbGwgYSBwYWNrYWdl
IGZyb20gc291cmNlIHVzZSBgcGFja2FnZS12Yy1pbnN0YWxsJy4gIElmIHlvdQo7OyBhcmVuJ3Qg
aW50ZXJlc3RlZCBpbiBhY3RpdmF0aW5nIGEgcGFja2FnZSwgeW91IGNhbiB1c2UKOzsgYHBhY2th
Z2UtdmMtY2hlY2tvdXQnIGluc3RlYWQsIHdoaWNoIHdpbGwgcHJvbXB0IHlvdSBmb3IgYSB0YXJn
ZXQKOzsgZGlyZWN0b3J5LiAgSWYgeW91IHdpc2ggdG8gcmUtdXNlIGFuIGV4aXN0aW5nIGNoZWNr
b3V0LCB0aGUgY29tbWFuZAo7OyBgcGFja2FnZS12Yy1pbnN0YWxsLWZyb20tY2hlY2tvdXQnIHdp
bGwgY3JlYXRlIGEgc3ltYm9saWMgbGluayBhbmQKOzsgcHJlcGFyZSB0aGUgcGFja2FnZS4KOzsK
OzsgSWYgeW91IG1ha2UgbG9jYWwgY2hhbmdlcyB0aGF0IHlvdSB3aXNoIHRvIHNoYXJlIHdpdGgg
YW4gdXBzdHJlYW0KOzsgbWFpbnRhaW5lciwgdGhlIGNvbW1hbmQgYHBhY2thZ2UtdmMtcHJlcGFy
ZS1wYXRjaCcgY2FuIHByZXBhcmUKOzsgdGhlc2UgYXMgcGF0Y2hlcyB0byBzZW5kIHZpYSBFbWFp
bC4KCjs7OyBUT0RPOgoKOzsgLSBBbGxvdyBtYWludGFpbmluZyBwYXRjaGVzIHRoYXQgYXJlIHBv
cnRlZCBiYWNrIG9udG8gcmVndWxhcgo7OyAgIHBhY2thZ2VzIGFuZCBtYWludGFpbmVkIGJldHdl
ZW4gdmVyc2lvbnMuCgo7OzsgQ29kZToKCihldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAncngp
KQooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ21hcCkpCihldmFsLXdoZW4tY29tcGlsZSAo
cmVxdWlyZSAnY2wtbGliKSkKKHJlcXVpcmUgJ3BhY2thZ2UpCihyZXF1aXJlICdsaXNwLW1udCkK
KHJlcXVpcmUgJ3ZjKQoocmVxdWlyZSAnc2VxKQoKKGRlZmdyb3VwIHBhY2thZ2UtdmMgbmlsCiAg
Ik1hbmFnZSBwYWNrYWdlcyBmcm9tIFZDIGNoZWNrb3V0cy4iCiAgOmdyb3VwICdwYWNrYWdlCiAg
OmxpbmsgJyhjdXN0b20tbWFudWFsICIoZW1hY3MpIEZldGNoaW5nIFBhY2thZ2UgU291cmNlcyIp
CiAgOnByZWZpeCAicGFja2FnZS12Yy0iCiAgOnZlcnNpb24gIjI5LjEiKQoKKGRlZmNvbnN0IHBh
Y2thZ2UtdmMtLWVscGEtcGFja2FnZXMtdmVyc2lvbiAxCiAgIlZlcnNpb24gbnVtYmVyIG9mIHRo
ZSBwYWNrYWdlIHNwZWNpZmljYXRpb24gZm9ybWF0IHVuZGVyc3Rvb2QgYnkgcGFja2FnZS12Yy4i
KQoKKGRlZmN1c3RvbSBwYWNrYWdlLXZjLWhldXJpc3RpYy1hbGlzdAogIGAoKCwocnggYm9zICJo
dHRwIiAoPyAicyIpICI6Ly8iCiAgICAgICAgICAob3IgKDogKD8gInd3dy4iKSAiZ2l0aHViLmNv
bSIKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkKICAgICAg
ICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkpCiAgICAgICAgICAgICAg
KDogImNvZGViZXJnLm9yZyIKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAi
LiIgIl8iKSkKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkp
CiAgICAgICAgICAgICAgKDogKD8gInd3dy4iKSAiZ2l0bGFiIiAoKyAiLiIgKCsgYWxudW0pKQog
ICAgICAgICAgICAgICAgICIvIiAoKyAob3IgYWxudW0gIi0iICIuIiAiXyIpKQogICAgICAgICAg
ICAgICAgICIvIiAoKyAob3IgYWxudW0gIi0iICIuIiAiXyIpKSkKICAgICAgICAgICAgICAoOiAi
Z2l0LnNyLmh0IgogICAgICAgICAgICAgICAgICIvfiIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8i
KSkKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkpCiAgICAg
ICAgICAgICAgKDogImdpdC4iIChvciAic2F2YW5uYWgiICJzdiIpICIuIiAoPyAibm9uIikgImdu
dS5vcmcvIgogICAgICAgICAgICAgICAgIChvciAiciIgImdpdCIpICIvIgogICAgICAgICAgICAg
ICAgICgrIChvciBhbG51bSAiLSIgIi4iICJfIikpICg/ICIvIikpKQogICAgICAgICAgKG9yICg/
ICIvIikgIi5naXQiKSBlb3MpCiAgICAgLiBHaXQpCiAgICAoLChyeCBib3MgImh0dHAiICg/ICJz
IikgIjovLyIKICAgICAgICAgIChvciAoOiAiaGcuc3IuaHQiCiAgICAgICAgICAgICAgICAgIi9+
IiAoKyAob3IgYWxudW0gIi0iICIuIiAiXyIpKQogICAgICAgICAgICAgICAgICIvIiAoKyAob3Ig
YWxudW0gIi0iICIuIiAiXyIpKSkKICAgICAgICAgICAgICAoOiAiaGcuIiAob3IgInNhdmFubmFo
IiAic3YiKSAiLiIgKD8gIm5vbiIpICJnbnUub3JnL2hnd2ViLyIKICAgICAgICAgICAgICAgICAo
KyAob3IgYWxudW0gIi0iICIuIiAiXyIpKSAoPyAiLyIpKSkKICAgICAgICAgIGVvcykKICAgICAu
IEhnKQogICAgKCwocnggYm9zICJodHRwIiAoPyAicyIpICI6Ly8iCiAgICAgICAgICAob3IgKDog
ImJ6ci4iIChvciAic2F2YW5uYWgiICJzdiIpICIuIiAoPyAibm9uIikgImdudS5vcmcvci8iCiAg
ICAgICAgICAgICAgICAgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkgKD8gIi8iKSkpCiAgICAg
ICAgICBlb3MpCiAgICAgLiBCenIpKQogICJIZXVyaXN0aWMgbWFwcGluZyBVUkwgcmVndWxhciBl
eHByZXNzaW9ucyB0byBWQyBiYWNrZW5kcy4iCiAgOnR5cGUgYChhbGlzdCA6a2V5LXR5cGUgKHJl
Z2V4cCA6dGFnICJSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgVVJMcyIpCiAgICAgICAgICAg
ICAgICA6dmFsdWUtdHlwZSAoY2hvaWNlIDp0YWcgIlZDIEJhY2tlbmQiCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICxAKG1hcGNhciAobGFtYmRhIChiKSBgKGNvbnN0ICxiKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjLWhhbmRsZWQt
YmFja2VuZHMpKSkKICA6dmVyc2lvbiAiMjkuMSIpCgooZGVmY3VzdG9tIHBhY2thZ2UtdmMtZGVm
YXVsdC1iYWNrZW5kICdHaXQKICAiRGVmYXVsdCBWQyBiYWNrZW5kIHVzZWQgd2hlbiBjbG9uaW5n
IGEgcGFja2FnZSByZXBvc2l0b3J5LgpJZiBubyByZXBvc2l0b3J5IHR5cGUgd2FzIHNwZWNpZmll
ZCBvciBjb3VsZCBiZSBndWVzc2VkIGJ5CmBwYWNrYWdlLXZjLWhldXJpc3RpYy1hbGlzdCcsIHRo
aXMgaXMgdGhlIGRlZmF1bHQgVkMgYmFja2VuZAp1c2VkIGFzIGZhbGxiYWNrLiAgVGhlIHZhbHVl
IG11c3QgYmUgYSBtZW1iZXIgb2YKYHZjLWhhbmRsZWQtYmFja2VuZHMnIGFuZCB0aGUgbmFtZWQg
YmFja2VuZCBtdXN0IGltcGxlbWVudAp0aGUgYGNsb25lJyBmdW5jdGlvbi4iCiAgOnR5cGUgYChj
aG9pY2UgLEAobWFwY2FyIChsYW1iZGEgKGIpIChsaXN0ICdjb25zdCBiKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdmMtaGFuZGxlZC1iYWNrZW5kcykpCiAgOnZlcnNpb24gIjI5LjEiKQoK
KGRlZmN1c3RvbSBwYWNrYWdlLXZjLXJlZ2lzdGVyLWFzLXByb2plY3QgdAogICJOb24tbmlsIG1l
YW5zIHRoYXQgcGFja2FnZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgcHJvamVjdHMuIgogIDp0
eXBlICdib29sZWFuCiAgOnZlcnNpb24gIjMwLjEiKQoKKGRlZnZhciBwYWNrYWdlLXZjLXNlbGVj
dGVkLXBhY2thZ2VzKSA7IHBhY2lmeSBieXRlLWNvbXBpbGVyCgo7OzsjIyNhdXRvbG9hZAooZGVm
dW4gcGFja2FnZS12Yy1pbnN0YWxsLXNlbGVjdGVkLXBhY2thZ2VzICgpCiAgIkVuc3VyZSBwYWNr
YWdlcyBzcGVjaWZpZWQgaW4gYHBhY2thZ2UtdmMtc2VsZWN0ZWQtcGFja2FnZXMnIGFyZSBpbnN0
YWxsZWQuIgogIChpbnRlcmFjdGl2ZSkKICAocGNhc2UtZG9saXN0IChgKCxuYW1lIC4gLHNwZWMp
IHBhY2thZ2UtdmMtc2VsZWN0ZWQtcGFja2FnZXMpCiAgICAod2hlbiAoc3RyaW5ncCBuYW1lKQog
ICAgICAoc2V0cSBuYW1lIChpbnRlcm4gbmFtZSkpKQogICAgKGxldCAoKHBrZy1kZXNjcyAoYXNz
b2MgbmFtZSBwYWNrYWdlLWFsaXN0ICMnc3RyaW5nPSkpKQogICAgICAodW5sZXNzIChzZXEtc29t
ZSAjJ3BhY2thZ2UtdmMtcCAoY2RyIHBrZy1kZXNjcykpCiAgICAgICAgKGNvbmQKICAgICAgICAg
KChudWxsIHNwZWMpCiAgICAgICAgICAocGFja2FnZS12Yy1pbnN0YWxsIG5hbWUpKQogICAgICAg
ICAoKHN0cmluZ3Agc3BlYykKICAgICAgICAgIChwYWNrYWdlLXZjLWluc3RhbGwgbmFtZSBzcGVj
KSkKICAgICAgICAgKChsaXN0cCBzcGVjKQogICAgICAgICAgKHBhY2thZ2UtdmMtLWFyY2hpdmVz
LWluaXRpYWxpemUpCiAgICAgICAgICAocGFja2FnZS12Yy0tdW5wYWNrCiAgICAgICAgICAgKG9y
IChjYWRyIChhc3NvYyBuYW1lIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cykpCiAgICAgICAgICAg
ICAgIChwYWNrYWdlLWRlc2MtY3JlYXRlIDpuYW1lIG5hbWUgOmtpbmQgJ3ZjKSkKICAgICAgICAg
ICBzcGVjKSkpKSkpKQoKKGRlZmN1c3RvbSBwYWNrYWdlLXZjLXNlbGVjdGVkLXBhY2thZ2VzICco
KQogICJMaXN0IG9mIHBhY2thZ2VzIHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQuCkVhY2ggbWVtYmVy
IG9mIHRoZSBsaXN0IGlzIG9mIHRoZSBmb3JtIChOQU1FIC4gU1BFQyksIHdoZXJlIE5BTUUKaXMg
YSBzeW1ib2wgZGVzaWduYXRpbmcgdGhlIHBhY2thZ2UgYW5kIFNQRUMgaXMgb25lIG9mOgoKLSBu
aWwsIGlmIGFueSBwYWNrYWdlIHZlcnNpb24gY2FuIGJlIGluc3RhbGxlZDsKLSBhIHZlcnNpb24g
c3RyaW5nLCBpZiB0aGF0IHNwZWNpZmljIHJldmlzaW9uIGlzIHRvIGJlIGluc3RhbGxlZDsKLSBh
IHByb3BlcnR5IGxpc3QsIGRlc2NyaWJpbmcgYSBwYWNrYWdlIHNwZWNpZmljYXRpb24uICBGb3Ig
bW9yZQogIGRldGFpbHMsIHBsZWFzZSBjb25zdWx0IHRoZSBzdWJzZWN0aW9uIFwiU3BlY2lmeWlu
ZyBQYWNrYWdlCiAgU291cmNlc1wiIGluIHRoZSBJbmZvIG5vZGUgYChlbWFjcylGZXRjaGluZyBQ
YWNrYWdlIFNvdXJjZXMnLgoKVGhpcyB1c2VyIG9wdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkg
dXBkYXRlZCB0byBzdG9yZSBwYWNrYWdlCnNwZWNpZmljYXRpb25zIGZvciBwYWNrYWdlcyB0aGF0
IGFyZSBub3Qgc3BlY2lmaWVkIGluIGFueQphcmNoaXZlLiIKICA6dHlwZSAnKGFsaXN0IDp0YWcg
Ikxpc3Qgb2YgcGFja2FnZXMgeW91IHdhbnQgdG8gYmUgaW5zdGFsbGVkIgogICAgICAgICAgICAg
ICAgOmtleS10eXBlIChzeW1ib2wgOnRhZyAiUGFja2FnZSIpCiAgICAgICAgICAgICAgICA6dmFs
dWUtdHlwZQogICAgICAgICAgICAgICAgKGNob2ljZSAoY29uc3QgOnRhZyAiQW55IHJldmlzaW9u
IiBuaWwpCiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAiU3BlY2lmaWMgcmV2
aXNpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAocGxpc3QgOm9wdGlvbnMgKCg6dXJsIHN0
cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOmJyYW5jaCBz
dHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpsaXNwLWRp
ciBzdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDptYWlu
LWZpbGUgc3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6
ZG9jIHN0cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnZj
LWJhY2tlbmQgc3ltYm9sKSkpKSkKICA6dmVyc2lvbiAiMjkuMSIpCgooZGVmdmFyIHBhY2thZ2Ut
dmMtLWFyY2hpdmUtc3BlYy1hbGlzdHMgbmlsCiAgIkxpc3Qgb2YgcGFja2FnZSBzcGVjaWZpY2F0
aW9ucyBmb3IgZWFjaCBhcmNoaXZlLgpUaGUgbGlzdCBtYXBzIGVhY2ggcGFja2FnZSBuYW1lLCBh
cyBhIHN0cmluZywgdG8gYSBwbGlzdCBhcwpzcGVjaWZpZWQgaW4gYHBhY2thZ2UtdmMtc2VsZWN0
ZWQtcGFja2FnZXMnLiIpCgooZGVmdmFyIHBhY2thZ2UtdmMtLWFyY2hpdmUtZGF0YS1hbGlzdCBu
aWwKICAiTGlzdCBvZiBwYWNrYWdlIHNwZWNpZmljYXRpb24gbWV0YWRhdGEgZm9yIGFyY2hpdmVz
LgpFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgaGFzIHRoZSBmb3JtIChBUkNISVZFIC4gUExJU1Qp
LCB3aGVyZQpQTElTVCBrZXlzIGFyZSBvbmUgb2Y6CgogYDp2ZXJzaW9uJyAoaW50ZWdlcikKICAg
SW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGZvcm1hdHRpbmcsIHRvIGJlIGNvbXBh
cmVkCiAgIHdpdGggYHBhY2thZ2UtdmMtLWVscGEtcGFja2FnZXMtdmVyc2lvbicuCgogYDp2Yy1i
YWNrZW5kJyAoc3ltYm9sKQogICBBIHN5bWJvbCBvZiB0aGUgZGVmYXVsdCBWQyBiYWNrZW5kIHRv
IHVzZSBpZiBhIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbgogICBkb2VzIG5vdCBpbmRpY2F0ZSBhIGJh
Y2tlbmQuICBUaGUgdmFsdWUgb3VnaHQgdG8gYmUgYSBtZW1iZXIgb2YKICAgYHZjLWhhbmRsZWQt
YmFja2VuZHMnLiAgSWYgb21pdHRlZCwgYHZjLWNsb25lJyB3aWxsIGZhbGwgYmFjayBvbgogICBg
cGFja2FnZS12Yy1kZWZhdWx0LWJhY2tlbmQnLgoKQWxsIG90aGVyIHZhbHVlcyBhcmUgaWdub3Jl
ZC4iKQoKKGRlZnVuIHBhY2thZ2UtdmMtLWRlc2MtPnNwZWMgKHBrZy1kZXNjICZvcHRpb25hbCBu
YW1lKQogICJSZXRyaWV2ZSB0aGUgcGFja2FnZSBzcGVjaWZpY2F0aW9uIGZvciBQS0ctREVTQy4K
VGhlIG9wdGlvbmFsIGFyZ3VtZW50IE5BTUUgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRl
ZmF1bHQKbmFtZSBmb3IgUEtHLURFU0MuIgogIChhbGlzdC1nZXQKICAgKHNldHEgbmFtZSAob3Ig
bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgKGlmIChhbmQgKHBhY2thZ2Ut
ZGVzYy1hcmNoaXZlIHBrZy1kZXNjKQogICAgICAgICAgICAobm90IChhbGlzdC1nZXQgbmFtZSBw
YWNrYWdlLXZjLXNlbGVjdGVkLXBhY2thZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
aWwgbmlsICMnc3RyaW5nPSkpKQogICAgICAgKGFsaXN0LWdldCAoaW50ZXJuIChwYWNrYWdlLWRl
c2MtYXJjaGl2ZSBwa2ctZGVzYykpCiAgICAgICAgICAgICAgICAgIHBhY2thZ2UtdmMtLWFyY2hp
dmUtc3BlYy1hbGlzdHMpCiAgICAgOzsgQ29uc3VsdCBib3RoIG91ciBsb2NhbCBsaXN0IG9mIHBh
Y2thZ2Ugc3BlY2lmaWNhdGlvbnMsIGFzIHdlbGwKICAgICA7OyBhcyB0aGUgbGlzdHMgcHJvdmlk
ZWQgYnkgdGhlIGFyY2hpdmVzLgogICAgIChhcHBseSAjJ2FwcGVuZCAoY29ucyBwYWNrYWdlLXZj
LXNlbGVjdGVkLXBhY2thZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydj
ZHIgcGFja2FnZS12Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cykpKSkKICAgJygpIG5pbCAjJ3N0cmlu
Zz0pKQoKKGRlZnVuIHBhY2thZ2UtdmMtLXJlYWQtYXJjaGl2ZS1kYXRhIChhcmNoaXZlKQogICJV
cGRhdGUgYHBhY2thZ2UtdmMtLWFyY2hpdmUtc3BlYy1hbGlzdHMnIGZvciBBUkNISVZFLgpUaGlz
IGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBob29rIGZvciBgcGFja2FnZS1yZWFk
LWFyY2hpdmUtaG9vaycuIgogIChsZXQgKChjb250ZW50cy1maWxlIChleHBhbmQtZmlsZS1uYW1l
CiAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgImFyY2hpdmVzLyVzL2VscGEtcGFja2Fn
ZXMuZWxkIiBhcmNoaXZlKQogICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLXVzZXItZGly
KSkpCiAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBjb250ZW50cy1maWxlKQogICAgICAod2l0aC10
ZW1wLWJ1ZmZlcgogICAgICAgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkICd1dGYtOCkp
CiAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgY29udGVudHMtZmlsZSkKICAgICAgICAg
IDs7IFRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUg
Zm9ybQogICAgICAgICAgOzsKICAgICAgICAgIDs7ICAgICgoKCJmb28iIDp1cmwgIi4uLiIgLi4u
KSAuLi4pCiAgICAgICAgICA7OyAgICAgOnZlcnNpb24gMQogICAgICAgICAgOzsgICAgIDpkZWZh
dWx0LXZjIEdpdCkKICAgICAgICAgIChsZXQgKChzcGVjIChyZWFkIChjdXJyZW50LWJ1ZmZlcikp
KSkKICAgICAgICAgICAgKHdoZW4gKGVxIHBhY2thZ2UtdmMtLWVscGEtcGFja2FnZXMtdmVyc2lv
bgogICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCAoY2RyIHNwZWMpIDp2ZXJzaW9uKSkK
ICAgICAgICAgICAgICAoc2V0ZiAoYWxpc3QtZ2V0IChpbnRlcm4gYXJjaGl2ZSkgcGFja2FnZS12
Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cykKICAgICAgICAgICAgICAgICAgICAoY2FyIHNwZWMpKSkK
ICAgICAgICAgICAgKHNldGYgKGFsaXN0LWdldCAoaW50ZXJuIGFyY2hpdmUpIHBhY2thZ2UtdmMt
LWFyY2hpdmUtZGF0YS1hbGlzdCkKICAgICAgICAgICAgICAgICAgKGNkciBzcGVjKSkKICAgICAg
ICAgICAgKHdoZW4tbGV0ICgoZGVmYXVsdC12YyAocGxpc3QtZ2V0IChjZHIgc3BlYykgOmRlZmF1
bHQtdmMpKQogICAgICAgICAgICAgICAgICAgICAgICgobm90IChtZW1xIGRlZmF1bHQtdmMgdmMt
aGFuZGxlZC1iYWNrZW5kcykpKSkKICAgICAgICAgICAgICAod2FybiAiQXJjaGl2ZSBgJVMnIGV4
cGVjdHMgbWlzc2luZyBWQyBiYWNrZW5kICVTIgogICAgICAgICAgICAgICAgICAgIGFyY2hpdmUg
KHBsaXN0LWdldCAoY2RyIHNwZWMpIDpkZWZhdWx0LXZjKSkpKSkpKSkpCgooZGVmdW4gcGFja2Fn
ZS12Yy0tZG93bmxvYWQtYW5kLXJlYWQtYXJjaGl2ZXMgKCZvcHRpb25hbCBhc3luYykKICAiRG93
bmxvYWQgc3BlY2lmaWNhdGlvbnMgb2YgYWxsIGBwYWNrYWdlLWFyY2hpdmVzJyBhbmQgcmVhZCB0
aGVtLgpQb3B1bGF0ZSBgcGFja2FnZS12Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cycgd2l0aCB0aGUg
cmVzdWx0LgoKSWYgb3B0aW9uYWwgYXJndW1lbnQgQVNZTkMgaXMgbm9uLW5pbCwgcGVyZm9ybSB0
aGUgZG93bmxvYWRzCmFzeW5jaHJvbm91c2x5LiIKICAoZG9saXN0IChhcmNoaXZlIHBhY2thZ2Ut
YXJjaGl2ZXMpCiAgICAoY29uZGl0aW9uLWNhc2UgZXJyCiAgICAgICAgKHBhY2thZ2UtLWRvd25s
b2FkLW9uZS1hcmNoaXZlIGFyY2hpdmUgImVscGEtcGFja2FnZXMuZWxkIiBhc3luYykKICAgICAg
KGVycm9yIChtZXNzYWdlICJGYWlsZWQgdG8gZG93bmxvYWQgYCVzJyBhcmNoaXZlOiAlUyIgKGNh
ciBhcmNoaXZlKSBlcnIpKSkpKQoKKGFkZC1ob29rICdwYWNrYWdlLXJlYWQtYXJjaGl2ZS1ob29r
ICAgICAjJ3BhY2thZ2UtdmMtLXJlYWQtYXJjaGl2ZS1kYXRhIDIwKQoKKGRlZnVuIHBhY2thZ2Ut
dmMtY29tbWl0IChwa2cpCiAgIlJldHVybiB0aGUgbGFzdCBjb21taXQgb2YgYSBkZXZlbG9wbWVu
dCBwYWNrYWdlIFBLRy4iCiAgKGNsLWFzc2VydCAocGFja2FnZS12Yy1wIHBrZykpCiAgOzsgRklY
TUU6IHZjIHNob3VsZCBiZSBleHRlbmRlZCB0byBhbGxvdyBxdWVyeWluZyB0aGUgY29tbWl0IG9m
IGEKICA7OyBkaXJlY3RvcnkgKGFzIGlzIHBvc3NpYmxlIHdoZW4gZGVhbGluZyB3aXRoIGdpdCBy
ZXBvc2l0b3JpZXMpLgogIDs7IFRoaXMgc2hvdWxkIGJlIGEgZmFsbGJhY2sgb3B0aW9uLgogIChj
bC1sb29wIHdpdGggZGlyID0gKHBhY2thZ2UtZGVzYy1kaXIgcGtnKQogICAgICAgICAgIGZvciBm
aWxlIGluIChkaXJlY3RvcnktZmlsZXMgZGlyIHQgIlxcLmVsXFwnIiB0KQogICAgICAgICAgIHdo
ZW4gKHZjLXdvcmtpbmctcmV2aXNpb24gZmlsZSkgcmV0dXJuIGl0CiAgICAgICAgICAgZmluYWxs
eSByZXR1cm4gInVua25vd24iKSkKCihkZWZ1biBwYWNrYWdlLXZjLS12ZXJzaW9uIChwa2cpCiAg
IlJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBWQyBwYWNrYWdlIFBLRy4iCiAgKGNs
LWFzc2VydCAocGFja2FnZS12Yy1wIHBrZykpCiAgKGlmLWxldCAoKG1haW4tZmlsZSAocGFja2Fn
ZS12Yy0tbWFpbi1maWxlIHBrZykpKQogICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgIChp
bnNlcnQtZmlsZS1jb250ZW50cyBtYWluLWZpbGUpCiAgICAgICAgKHBhY2thZ2Utc3RyaXAtcmNz
LWlkCiAgICAgICAgIChvciAobG0taGVhZGVyICJwYWNrYWdlLXZlcnNpb24iKQogICAgICAgICAg
ICAgKGxtLWhlYWRlciAidmVyc2lvbiIpCiAgICAgICAgICAgICAiMCIpKSkKICAgICIwIikpCgoo
ZGVmdW4gcGFja2FnZS12Yy0tbWFpbi1maWxlIChwa2ctZGVzYykKICAiUmV0dXJuIHRoZSBuYW1l
IG9mIHRoZSBtYWluIGZpbGUgZm9yIFBLRy1ERVNDLiIKICAoY2wtYXNzZXJ0IChwYWNrYWdlLXZj
LXAgcGtnLWRlc2MpKQogIChsZXQqICgocGtnLXNwZWMgKHBhY2thZ2UtdmMtLWRlc2MtPnNwZWMg
cGtnLWRlc2MpKQogICAgICAgICAobmFtZSAoc3ltYm9sLW5hbWUgKHBhY2thZ2UtZGVzYy1uYW1l
IHBrZy1kZXNjKSkpCiAgICAgICAgIChkaXJlY3RvcnkgKGZpbGUtbmFtZS1jb25jYXQKICAgICAg
ICAgICAgICAgICAgICAgKG9yIChwYWNrYWdlLWRlc2MtZGlyIHBrZy1kZXNjKQogICAgICAgICAg
ICAgICAgICAgICAgICAgKGV4cGFuZC1maWxlLW5hbWUgbmFtZSBwYWNrYWdlLXVzZXItZGlyKSkK
ICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCBwa2ctc3BlYyA6bGlzcC1kaXIpKSkKICAg
ICAgICAgKGZpbGUgKGV4cGFuZC1maWxlLW5hbWUKICAgICAgICAgICAgICAgIChvciAocGxpc3Qt
Z2V0IHBrZy1zcGVjIDptYWluLWZpbGUpCiAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCBuYW1l
ICIuZWwiKSkKICAgICAgICAgICAgICAgIGRpcmVjdG9yeSkpKQogICAgKGlmIChmaWxlLWV4aXN0
cy1wIGZpbGUpIGZpbGUKICAgICAgOzsgVGhlIGZvbGxvd2luZyBoZXVyaXN0aWMgaXMgb25seSBu
ZWNlc3Nhcnkgd2hlbiBmZXRjaGluZyBhCiAgICAgIDs7IHJlcG9zaXRvcnkgd2l0aCBVUkwgdGhh
dCB3b3VsZCBicmVhayB0aGUgYWJvdmUgYXNzdW1wdGlvbnMuCiAgICAgIDs7IENvbmNyZXRlIGV4
YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYWNoYWMvd2F2ZWZvcm0tZWwgZG9lcwogICAgICA7
OyBub3QgaGF2ZSBhIGZpbGUgd2F2ZWZvcm0tZWwuZWwsIGJ1dCBhIGZpbGUgd2F2ZWZvcm0uZWws
IHNvIHdlCiAgICAgIDs7IHRyeSBhbmQgZmluZCB0aGUgY2xvc2VzdCBtYXRjaC4KICAgICAgKGxl
dCAoKGRpc3RhbmNlIG1vc3QtcG9zaXRpdmUtZml4bnVtKSAoYmVzdCBuaWwpKQogICAgICAgIChk
b2xpc3QgKGFsdCAoZGlyZWN0b3J5LWZpbGVzIGRpcmVjdG9yeSB0ICJcXC5lbFxcJyIgdCkpCiAg
ICAgICAgICAobGV0ICgoc2QgKHN0cmluZy1kaXN0YW5jZSBmaWxlIGFsdCkpKQogICAgICAgICAg
ICAod2hlbiAoYW5kIChub3QgKHN0cmluZy1tYXRjaC1wIChyeCAob3IgKDogIi1hdXRvbG9hZHMu
ZWwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KDogIi1wa2cuZWwiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZW9zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFs
dCkpCiAgICAgICAgICAgICAgICAgICAgICAgKDwgc2QgZGlzdGFuY2UpKQogICAgICAgICAgICAg
ICh3aGVuICg8IHNkIGRpc3RhbmNlKQogICAgICAgICAgICAgICAgKHNldHEgZGlzdGFuY2UgKHN0
cmluZy1kaXN0YW5jZSBmaWxlIGFsdCkKICAgICAgICAgICAgICAgICAgICAgIGJlc3QgYWx0KSkp
KSkKICAgICAgICBiZXN0KSkpKQoKKGRlZnVuIHBhY2thZ2UtdmMtLWdlbmVyYXRlLWRlc2NyaXB0
aW9uLWZpbGUgKHBrZy1kZXNjIHBrZy1maWxlKQogICJHZW5lcmF0ZSBhIHBhY2thZ2UgZGVzY3Jp
cHRpb24gZmlsZSBmb3IgUEtHLURFU0MgYW5kIHdyaXRlIGl0IHRvIFBLRy1GSUxFLiIKICAobGV0
ICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgIDs7IEluZmVyIHRoZSBz
dWJqZWN0IGlmIG1pc3NpbmcuCiAgICAodW5sZXNzIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBwa2ct
ZGVzYykKICAgICAgKHNldGYgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBrZy1kZXNjKQogICAgICAg
ICAgICAobGV0ICgobWFpbi1maWxlIChwYWNrYWdlLXZjLS1tYWluLWZpbGUgcGtnLWRlc2MpKSkK
ICAgICAgICAgICAgICAob3IgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBrZy1kZXNjKQogICAgICAg
ICAgICAgICAgICAoYW5kLWxldCogKChwa2cgKGNhZHIgKGFzc3EgbmFtZSBwYWNrYWdlLWFyY2hp
dmUtY29udGVudHMpKSkpCiAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5
IHBrZykpCiAgICAgICAgICAgICAgICAgIChhbmQgbWFpbi1maWxlIChmaWxlLWV4aXN0cy1wIG1h
aW4tZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAobG0tc3VtbWFyeSBtYWluLWZpbGUpKQog
ICAgICAgICAgICAgICAgICBwYWNrYWdlLS1kZWZhdWx0LXN1bW1hcnkpKSkpCiAgICAobGV0ICgo
cHJpbnQtbGV2ZWwgbmlsKQogICAgICAgICAgKHByaW50LXF1b3RlZCB0KQogICAgICAgICAgKHBy
aW50LWxlbmd0aCBuaWwpKQogICAgICAod3JpdGUtcmVnaW9uCiAgICAgICAoY29uY2F0CiAgICAg
ICAgIjs7OyBHZW5lcmF0ZWQgcGFja2FnZSBkZXNjcmlwdGlvbiBmcm9tICIKICAgICAgICAocmVw
bGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAgICAgICItcGtnXFwuZWxcXCciICIuZWwiCiAgICAg
ICAgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IHBrZy1maWxlKSkKICAgICAgICAiICAtKi0gbm8t
Ynl0ZS1jb21waWxlOiB0IC0qLVxuIgogICAgICAgIChwcmluMS10by1zdHJpbmcKICAgICAgICAg
KG5jb25jCiAgICAgICAgICAobGlzdCAnZGVmaW5lLXBhY2thZ2UKICAgICAgICAgICAgICAgIChz
eW1ib2wtbmFtZSBuYW1lKQogICAgICAgICAgICAgICAgKHBhY2thZ2UtdmMtLXZlcnNpb24gcGtn
LWRlc2MpCiAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXN1bW1hcnkgcGtnLWRlc2MpCiAg
ICAgICAgICAgICAgICAobGV0ICgocmVxdWlyZXMgKHBhY2thZ2UtZGVzYy1yZXFzIHBrZy1kZXNj
KSkpCiAgICAgICAgICAgICAgICAgIChsaXN0ICdxdW90ZQogICAgICAgICAgICAgICAgICAgICAg
ICA7OyBUdXJuIHZlcnNpb24gbGlzdHMgaW50byBzdHJpbmcgZm9ybS4KICAgICAgICAgICAgICAg
ICAgICAgICAgKG1hcGNhcgogICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZWx0KQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAoY2FyIGVsdCkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtdmVyc2lvbi1qb2luIChjYWRyIGVsdCkpKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzKSkpKQogICAgICAgICAgKGxpc3QgOmtpbmQg
J3ZjKQogICAgICAgICAgKHBhY2thZ2UtLWFsaXN0LXRvLXBsaXN0LWFyZ3MKICAgICAgICAgICAo
cGFja2FnZS1kZXNjLWV4dHJhcyBwa2ctZGVzYykpKSkKICAgICAgICAiXG4iKQogICAgICAgbmls
IHBrZy1maWxlIG5pbCAnc2lsZW50KSkpKQoKKGRlZmN1c3RvbSBwYWNrYWdlLXZjLWFsbG93LXNp
ZGUtZWZmZWN0cyBuaWwKICAiV2hldGhlciB0byBwcm9jZXNzIDptYWtlIGFuZCA6c2hlbGwtY29t
bWFuZCBzcGVjIGFyZ3VtZW50cy4KCkl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcnVuIDptYWtlIGFu
ZCA6c2hlbGwtY29tbWFuZCBhcmd1bWVudHMgaW4Kb3JkZXIgdG8gaW5pdGlhbGl6ZSBhIHBhY2th
Z2Ugb3IgYnVpbGQgaXRzIGRvY3VtZW50YXRpb24sIGJ1dApwbGVhc2UgYmUgY2FyZWZ1bCB3aGVu
IGNoYW5naW5nIHRoaXMgb3B0aW9uLCBhcyBpbnN0YWxsaW5nIGFuZAp1cGRhdGluZyBhIHBhY2th
Z2UgY2FuIHJ1biBwb3RlbnRpYWxseSBoYXJtZnVsIGNvZGUuCgpXaGVuIHNldCB0byBhIGxpc3Qg
b2Ygc3ltYm9scyAocGFja2FnZXMpLCBydW4gY29tbWFuZHMgZm9yIG9ubHkKcGFja2FnZXMgaW4g
dGhlIGxpc3QuICBXaGVuIG5pbCwgbmV2ZXIgcnVuIGNvbW1hbmRzLiAgT3RoZXJ3aXNlCndoZW4g
bm9uLW5pbCwgcnVuIGNvbW1hbmRzIGZvciBhbnkgcGFja2FnZSB3aXRoIDptYWtlIG9yCjpzaGVs
bC1jb21tYW5kIHNwZWNpZmllZC4KClBhY2thZ2Ugc3BlY3MgYXJlIGxvYWRlZCBmcm9tIHRydXN0
ZWQgcGFja2FnZSBhcmNoaXZlcy4iCiAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIlJ1biBm
b3IgYWxsIHBhY2thZ2VzIiB0KQogICAgICAgICAgICAgICAgIChyZXBlYXQgOnRhZyAiUnVuIG9u
bHkgZm9yIHNlbGVjdGVkIHBhY2thZ2VzIiAoc3ltYm9sIDp0YWcgIlBhY2thZ2UgbmFtZSIpKQog
ICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJOZXZlciBydW4iIG5pbCkpCiAgOnZlcnNpb24g
IjMwLjEiKQoKKGRlZnVuIHBhY2thZ2UtdmMtLW1ha2UgKHBrZy1zcGVjIHBrZy1kZXNjKQogICJQ
cm9jZXNzIDptYWtlIGFuZCA6c2hlbGwtY29tbWFuZCBpbiBQS0ctU1BFQy4KUEtHLURFU0MgaXMg
dGhlIHBhY2thZ2UgZGVzY3JpcHRvciBmb3IgdGhlIHBhY2thZ2UgdGhhdCBpcyBiZWluZwpwcmVw
YXJlZC4iCiAgKGxldCAoKHRhcmdldCAocGxpc3QtZ2V0IHBrZy1zcGVjIDptYWtlKSkKICAgICAg
ICAoY21kIChwbGlzdC1nZXQgcGtnLXNwZWMgOnNoZWxsLWNvbW1hbmQpKQogICAgICAgIChidWYg
KGZvcm1hdCAiICpwYWNrYWdlLXZjIG1ha2UgJXMqIiAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRl
c2MpKSkpCiAgICAod2hlbiAob3IgY21kIHRhcmdldCkKICAgICAgKHdpdGgtY3VycmVudC1idWZm
ZXIgKGdldC1idWZmZXItY3JlYXRlIGJ1ZikKICAgICAgICAoZXJhc2UtYnVmZmVyKQogICAgICAg
ICh3aGVuIChhbmQgY21kICgvPSAwIChjYWxsLXByb2Nlc3Mgc2hlbGwtZmlsZS1uYW1lIG5pbCB0
IG5pbCBzaGVsbC1jb21tYW5kLXN3aXRjaCBjbWQpKSkKICAgICAgICAgICh3YXJuICJGYWlsZWQg
dG8gcnVuICVzLCBzZWUgYnVmZmVyICVTIiBjbWQgKGJ1ZmZlci1uYW1lKSkpCiAgICAgICAgKHdo
ZW4gKGFuZCB0YXJnZXQgKC89IDAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJtYWtlIiBuaWwgdCBu
aWwgKGlmIChjb25zcCB0YXJnZXQpIHRhcmdldCAobGlzdCB0YXJnZXQpKSkpKQogICAgICAgICAg
KHdhcm4gIkZhaWxlZCB0byBtYWtlICVzLCBzZWUgYnVmZmVyICVTIiB0YXJnZXQgKGJ1ZmZlci1u
YW1lKSkpKSkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gb3JnLWV4cG9ydC10by1maWxlICJveCIgKGJh
Y2tlbmQgZmlsZSkpCgooZGVmdW4gcGFja2FnZS12Yy0tYnVpbGQtZG9jdW1lbnRhdGlvbiAocGtn
LWRlc2MgZmlsZSkKICAiQnVpbGQgZG9jdW1lbnRhdGlvbiBmb3IgcGFja2FnZSBQS0ctREVTQyBm
cm9tIGRvY3VtZW50YXRpb24gc291cmNlIGluIEZJTEUuCkZJTEUgY2FuIGJlIGFuIE9yZyBmaWxl
LCBpbmRpY2F0ZWQgYnkgaXRzIFwiLm9yZ1wiIGV4dGVuc2lvbiwKb3RoZXJ3aXNlIGl0J3MgYXNz
dW1lZCB0byBiZSBhbiBJbmZvIGZpbGUuIgogIChsZXQqICgocGtnLW5hbWUgKHBhY2thZ2UtZGVz
Yy1uYW1lIHBrZy1kZXNjKSkKICAgICAgICAgKGRlZmF1bHQtZGlyZWN0b3J5IChwYWNrYWdlLWRl
c2MtZGlyIHBrZy1kZXNjKSkKICAgICAgICAgKGRvY3MtZGlyZWN0b3J5IChmaWxlLW5hbWUtZGly
ZWN0b3J5IChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKSkKICAgICAgICAgKG91dHB1dCAoZXhwYW5k
LWZpbGUtbmFtZSAoZm9ybWF0ICIlcy5pbmZvIiBwa2ctbmFtZSkpKQogICAgICAgICBjbGVhbi11
cCkKICAgICh3aGVuIChzdHJpbmctbWF0Y2gtcCAiXFwub3JnXFwnIiBmaWxlKQogICAgICAocmVx
dWlyZSAnb3gpCiAgICAgIChyZXF1aXJlICdveC10ZXhpbmZvKQogICAgICAod2l0aC10ZW1wLWJ1
ZmZlcgogICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyBmaWxlKQogICAgICAgIChzZXRxIGZp
bGUgKG1ha2UtdGVtcC1maWxlICJveC10ZXhpbmZvLSIpKQogICAgICAgIChvcmctZXhwb3J0LXRv
LWZpbGUgJ3RleGluZm8gZmlsZSkKICAgICAgICAoc2V0cSBjbGVhbi11cCB0KSkpCiAgICAod2l0
aC1jdXJyZW50LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIiAqcGFja2FnZS12YyBkb2MqIikK
ICAgICAgKGVyYXNlLWJ1ZmZlcikKICAgICAgKGNvbmQKICAgICAgICgoLz0gMCAoY2FsbC1wcm9j
ZXNzICJtYWtlaW5mbyIgbmlsIHQgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUki
IGRvY3MtZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1uby1zcGxpdCIg
ZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1vIiBvdXRwdXQpKQogICAgICAgICht
ZXNzYWdlICJGYWlsZWQgdG8gYnVpbGQgbWFudWFsICVzLCBzZWUgYnVmZmVyICVTIgogICAgICAg
ICAgICAgICAgIGZpbGUgKGJ1ZmZlci1uYW1lKSkpCiAgICAgICAoKC89IDAgKGNhbGwtcHJvY2Vz
cyAiaW5zdGFsbC1pbmZvIiBuaWwgdCBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91
dHB1dCAoZXhwYW5kLWZpbGUtbmFtZSAiZGlyIikpKQogICAgICAgIChtZXNzYWdlICJGYWlsZWQg
dG8gaW5zdGFsbCBtYW51YWwgJXMsIHNlZSBidWZmZXIgJVMiCiAgICAgICAgICAgICAgICAgb3V0
cHV0IChidWZmZXItbmFtZSkpKQogICAgICAgKChraWxsLWJ1ZmZlcikpKSkKICAgICh3aGVuIGNs
ZWFuLXVwCiAgICAgIChkZWxldGUtZmlsZSBmaWxlKSkpKQoKKGRlZnVuIHBhY2thZ2UtdmMtaW5z
dGFsbC1kZXBlbmRlbmNpZXMgKHJlcXVpcmVtZW50cykKICAiSW5zdGFsbCBtaXNzaW5nIGRlcGVu
ZGVuY2llcywgYW5kIHJldHVybiBtaXNzaW5nIG9uZXMuClRoZSByZXR1cm4gdmFsdWUgd2lsbCBi
ZSBuaWwgaWYgZXZlcnl0aGluZyB3YXMgZm91bmQsIG9yIGEgbGlzdApvZiAoTkFNRSBWRVJTSU9O
KSBwYWlycyBvZiBhbGwgcGFja2FnZXMgdGhhdCBjb3VsZG4ndCBiZSBmb3VuZC4KClJFUVVJUkVN
RU5UUyBzaG91bGQgYmUgYSBsaXN0IG9mIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOyBlYWNoCmVs
ZW1lbnQgaW4gdGhpcyBsaXN0IHNob3VsZCBoYXZlIHRoZSBmb3JtIChQQUNLQUdFIFZFUlNJT04t
TElTVCksCndoZXJlIFBBQ0tBR0UgaXMgYSBwYWNrYWdlIG5hbWUgYW5kIFZFUlNJT04tTElTVCBp
cyB0aGUgcmVxdWlyZWQKdmVyc2lvbiBvZiB0aGF0IHBhY2thZ2UuIgogIChsZXQgKCh0by1pbnN0
YWxsICcoKSkgKG1pc3NpbmcgJygpKSkKICAgIChjbC1sYWJlbHMgKChzZWFyY2ggKHBrZykKICAg
ICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gZmluZCBhbGwgZGVwZW5kZW5jaWVzIGZvciBQS0cu
IgogICAgICAgICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgICAgICAgKChhc3NxIChjYXIg
cGtnKSB0by1pbnN0YWxsKSkgO2luaGliaXQgY3ljbGVzCiAgICAgICAgICAgICAgICAgICAoKHBh
Y2thZ2UtaW5zdGFsbGVkLXAgKGNhciBwa2cpKSkKICAgICAgICAgICAgICAgICAgICgobGV0KiAo
KHBhYyBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IChkZXNjIChjYWRyIChhc3NvYyAoY2FyIHBrZykgcGFjKSkpKQogICAgICAgICAgICAgICAgICAg
ICAgKGlmIGRlc2MKICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgocmVxcyAocGFja2Fn
ZS1kZXNjLXJlcXMgZGVzYykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2ggZGVz
YyB0by1pbnN0YWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGMgIydzZWFyY2gg
cmVxcykpCiAgICAgICAgICAgICAgICAgICAgICAgIChwdXNoIHBrZyBtaXNzaW5nKSkpKSkpCiAg
ICAgICAgICAgICAgICAodmVyc2lvbi1vcmRlciAoYSBiKQogICAgICAgICAgICAgICAgICAiUHJl
ZGljYXRlIHRvIHNvcnQgcGFja2FnZXMgaW4gb3JkZXIuIgogICAgICAgICAgICAgICAgICAodmVy
c2lvbi1saXN0LTwKICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBiKQog
ICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIGEpKSkKICAgICAgICAgICAg
ICAgIChkdXBsaWNhdGUtcCAoYSBiKQogICAgICAgICAgICAgICAgICAiQXJlIEEgYW5kIEIgdGhl
IHNhbWUgcGFja2FnZT8iCiAgICAgICAgICAgICAgICAgIChlcSAocGFja2FnZS1kZXNjLW5hbWUg
YSkgKHBhY2thZ2UtZGVzYy1uYW1lIGIpKSkKICAgICAgICAgICAgICAgIChkZXBlbmRzLW9uLXAg
KHRhcmdldCBwYWNrYWdlKQogICAgICAgICAgICAgICAgICAiRG9lcyBQQUNLQUdFIGRlcGVuZCBv
biBUQVJHRVQ/IgogICAgICAgICAgICAgICAgICAob3IgKGVxIHRhcmdldCBwYWNrYWdlKQogICAg
ICAgICAgICAgICAgICAgICAgKGxldCogKChwYWMgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjIChjYWRyIChhc3NvYyBwYWNrYWdlIHBh
YykpKSkKICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBkZXNjIChzZXEtc29tZQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBseS1wYXJ0aWFsbHkgIydkZXBlbmRzLW9u
LXAgdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRl
c2MtcmVxcyBkZXNjKSkpKSkpCiAgICAgICAgICAgICAgICAoZGVwZW5kZW50LW9yZGVyIChhIGIp
CiAgICAgICAgICAgICAgICAgIChsZXQgKChkZXNjLWEgKHBhY2thZ2UtZGVzYy1uYW1lIGEpKQog
ICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy1iIChwYWNrYWdlLWRlc2MtbmFtZSBiKSkpCiAg
ICAgICAgICAgICAgICAgICAgKG9yIChub3QgZGVzYy1hKSAobm90IGRlc2MtYikKICAgICAgICAg
ICAgICAgICAgICAgICAgKG5vdCAoZGVwZW5kcy1vbi1wIGRlc2MtYiBkZXNjLWEpKQogICAgICAg
ICAgICAgICAgICAgICAgICAoZGVwZW5kcy1vbi1wIGRlc2MtYSBkZXNjLWIpKSkpKQogICAgICAo
bWFwYyAjJ3NlYXJjaCByZXF1aXJlbWVudHMpCiAgICAgIChjbC1jYWxsZiBzb3J0IHRvLWluc3Rh
bGwgIyd2ZXJzaW9uLW9yZGVyKQogICAgICAoY2wtY2FsbGYgc2VxLXVuaXEgdG8taW5zdGFsbCAj
J2R1cGxpY2F0ZS1wKQogICAgICAoY2wtY2FsbGYgc29ydCB0by1pbnN0YWxsICMnZGVwZW5kZW50
LW9yZGVyKSkKICAgIChtYXBjICMncGFja2FnZS1pbnN0YWxsLWZyb20tYXJjaGl2ZSB0by1pbnN0
YWxsKQogICAgbWlzc2luZykpCgooZGVmdW4gcGFja2FnZS12Yy0tdW5wYWNrLTEgKHBrZy1kZXNj
IHBrZy1kaXIpCiAgIlByZXBhcmUgUEtHLURFU0MgdGhhdCBpcyBhbHJlYWR5IGNoZWNrZWQtb3V0
IGluIFBLRy1ESVIuClRoaXMgaW5jbHVkZXMgZG93bmxvYWRpbmcgbWlzc2luZyBkZXBlbmRlbmNp
ZXMsIGdlbmVyYXRpbmcKYXV0b2xvYWRzLCBnZW5lcmF0aW5nIGEgcGFja2FnZSBkZXNjcmlwdGlv
biBmaWxlICh1c2VkIHRvCmlkZW50aWZ5IGEgcGFja2FnZSBhcyBhIFZDIHBhY2thZ2UgbGF0ZXIg
b24pLCBidWlsZGluZwpkb2N1bWVudGF0aW9uIGFuZCBtYXJraW5nIHRoZSBwYWNrYWdlIGFzIGlu
c3RhbGxlZC4iCiAgKGxldCAobWlzc2luZykKICAgIDs7IFJlbW92ZSBhbnkgcHJldmlvdXMgaW5z
dGFuY2Ugb2YgUEtHLURFU0MgZnJvbSBgcGFja2FnZS1hbGlzdCcKICAgIChsZXQgKChwa2dzIChh
c3NxIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVzYykgcGFja2FnZS1hbGlzdCkpKQogICAgICAo
d2hlbiBwa2dzCiAgICAgICAgKHNldGYgKGNkciBwa2dzKSAoc2VxLXJlbW92ZSAjJ3BhY2thZ2Ut
dmMtcCAoY2RyIHBrZ3MpKSkpKQoKICAgIDs7IEluIGNhc2UgdGhlIHBhY2thZ2Ugd2FzIGluc3Rh
bGxlZCBkaXJlY3RseSBmcm9tIHNvdXJjZSwgdGhlCiAgICA7OyBkZXBlbmRlbmN5IGxpc3Qgd2Fz
bid0IGtub3cgYmVmb3JlaGFuZCwgYW5kIHRoZXkgbWlnaHQgaGF2ZQogICAgOzsgdG8gYmUgaW5z
dGFsbGVkIGV4cGxpY2l0bHkuCiAgICAobGV0ICgoZGVwcyAnKCkpKQogICAgICAoZG9saXN0IChm
aWxlIChkaXJlY3RvcnktZmlsZXMgcGtnLWRpciB0ICJcXC5lbFxcJyIgdCkpCiAgICAgICAgKHdp
dGgtdGVtcC1idWZmZXIKICAgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyBmaWxlKQogICAg
ICAgICAgKHdoZW4tbGV0KiAoKHJlcXVpcmUtbGluZXMgKGxtLWhlYWRlci1tdWx0aWxpbmUgInBh
Y2thZ2UtcmVxdWlyZXMiKSkpCiAgICAgICAgICAgICh0aHJlYWQtbGFzdAogICAgICAgICAgICAg
IChtYXBjb25jYXQgIydpZGVudGl0eSByZXF1aXJlLWxpbmVzICIgIikKICAgICAgICAgICAgICBw
YWNrYWdlLXJlYWQtZnJvbS1zdHJpbmcKICAgICAgICAgICAgICBwYWNrYWdlLS1wcmVwYXJlLWRl
cGVuZGVuY2llcwogICAgICAgICAgICAgIChuY29uYyBkZXBzKQogICAgICAgICAgICAgIChzZXRx
IGRlcHMpKSkpKQogICAgICAoZG9saXN0IChkZXAgZGVwcykKICAgICAgICAoY2wtY2FsbGYgdmVy
c2lvbi10by1saXN0IChjYWRyIGRlcCkpKQogICAgICAoc2V0ZiBtaXNzaW5nIChwYWNrYWdlLXZj
LWluc3RhbGwtZGVwZW5kZW5jaWVzIChkZWxldGUtZHVwcyBkZXBzKSkpCiAgICAgIChzZXRmIG1p
c3NpbmcgKGRlbHEgKGFzc3EgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
bWlzc2luZykpKQoKICAgIChsZXQgKChkZWZhdWx0LWRpcmVjdG9yeSAoZmlsZS1uYW1lLWFzLWRp
cmVjdG9yeSBwa2ctZGlyKSkKICAgICAgICAgIChwa2ctZmlsZSAoZXhwYW5kLWZpbGUtbmFtZSAo
cGFja2FnZS0tZGVzY3JpcHRpb24tZmlsZSBwa2ctZGlyKSBwa2ctZGlyKSkKICAgICAgICAgIChw
a2ctc3BlYyAocGFja2FnZS12Yy0tZGVzYy0+c3BlYyBwa2ctZGVzYykpKQogICAgICA7OyBHZW5l
cmF0ZSBhdXRvbG9hZHMKICAgICAgKGxldCogKChuYW1lIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ct
ZGVzYykpCiAgICAgICAgICAgICAoYXV0by1uYW1lIChmb3JtYXQgIiVzLWF1dG9sb2Fkcy5lbCIg
bmFtZSkpCiAgICAgICAgICAgICAobGlzcC1kaXIgKHBsaXN0LWdldCBwa2ctc3BlYyA6bGlzcC1k
aXIpKSkKICAgICAgICAocGFja2FnZS1nZW5lcmF0ZS1hdXRvbG9hZHMKICAgICAgICAgbmFtZSAo
ZmlsZS1uYW1lLWNvbmNhdCBwa2ctZGlyIGxpc3AtZGlyKSkKICAgICAgICAod2hlbiBsaXNwLWRp
cgogICAgICAgICAgKHdyaXRlLXJlZ2lvbgogICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAg
ICAgICAgICAgICAoaW5zZXJ0ICI7OyBBdXRvbG9hZCBpbmRpcmVjdGlvbiBmb3IgcGFja2FnZS12
Y1xuXG4iKQogICAgICAgICAgICAgKHByaW4xIGAobG9hZCAoZXhwYW5kLWZpbGUtbmFtZQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLChmaWxlLW5hbWUtY29uY2F0IGxpc3AtZGlyIGF1dG8t
bmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciAoYW5kIGxvYWQtZmlsZS1uYW1l
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZS1uYW1lLWRpcmVjdG9y
eSBsb2FkLWZpbGUtbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBs
b2FkLXBhdGgpKSkpCiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtYnVmZmVyKSkKICAgICAg
ICAgICAgIChidWZmZXItc3RyaW5nKSkKICAgICAgICAgICBuaWwgKGV4cGFuZC1maWxlLW5hbWUg
YXV0by1uYW1lIHBrZy1kaXIpKSkpCgogICAgICA7OyBHZW5lcmF0ZSBwYWNrYWdlIGZpbGUKICAg
ICAgKHBhY2thZ2UtdmMtLWdlbmVyYXRlLWRlc2NyaXB0aW9uLWZpbGUgcGtnLWRlc2MgcGtnLWZp
bGUpCgogICAgICA7OyBQcm9jZXNzIDptYWtlIGFuZCA6c2hlbGwtY29tbWFuZCBhcmd1bWVudHMg
YmVmb3JlIGJ1aWxkaW5nIGRvY3VtZW50YXRpb24KICAgICAgKHdoZW4gKG9yIChlcSBwYWNrYWdl
LXZjLWFsbG93LXNpZGUtZWZmZWN0cyB0KQogICAgICAgICAgICAgICAgKG1lbXEgKHBhY2thZ2Ut
ZGVzYy1uYW1lIHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS12Yy1hbGxv
dy1zaWRlLWVmZmVjdHMpKQogICAgICAgIChwYWNrYWdlLXZjLS1tYWtlIHBrZy1zcGVjIHBrZy1k
ZXNjKSkKCiAgICAgIDs7IERldGVjdCBhIG1hbnVhbAogICAgICAod2hlbiAoZXhlY3V0YWJsZS1m
aW5kICJpbnN0YWxsLWluZm8iKQogICAgICAgIChkb2xpc3QgKGRvYy1maWxlIChlbnN1cmUtbGlz
dCAocGxpc3QtZ2V0IHBrZy1zcGVjIDpkb2MpKSkKICAgICAgICAgIChwYWNrYWdlLXZjLS1idWls
ZC1kb2N1bWVudGF0aW9uIHBrZy1kZXNjIGRvYy1maWxlKSkpKQoKICAgIDs7IFVwZGF0ZSBwYWNr
YWdlLWFsaXN0LgogICAgKGxldCAoKG5ldy1kZXNjIChwYWNrYWdlLWxvYWQtZGVzY3JpcHRvciBw
a2ctZGlyKSkpCiAgICAgIDs7IEFjdGl2YXRpb24gaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGNvbXBp
bGF0aW9uLCBzbyB0aGF0IGlmIHdlJ3JlCiAgICAgIDs7IHVwZ3JhZGluZyBhbmQgbWFjcm9zIGhh
dmUgY2hhbmdlZCB3ZSBsb2FkIHRoZSBuZXcgZGVmaW5pdGlvbnMKICAgICAgOzsgYmVmb3JlIGNv
bXBpbGluZy4KICAgICAgKHdoZW4gKHBhY2thZ2UtYWN0aXZhdGUtMSBuZXctZGVzYyA6cmVsb2Fk
IDpkZXBzKQogICAgICAgIDs7IEZJWE1FOiBDb21waWxhdGlvbiBzaG91bGQgYmUgZG9uZSBhcyBh
IHNlcGFyYXRlLCBvcHRpb25hbCwgc3RlcC4KICAgICAgICA7OyBFLmcuIGZvciBtdWx0aS1wYWNr
YWdlIGluc3RhbGxzLCB3ZSBzaG91bGQgZmlyc3QgaW5zdGFsbCBhbGwgcGFja2FnZXMKICAgICAg
ICA7OyBhbmQgdGhlbiBjb21waWxlIHRoZW0uCiAgICAgICAgKHBhY2thZ2UtLWNvbXBpbGUgbmV3
LWRlc2MpCiAgICAgICAgKHdoZW4gcGFja2FnZS1uYXRpdmUtY29tcGlsZQogICAgICAgICAgKHBh
Y2thZ2UtLW5hdGl2ZS1jb21waWxlLWFzeW5jIG5ldy1kZXNjKSkKICAgICAgICA7OyBBZnRlciBj
b21waWxhdGlvbiwgbG9hZCBhZ2FpbiBhbnkgZmlsZXMgbG9hZGVkIGJ5CiAgICAgICAgOzsgYGFj
dGl2YXRlLTEnLCBzbyB0aGF0IHdlIHVzZSB0aGUgYnl0ZS1jb21waWxlZCBkZWZpbml0aW9ucy4K
ICAgICAgICAocGFja2FnZS0tcmVsb2FkLXByZXZpb3VzbHktbG9hZGVkIG5ldy1kZXNjKSkpCgog
ICAgOzsgTWFyayBwYWNrYWdlIGFzIHNlbGVjdGVkCiAgICAobGV0ICgobmFtZSAocGFja2FnZS1k
ZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgICAgKHVubGVzcyAobWVtcSBuYW1lIHBhY2thZ2Utc2Vs
ZWN0ZWQtcGFja2FnZXMpCiAgICAgICAgKHBhY2thZ2UtLXNhdmUtc2VsZWN0ZWQtcGFja2FnZXMK
ICAgICAgICAgKGNvbnMgbmFtZSBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkpKQoKICAgIChw
YWNrYWdlLS1xdWlja3N0YXJ0LW1heWJlLXJlZnJlc2gpCgogICAgOzsgQ29uZmlybSB0aGF0IHRo
ZSBpbnN0YWxsYXRpb24gd2FzIHN1Y2Nlc3NmdWwKICAgIChsZXQgKChtYWluLWZpbGUgKHBhY2th
Z2UtdmMtLW1haW4tZmlsZSBwa2ctZGVzYykpKQogICAgICAobWVzc2FnZSAiVkMgcGFja2FnZSBg
JXMnIGluc3RhbGxlZCAoVmVyc2lvbiAlcywgUmV2aXNpb24gJVMpLiVzIgogICAgICAgICAgICAg
ICAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpCiAgICAgICAgICAgICAgIChsbS13aXRoLWZp
bGUgbWFpbi1maWxlCiAgICAgICAgICAgICAgICAgKHBhY2thZ2Utc3RyaXAtcmNzLWlkCiAgICAg
ICAgICAgICAgICAgIChvciAobG0taGVhZGVyICJwYWNrYWdlLXZlcnNpb24iKQogICAgICAgICAg
ICAgICAgICAgICAgKGxtLWhlYWRlciAidmVyc2lvbiIpKSkpCiAgICAgICAgICAgICAgICh2Yy13
b3JraW5nLXJldmlzaW9uIG1haW4tZmlsZSkKICAgICAgICAgICAgICAgKGlmIG1pc3NpbmcKICAg
ICAgICAgICAgICAgICAgICAoZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgICIgRmFpbGVkIHRv
IGluc3RhbGwgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6ICVzIgogICAgICAgICAgICAgICAg
ICAgICAobWFwY29uY2F0CiAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChwKQogICAgICAg
ICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyAoJXMpIiAoY2FyIHApIChjYWRyIHApKSkKICAg
ICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgIiwgIikpCiAgICAgICAgICAgICAgICAgIiIpKSkK
ICAgIHQpKQoKKGRlZnVuIHBhY2thZ2UtdmMtLWd1ZXNzLWJhY2tlbmQgKHVybCkKICAiR3Vlc3Mg
dGhlIFZDIGJhY2tlbmQgZm9yIFVSTC4KVGhpcyBmdW5jdGlvbiB3aWxsIGludGVybmFsbHkgcXVl
cnkgYHBhY2thZ2UtdmMtaGV1cmlzdGljLWFsaXN0JwphbmQgcmV0dXJuIG5pbCBpZiBpdCBjYW5u
b3QgcmVhc29uYWJseSBndWVzcy4iCiAgKGFuZCB1cmwgKGFsaXN0LWdldCB1cmwgcGFja2FnZS12
Yy1oZXVyaXN0aWMtYWxpc3QKICAgICAgICAgICAgICAgICAgICAgIG5pbCBuaWwgIydzdHJpbmct
bWF0Y2gtcCkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gcHJvamVjdC1yZW1lbWJlci1wcm9qZWN0cy11
bmRlciAicHJvamVjdCIgKGRpciAmb3B0aW9uYWwgcmVjdXJzaXZlKSkKCihkZWZ1biBwYWNrYWdl
LXZjLS1jbG9uZSAocGtnLWRlc2MgcGtnLXNwZWMgZGlyIHJldikKICAiQ2xvbmUgdGhlIHBhY2th
Z2UgUEtHLURFU0Mgd2hvc2Ugc3BlYyBpcyBQS0ctU1BFQyBpbnRvIHRoZSBkaXJlY3RvcnkgRElS
LgpSRVYgc3BlY2lmaWVzIGEgc3BlY2lmaWMgcmV2aXNpb24gdG8gY2hlY2tvdXQuICBUaGlzIG92
ZXJyaWRlcyB0aGUgYDpicmFuY2gnCmF0dHJpYnV0ZSBpbiBQS0ctU1BFQy4iCiAgKHBjYXNlLWxl
dCogKChuYW1lIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVzYykpCiAgICAgICAgICAgICAgICgo
bWFwIDp1cmwgOmJyYW5jaCkgcGtnLXNwZWMpKQoKICAgIDs7IENsb25lIHRoZSByZXBvc2l0b3J5
IGludG8gYHJlcG8tZGlyJyBpZiBuZWNlc3NhcnkKICAgICh1bmxlc3MgKGZpbGUtZXhpc3RzLXAg
ZGlyKQogICAgICAobWFrZS1kaXJlY3RvcnkgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZGlyKSB0KQog
ICAgICAobGV0ICgoYmFja2VuZCAob3IgKHBsaXN0LWdldCBwa2ctc3BlYyA6dmMtYmFja2VuZCkK
ICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHVybCkK
ICAgICAgICAgICAgICAgICAgICAgICAgIChwbGlzdC1nZXQgKGFsaXN0LWdldCAocGFja2FnZS1k
ZXNjLWFyY2hpdmUgcGtnLWRlc2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFja2FnZS12Yy0tYXJjaGl2ZS1kYXRhLWFsaXN0CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsIG5pbCAjJ3N0cmluZz0pCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2Yy1iYWNrZW5kKQogICAgICAgICAgICAg
ICAgICAgICAgICAgcGFja2FnZS12Yy1kZWZhdWx0LWJhY2tlbmQpKSkKICAgICAgICAodW5sZXNz
ICh2Yy1jbG9uZSB1cmwgYmFja2VuZCBkaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ig
KGFuZCAobm90IChlcSByZXYgOmxhc3QtcmVsZWFzZSkpIHJldikgYnJhbmNoKSkKICAgICAgICAg
IChlcnJvciAiRmFpbGVkIHRvIGNsb25lICVzIGZyb20gJXMiIG5hbWUgdXJsKSkpKQoKICAgICh3
aGVuIHBhY2thZ2UtdmMtcmVnaXN0ZXItYXMtcHJvamVjdAogICAgICAobGV0ICgoZGVmYXVsdC1k
aXJlY3RvcnkgZGlyKSkKICAgICAgICAocmVxdWlyZSAncHJvamVjdCkKICAgICAgICAocHJvamVj
dC1yZW1lbWJlci1wcm9qZWN0cy11bmRlciBkaXIpKSkKCiAgICA7OyBDaGVjayBvdXQgdGhlIGxh
dGVzdCByZWxlYXNlIGlmIHJlcXVlc3RlZAogICAgKHdoZW4gKGVxIHJldiA6bGFzdC1yZWxlYXNl
KQogICAgICAoaWYtbGV0ICgocmVsZWFzZS1yZXYgKHBhY2thZ2UtdmMtLXJlbGVhc2UtcmV2IHBr
Zy1kZXNjKSkpCiAgICAgICAgICAodmMtcmV0cmlldmUtdGFnIGRpciByZWxlYXNlLXJldikKICAg
ICAgICAobWVzc2FnZSAiTm8gcmVsZWFzZSByZXZpc2lvbiB3YXMgZm91bmQsIGNvbnRpbnVpbmcu
Li4iKSkpKSkKCihkZWZ2YXIgcGFja2FnZS12Yy1ub24tY29kZS1maWxlLW5hbWVzCiAgJygiLmRp
ci1sb2NhbHMuZWwiICIuZGlyLWxvY2Fscy0yLmVsIikKICAiTGlzdCBvZiBmaWxlIG5hbWVzIHRo
YXQgZG8gbm90IGNvbnRhaW4gRW1hY3MgTGlzcCBjb2RlLgpUaGlzIGxpc3QgaXMgdXNlZCBieSBg
cGFja2FnZS12Yy0tdW5wYWNrJyB0byBiZXR0ZXIgY2hlY2sgaWYgdGhlCnVzZXIgaXMgZmV0Y2hp
bmcgY29kZSBmcm9tIGEgcmVwb3NpdG9yeSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55CkVtYWNz
IExpc3AgZmlsZXMuIikKCihkZWZ1biBwYWNrYWdlLXZjLS11bnBhY2sgKHBrZy1kZXNjIHBrZy1z
cGVjICZvcHRpb25hbCByZXYpCiAgIkluc3RhbGwgdGhlIHBhY2thZ2UgZGVzY3JpYmVkIGJ5IFBL
Ry1ERVNDLgpQS0ctU1BFQyBpcyBhIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbiwgYSBwcm9wZXJ0eSBs
aXN0IGRlc2NyaWJpbmcKaG93IHRvIGZldGNoIGFuZCBidWlsZCB0aGUgcGFja2FnZS4gIFNlZSBg
cGFja2FnZS12Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cycKZm9yIGRldGFpbHMuICBUaGUgb3B0aW9u
YWwgYXJndW1lbnQgUkVWIHNwZWNpZmllcyBhIHNwZWNpZmljIHJldmlzaW9uIHRvCmNoZWNrb3V0
LiAgVGhpcyBvdmVycmlkZXMgdGhlIGA6YnJhbmNoJyBhdHRyaWJ1dGUgaW4gUEtHLVNQRUMuIgog
ICh1bmxlc3MgKGVxIChwYWNrYWdlLWRlc2Mta2luZCBwa2ctZGVzYykgJ3ZjKQogICAgKGxldCAo
KGNvcHkgKGNvcHktcGFja2FnZS1kZXNjIHBrZy1kZXNjKSkpCiAgICAgIChzZXRmIChwYWNrYWdl
LWRlc2Mta2luZCBjb3B5KSAndmMKICAgICAgICAgICAgcGtnLWRlc2MgY29weSkpKQogIChwY2Fz
ZS1sZXQqICgoKG1hcCA6bGlzcC1kaXIpIHBrZy1zcGVjKQogICAgICAgICAgICAgICAobmFtZSAo
cGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAgICAgICAoZGlybmFtZSAocGFj
a2FnZS1kZXNjLWZ1bGwtbmFtZSBwa2ctZGVzYykpCiAgICAgICAgICAgICAgIChwa2ctZGlyIChm
aWxlLW5hbWUtYXMtZGlyZWN0b3J5IChleHBhbmQtZmlsZS1uYW1lIGRpcm5hbWUgcGFja2FnZS11
c2VyLWRpcikpKSkKICAgICh3aGVuIChzdHJpbmctZW1wdHktcCBuYW1lKQogICAgICAodXNlci1l
cnJvciAiRW1wdHkgcGFja2FnZSBuYW1lIikpCiAgICAoc2V0ZiAocGFja2FnZS1kZXNjLWRpciBw
a2ctZGVzYykgcGtnLWRpcikKICAgICh3aGVuIChmaWxlLWV4aXN0cy1wIHBrZy1kaXIpCiAgICAg
IChpZiAoeWVzLW9yLW5vLXAgKGZvcm1hdCAiT3ZlcndyaXRlIHByZXZpb3VzIGNoZWNrb3V0IGZv
ciBwYWNrYWdlIGAlcyc/IiBuYW1lKSkKICAgICAgICAgIChwYWNrYWdlLS1kZWxldGUtZGlyZWN0
b3J5IHBrZy1kaXIpCiAgICAgICAgKGVycm9yICJUaGVyZSBhbHJlYWR5IGV4aXN0cyBhIGNoZWNr
b3V0IGZvciAlcyIgbmFtZSkpKQogICAgKHBhY2thZ2UtdmMtLWNsb25lIHBrZy1kZXNjIHBrZy1z
cGVjIHBrZy1kaXIgcmV2KQogICAgKHdoZW4gKGRpcmVjdG9yeS1lbXB0eS1wIHBrZy1kaXIpCiAg
ICAgIChkZWxldGUtZGlyZWN0b3J5IHBrZy1kaXIpCiAgICAgIChlcnJvciAiRW1wdHkgY2hlY2tv
dXQgZm9yICVzIiBuYW1lKSkKICAgICh1bmxlc3MgKHNlcS1yZW1vdmUKICAgICAgICAgICAgIChs
YW1iZGEgKGZpbGUpCiAgICAgICAgICAgICAgIChtZW1iZXIgKGZpbGUtbmFtZS1ub25kaXJlY3Rv
cnkgZmlsZSkgcGFja2FnZS12Yy1ub24tY29kZS1maWxlLW5hbWVzKSkKICAgICAgICAgICAgIChk
aXJlY3RvcnktZmlsZXMtcmVjdXJzaXZlbHkgcGtnLWRpciAiXFwuZWxcXCciIG5pbCkpCiAgICAg
ICh3aGVuICh5ZXMtb3Itbm8tcCAoZm9ybWF0ICJObyBFbWFjcyBMaXNwIGZpbGVzIGZvdW5kIHdo
ZW4gZmV0Y2hpbmcgXCIlc1wiLCBcCmFib3J0IGluc3RhbGxhdGlvbj8iIG5hbWUpKQogICAgICAg
IChkZWxldGUtZGlyZWN0b3J5IHBrZy1kaXIgdCkKICAgICAgICAodXNlci1lcnJvciAiSW5zdGFs
bGF0aW9uIGFib3J0ZWQiKSkpCgogICAgOzsgV2hlbiBub3RoaW5nIGlzIHNwZWNpZmllZCBhYm91
dCBhIGBsaXNwLWRpcicsIHRoZW4gc2hvdWxkCiAgICA7OyBoZXVyaXN0aWNhbGx5IGNoZWNrIGlm
IHRoZXJlIGlzIGEgc3ViLWRpcmVjdG9yeSB3aXRoIGxpc3AKICAgIDs7IGZpbGVzLiAgVGhlc2Ug
YXJlIGNvbnZlbnRpb25hbGx5IGp1c3QgY2FsbGVkICJsaXNwIiBvciAic3JjIi4KICAgIDs7IElm
IHRoaXMgZGlyZWN0b3J5IGV4aXN0cyBhbmQgY29udGFpbnMgbm9uLXplcm8gbnVtYmVyIG9mIGxp
c3AKICAgIDs7IGZpbGVzLCB3ZSB3aWxsIHVzZSB0aGF0IGluc3RlYWQgb2YgYHBrZy1kaXInLgog
ICAgKGNhdGNoICdkb25lCiAgICAgIChkb2xpc3QgKG5hbWUgJygibGlzcCIgInNyYyIpKQogICAg
ICAgICh3aGVuLWxldCogKCgobnVsbCBsaXNwLWRpcikpCiAgICAgICAgICAgICAgICAgICAgKGRp
ciAoZXhwYW5kLWZpbGUtbmFtZSBuYW1lIHBrZy1kaXIpKQogICAgICAgICAgICAgICAgICAgICgo
ZmlsZS1kaXJlY3RvcnktcCBkaXIpKQogICAgICAgICAgICAgICAgICAgICgoZGlyZWN0b3J5LWZp
bGVzIGRpciBuaWwgIlxcYFteLl0uK1xcLmVsXFwnIiB0IDEpKSkKICAgICAgICAgIDs7IFdlIHdv
bid0IHVzZSBgZGlyJywgc2luY2UgZGlyIGlzIGFuIGFic29sdXRlIHBhdGggYW5kIHdlCiAgICAg
ICAgICA7OyBkb24ndCB3YW50IGBsaXNwLWRpcicgdG8gZGVwZW5kIG9uIHRoZSBjdXJyZW50IGxv
Y2F0aW9uIG9mCiAgICAgICAgICA7OyB0aGUgcGFja2FnZSBpbnN0YWxsYXRpb24sIGllLiB0byBi
cmVhayBpZiBtb3ZlZCBhcm91bmQgdGhlCiAgICAgICAgICA7OyBmaWxlIHN5c3RlbSBvciBiZXR3
ZWVuIGluc3RhbGxhdGlvbnMuCiAgICAgICAgICAodGhyb3cgJ2RvbmUgKHNldHEgbGlzcC1kaXIg
bmFtZSkpKSkpCgogICAgOzsgRW5zdXJlIHdlIGhhdmUgYSBjb3B5IG9mIHRoZSBwYWNrYWdlIHNw
ZWNpZmljYXRpb24KICAgICh1bmxlc3MgKHNlcS1zb21lIChsYW1iZGEgKGFsaXN0KSAoZXF1YWwg
KGFsaXN0LWdldCBuYW1lIChjZHIgYWxpc3QpKSBwa2ctc3BlYykpCiAgICAgICAgICAgICAgICAg
ICAgICBwYWNrYWdlLXZjLS1hcmNoaXZlLXNwZWMtYWxpc3RzKQogICAgICAoY3VzdG9taXplLXNh
dmUtdmFyaWFibGUKICAgICAgICdwYWNrYWdlLXZjLXNlbGVjdGVkLXBhY2thZ2VzCiAgICAgICAo
Y29ucyAoY29ucyBuYW1lIHBrZy1zcGVjKQogICAgICAgICAgICAgKHNlcS1yZW1vdmUgKGxhbWJk
YSAoc3BlYykgKHN0cmluZz0gbmFtZSAoY2FyIHNwZWMpKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgIHBhY2thZ2UtdmMtc2VsZWN0ZWQtcGFja2FnZXMpKSkpCgogICAgKHBhY2thZ2UtdmMtLXVu
cGFjay0xIHBrZy1kZXNjIHBrZy1kaXIpKSkKCihkZWZ1biBwYWNrYWdlLXZjLS1yZWFkLXBhY2th
Z2UtbmFtZSAocHJvbXB0ICZvcHRpb25hbCBhbGxvdy11cmwgaW5zdGFsbGVkKQogICJRdWVyeSB0
aGUgdXNlciBmb3IgYSBWQyBwYWNrYWdlIGFuZCByZXR1cm4gYSBuYW1lIHdpdGggUFJPTVBULgpJ
ZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgQUxMT1ctVVJMIGlzIG5vbi1uaWwsIHRoZSB1c2VyIGlz
IGFsc28KYWxsb3dlZCB0byBzcGVjaWZ5IGEgbm9uLXBhY2thZ2UgbmFtZS4gIElmIHRoZSBvcHRp
b25hbCBhcmd1bWVudApJTlNUQUxMRUQgaXMgbm9uLW5pbCwgdGhlIHNlbGVjdGlvbiB3aWxsIGJl
IGZpbHRlcmVkIGRvd24gdG8KVkMgcGFja2FnZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBpbnN0
YWxsZWQuIgogIChwYWNrYWdlLXZjLS1hcmNoaXZlcy1pbml0aWFsaXplKQogIChjb21wbGV0aW5n
LXJlYWQgcHJvbXB0IChpZiBpbnN0YWxsZWQgcGFja2FnZS1hbGlzdCBwYWNrYWdlLWFyY2hpdmUt
Y29udGVudHMpCiAgICAgICAgICAgICAgICAgICAoaWYgaW5zdGFsbGVkCiAgICAgICAgICAgICAg
ICAgICAgICAgKGxhbWJkYSAocGtnKSAocGFja2FnZS12Yy1wIChjYWRyIHBrZykpKQogICAgICAg
ICAgICAgICAgICAgICAobGFtYmRhIChwa2cpCiAgICAgICAgICAgICAgICAgICAgICAgKG9yIChw
YWNrYWdlLXZjLS1kZXNjLT5zcGVjIChjYWRyIHBrZykpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDs7IElmIHdlIGhhdmUgbm8gZXhwbGljaXQgVkMgZGF0YSwgd2UgY2FuIHRyeSBhIGtpbmQg
b2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgaGV1cmlzdGljIGFuZCB1c2UgdGhlIFVS
TCBoZWFkZXIsIHRoYXQgbWlnaHQgYWxyZWFkeSBiZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICA7OyBwb2ludGluZyB0b3dhcmRzIGEgcmVwb3NpdG9yeSwgYW5kIHVzZSB0aGF0IGFzIGEgYmFj
a3VwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQtbGV0KiAoKGV4dHJhcyAocGFja2Fn
ZS1kZXNjLWV4dHJhcyAoY2FkciBwa2cpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodXJsIChhbGlzdC1nZXQgOnVybCBleHRyYXMpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICgocGFja2FnZS12Yy0tZ3Vlc3MtYmFja2VuZCB1cmwpKSkpKSkp
CiAgICAgICAgICAgICAgICAgICAobm90IGFsbG93LXVybCkpKQoKKGRlZnVuIHBhY2thZ2UtdmMt
LXJlYWQtcGFja2FnZS1kZXNjIChwcm9tcHQgJm9wdGlvbmFsIGluc3RhbGxlZCkKICAiUXVlcnkg
dGhlIHVzZXIgZm9yIGEgVkMgcGFja2FnZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRpb24gd2l0aCBQ
Uk9NUFQuCklmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBJTlNUQUxMRUQgaXMgbm9uLW5pbCwgdGhl
IHNlbGVjdGlvbiB3aWxsCmJlIGZpbHRlcmVkIGRvd24gdG8gVkMgcGFja2FnZXMgdGhhdCBoYXZl
IGFscmVhZHkgYmVlbgppbnN0YWxsZWQsIGFuZCB0aGUgcGFja2FnZSBkZXNjcmlwdGlvbiB3aWxs
IGJlIHRoYXQgb2YgYW4KaW5zdGFsbGVkIHBhY2thZ2UuIgogIChjYWRyIChhc3NvYyAocGFja2Fn
ZS12Yy0tcmVhZC1wYWNrYWdlLW5hbWUgcHJvbXB0IG5pbCBpbnN0YWxsZWQpCiAgICAgICAgICAg
ICAgIChpZiBpbnN0YWxsZWQgcGFja2FnZS1hbGlzdCBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMp
CiAgICAgICAgICAgICAgICMnc3RyaW5nPSkpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2th
Z2UtdmMtdXBncmFkZS1hbGwgKCkKICAiQXR0ZW1wdCB0byB1cGdyYWRlIGFsbCBpbnN0YWxsZWQg
VkMgcGFja2FnZXMuIgogIChpbnRlcmFjdGl2ZSkKICAoZG9saXN0IChwYWNrYWdlIHBhY2thZ2Ut
YWxpc3QpCiAgICAoZG9saXN0IChwa2ctZGVzYyAoY2RyIHBhY2thZ2UpKQogICAgICAod2hlbiAo
cGFja2FnZS12Yy1wIHBrZy1kZXNjKQogICAgICAgIChwYWNrYWdlLXZjLXVwZ3JhZGUgcGtnLWRl
c2MpKSkpCiAgKG1lc3NhZ2UgIkRvbmUgdXBncmFkaW5nIHBhY2thZ2VzLiIpKQoKOzs7IyMjYXV0
b2xvYWQKKGRlZnVuIHBhY2thZ2UtdmMtdXBncmFkZSAocGtnLWRlc2MpCiAgIkF0dGVtcHQgdG8g
dXBncmFkZSB0aGUgcGFja2FnZSBQS0ctREVTQy4iCiAgKGludGVyYWN0aXZlIChsaXN0IChwYWNr
YWdlLXZjLS1yZWFkLXBhY2thZ2UtZGVzYyAiVXBncmFkZSBWQyBwYWNrYWdlOiAiIHQpKSkKICA7
OyBIQUNLOiBUbyBydW4gYHBhY2thZ2UtdmMtLXVucGFjay0xJyBhZnRlciBjaGVja2luZyBvdXQg
dGhlIG5ldwogIDs7IHJldmlzaW9uLCB3ZSBpbnNlcnQgYSBob29rIGludG8gYHZjLXBvc3QtY29t
bWFuZC1mdW5jdGlvbnMnLCBhbmQKICA7OyByZW1vdmUgaXQgcmlnaHQgYWZ0ZXIgaXQgcmFuLiAg
VG8gYXZvaWQgcnVubmluZyB0aGUgaG9vayBtdWx0aXBsZQogIDs7IHRpbWVzIG9yIGV2ZW4gZm9y
IHRoZSB3cm9uZyByZXBvc2l0b3J5IChhcyBgdmMtcHVsbCcgaXMgb2Z0ZW4KICA7OyBhc3luY2hy
b25vdXMpLCB3ZSBleHRyYWN0IHRoZSByZWxldmFudCBhcmd1bWVudHMgdXNpbmcgYSBwc2V1ZG8K
ICA7OyBmaWx0ZXIgZm9yIGB2Yy1maWx0ZXItY29tbWFuZC1mdW5jdGlvbicsIGV4ZWN1dGVkIG9u
bHkgZm9yIHRoZQogIDs7IHNpZGUgZWZmZWN0LCBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgbGV4aWNh
bCBzY29wZS4gIFdoZW4gdGhlIGhvb2sKICA7OyBpcyBydW4sIHdlIGNoZWNrIGlmIHRoZSBhcmd1
bWVudHMgYXJlIHRoZSBzYW1lIChgZXEnKSBhcyB0aGUgb25lcwogIDs7IHByZXZpb3VzbHkgZXh0
cmFjdGVkLCBhbmQgb25seSBpbiB0aGF0IGNhc2Ugd2lsbCBiZSBjYWxsCiAgOzsgYHBhY2thZ2Ut
dmMtLXVucGFjay0xJy4gIFVnaC4uLgogIDs7CiAgOzsgSWYgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5
IHRvIGRvIHRoaXMsIGl0IHNob3VsZCBiZSBkb25lLgogIChjbC1hc3NlcnQgKHBhY2thZ2UtdmMt
cCBwa2ctZGVzYykpCiAgKGxldHJlYyAoKHBrZy1kaXIgKHBhY2thZ2UtZGVzYy1kaXIgcGtnLWRl
c2MpKQogICAgICAgICAgICh2Yy1mbGFncykKICAgICAgICAgICAodmMtZmlsdGVyLWNvbW1hbmQt
ZnVuY3Rpb24KICAgICAgICAgICAgKGxhbWJkYSAoY29tbWFuZCBmaWxlLW9yLWxpc3QgZmxhZ3Mp
CiAgICAgICAgICAgICAgKHNldHEgdmMtZmxhZ3MgZmxhZ3MpCiAgICAgICAgICAgICAgKGxpc3Qg
Y29tbWFuZCBmaWxlLW9yLWxpc3QgZmxhZ3MpKSkKICAgICAgICAgICAocG9zdC11cGdyYWRlCiAg
ICAgICAgICAgIChsYW1iZGEgKF9jb21tYW5kIF9maWxlLW9yLWxpc3QgZmxhZ3MpCiAgICAgICAg
ICAgICAgKHdoZW4gKGFuZCAoZmlsZS1lcXVhbC1wIHBrZy1kaXIgZGVmYXVsdC1kaXJlY3Rvcnkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAoZXEgZmxhZ3MgdmMtZmxhZ3MpKQogICAgICAgICAg
ICAgICAgKHVud2luZC1wcm90ZWN0CiAgICAgICAgICAgICAgICAgICAgKHdpdGgtZGVtb3RlZC1l
cnJvcnMgIkZhaWxlZCB0byBhY3RpdmF0ZTogJVMiCiAgICAgICAgICAgICAgICAgICAgICAocGFj
a2FnZS12Yy0tdW5wYWNrLTEgcGtnLWRlc2MgcGtnLWRpcikpCiAgICAgICAgICAgICAgICAgIChy
ZW1vdmUtaG9vayAndmMtcG9zdC1jb21tYW5kLWZ1bmN0aW9ucyBwb3N0LXVwZ3JhZGUpKSkpKSkK
ICAgIChhZGQtaG9vayAndmMtcG9zdC1jb21tYW5kLWZ1bmN0aW9ucyBwb3N0LXVwZ3JhZGUpCiAg
ICAod2l0aC1kZW1vdGVkLWVycm9ycyAiRmFpbGVkIHRvIGZldGNoOiAlUyIKICAgICAgKGxldCAo
KGRlZmF1bHQtZGlyZWN0b3J5IHBrZy1kaXIpKQogICAgICAgICh2Yy1wdWxsKSkpKSkKCihkZWZ1
biBwYWNrYWdlLXZjLS1hcmNoaXZlcy1pbml0aWFsaXplICgpCiAgIkluaXRpYWxpemUgcGFja2Fn
ZS5lbCBhbmQgZmV0Y2ggcGFja2FnZSBzcGVjaWZpY2F0aW9ucy4iCiAgKHBhY2thZ2UtLWFyY2hp
dmVzLWluaXRpYWxpemUpCiAgKHVubGVzcyBwYWNrYWdlLXZjLS1hcmNoaXZlLWRhdGEtYWxpc3QK
ICAgIChwYWNrYWdlLXZjLS1kb3dubG9hZC1hbmQtcmVhZC1hcmNoaXZlcykpKQoKKGRlZnVuIHBh
Y2thZ2UtdmMtLXJlbGVhc2UtcmV2IChwa2ctZGVzYykKICAiUmV0dXJuIHRoZSBsYXRlc3QgcmV2
aXNpb24gdGhhdCBidW1wcyB0aGUgXCJWZXJzaW9uXCIgdGFnIGZvciBQS0ctREVTQy4KSWYgbm8g
c3VjaCByZXZpc2lvbiBjYW4gYmUgZm91bmQsIHJldHVybiBuaWwuIgogICh3aXRoLWN1cnJlbnQt
YnVmZmVyIChmaW5kLWZpbGUtbm9zZWxlY3QgKHBhY2thZ2UtdmMtLW1haW4tZmlsZSBwa2ctZGVz
YykpCiAgICAodmMtYnVmZmVyLXN5bmMpCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKGdvdG8t
Y2hhciAocG9pbnQtbWluKSkKICAgICAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggdCkpCiAgICAg
ICAgKHdoZW4gKGNvbmQKICAgICAgICAgICAgICAgKChyZS1zZWFyY2gtZm9yd2FyZAogICAgICAg
ICAgICAgICAgIChjb25jYXQgKGxtLWdldC1oZWFkZXItcmUgInBhY2thZ2UtdmVyc2lvbiIpICIu
KiQiKQogICAgICAgICAgICAgICAgIChsbS1jb2RlLXN0YXJ0KSB0KSkKICAgICAgICAgICAgICAg
KChyZS1zZWFyY2gtZm9yd2FyZAogICAgICAgICAgICAgICAgIChjb25jYXQgKGxtLWdldC1oZWFk
ZXItcmUgInZlcnNpb24iKSAiLiokIikKICAgICAgICAgICAgICAgICAobG0tY29kZS1zdGFydCkg
dCkpKQogICAgICAgICAgKGlnbm9yZS1lcnJvciB2Yy1ub3Qtc3VwcG9ydGVkCiAgICAgICAgICAg
ICh2Yy1jYWxsLWJhY2tlbmQgKHZjLWJhY2tlbmQgKGJ1ZmZlci1maWxlLW5hbWUpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICdsYXN0LWNoYW5nZQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChidWZmZXItZmlsZS1uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChs
aW5lLW51bWJlci1hdC1wb3MgbmlsIHQpKSkpKSkpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBh
Y2thZ2UtdmMtaW5zdGFsbCAocGFja2FnZSAmb3B0aW9uYWwgcmV2IGJhY2tlbmQgbmFtZSkKICAi
RmV0Y2ggYSBQQUNLQUdFIGFuZCBzZXQgaXQgdXAgZm9yIHVzaW5nIHdpdGggRW1hY3MuCgpJZiBQ
QUNLQUdFIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gVVJMLCBkb3dubG9hZCB0aGUgcGFja2Fn
ZQpmcm9tIHRoZSByZXBvc2l0b3J5IGF0IHRoYXQgVVJMOyB0aGUgZnVuY3Rpb24gd2lsbCB0cnkg
dG8gZ3Vlc3MKdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgZnJvbSB0aGUgVVJMLiAgVGhpcyBjYW4g
YmUgb3ZlcnJpZGRlbiBieQpwYXNzaW5nIHRoZSBvcHRpb25hbCBhcmd1bWVudCBOQU1FLiAgSWYg
UEFDS0FHRSBpcyBhIGNvbnMtY2VsbCwKaXQgc2hvdWxkIGhhdmUgdGhlIGZvcm0gKE5BTUUgLiBT
UEVDKSwgd2hlcmUgTkFNRSBpcyBhIHN5bWJvbAppbmRpY2F0aW5nIHRoZSBwYWNrYWdlIG5hbWUg
YW5kIFNQRUMgaXMgYSBwbGlzdCBhcyBkZXNjcmliZWQgaW4KYHBhY2thZ2UtdmMtc2VsZWN0ZWQt
cGFja2FnZXMnLiAgT3RoZXJ3aXNlIFBBQ0tBR0Ugc2hvdWxkIGJlIGEKc3ltYm9sIHdob3NlIG5h
bWUgaXMgdGhlIHBhY2thZ2UgbmFtZSwgYW5kIHRoZSBVUkwgZm9yIHRoZQpwYWNrYWdlIHdpbGwg
YmUgdGFrZW4gZnJvbSB0aGUgcGFja2FnZSdzIG1ldGFkYXRhLgoKQnkgZGVmYXVsdCwgdGhpcyBm
dW5jdGlvbiBpbnN0YWxscyB0aGUgbGFzdCByZXZpc2lvbiBvZiB0aGUKcGFja2FnZSBhdmFpbGFi
bGUgZnJvbSBpdHMgcmVwb3NpdG9yeS4gIElmIFJFViBpcyBhIHN0cmluZywgaXQKZGVzY3JpYmVz
IHRoZSByZXZpc2lvbiB0byBpbnN0YWxsLCBhcyBpbnRlcnByZXRlZCBieSB0aGUgVkMKYmFja2Vu
ZC4gIFRoZSBzcGVjaWFsIHZhbHVlIGA6bGFzdC1yZWxlYXNlJyAoaW50ZXJhY3RpdmVseSwgdGhl
CnByZWZpeCBhcmd1bWVudCksIHdpbGwgdXNlIHRoZSBjb21taXQgb2YgdGhlIGxhdGVzdCByZWxl
YXNlLCBpZgppdCBleGlzdHMuICBUaGUgbGFzdCByZWxlYXNlIGlzIHRoZSBsYXRlc3QgcmV2aXNp
b24gd2hpY2ggY2hhbmdlZAp0aGUgXCJWZXJzaW9uOlwiIGhlYWRlciBvZiB0aGUgcGFja2FnZSdz
IG1haW4gTGlzcCBmaWxlLgoKT3B0aW9uYWwgYXJndW1lbnQgQkFDS0VORCBzcGVjaWZpZXMgdGhl
IFZDIGJhY2tlbmQgdG8gdXNlIGZvciBjbG9uaW5nCnRoZSBwYWNrYWdlJ3MgcmVwb3NpdG9yeTsg
dGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIE5BTUUtT1ItVVJMIGlzIGEgVVJMLAphIHN0cmluZy4g
IElmIEJBQ0tFTkQgaXMgb21pdHRlZCBvciBuaWwsIHRoZSBmdW5jdGlvbgp1c2VzIGBwYWNrYWdl
LXZjLWhldXJpc3RpYy1hbGlzdCcgdG8gZ3Vlc3MgdGhlIGJhY2tlbmQuCk5vdGUgdGhhdCBieSBk
ZWZhdWx0LCBhIFZDIHBhY2thZ2Ugd2lsbCBiZSBwcmlvcml0aXplZCBvdmVyIGEKcmVndWxhciBw
YWNrYWdlLCBidXQgaXQgd2lsbCBub3QgcmVtb3ZlIGEgVkMgcGFja2FnZS4KClwoZm4gUEFDS0FH
RSAmb3B0aW9uYWwgUkVWIEJBQ0tFTkQpIgogIChpbnRlcmFjdGl2ZQogICAocHJvZ24KICAgICA7
OyBJbml0aWFsaXplIHRoZSBwYWNrYWdlIHN5c3RlbSB0byBnZXQgdGhlIGxpc3Qgb2YgcGFja2Fn
ZQogICAgIDs7IHN5bWJvbHMgZm9yIGNvbXBsZXRpb24uCiAgICAgKHBhY2thZ2UtdmMtLWFyY2hp
dmVzLWluaXRpYWxpemUpCiAgICAgKGxldCogKChuYW1lLW9yLXVybCAocGFja2FnZS12Yy0tcmVh
ZC1wYWNrYWdlLW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAiRmV0Y2ggYW5kIGluc3Rh
bGwgcGFja2FnZTogIiB0KSkKICAgICAgICAgICAgKG5hbWUgKGZpbGUtbmFtZS1iYXNlIChkaXJl
Y3RvcnktZmlsZS1uYW1lIG5hbWUtb3ItdXJsKSkpKQogICAgICAgKHdoZW4gKHN0cmluZy1lbXB0
eS1wIG5hbWUpCiAgICAgICAgICh1c2VyLWVycm9yICJFbXB0eSBwYWNrYWdlIG5hbWUiKSkKICAg
ICAgIChsaXN0IG5hbWUtb3ItdXJsCiAgICAgICAgICAgICAoYW5kIGN1cnJlbnQtcHJlZml4LWFy
ZyA6bGFzdC1yZWxlYXNlKQogICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAoaW50ZXJuIChz
dHJpbmctcmVtb3ZlLXByZWZpeCAiZW1hY3MtIiBuYW1lKSkpKSkpCiAgKHBhY2thZ2UtdmMtLWFy
Y2hpdmVzLWluaXRpYWxpemUpCiAgKGNvbmQKICAgKChudWxsIHBhY2thZ2UpCiAgICAoc2lnbmFs
ICd3cm9uZy10eXBlLWFyZ3VtZW50IG5pbCkpCiAgICgoY29uc3AgcGFja2FnZSkKICAgIChwYWNr
YWdlLXZjLS11bnBhY2sKICAgICAocGFja2FnZS1kZXNjLWNyZWF0ZSA6bmFtZSAoY2FyIHBhY2th
Z2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgOmtpbmQgJ3ZjKQogICAgIChjZHIgcGFja2Fn
ZSkKICAgICByZXYpKQogICAoKGFuZC1sZXQqICgoKHN0cmluZ3AgcGFja2FnZSkpCiAgICAgICAg
ICAgICAgIChiYWNrZW5kIChvciBiYWNrZW5kIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHBh
Y2thZ2UpKSkpCiAgICAgIChwYWNrYWdlLXZjLS11bnBhY2sKICAgICAgIChwYWNrYWdlLWRlc2Mt
Y3JlYXRlCiAgICAgICAgOm5hbWUgKG9yIG5hbWUgKGludGVybiAoZmlsZS1uYW1lLWJhc2UgcGFj
a2FnZSkpKQogICAgICAgIDpraW5kICd2YykKICAgICAgIChsaXN0IDp2Yy1iYWNrZW5kIGJhY2tl
bmQgOnVybCBwYWNrYWdlKQogICAgICAgcmV2KSkpCiAgICgoYW5kLWxldCogKChkZXNjIChhc3Nv
YyBwYWNrYWdlIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cyAjJ3N0cmluZz0pKSkKICAgICAgKHBh
Y2thZ2UtdmMtLXVucGFjawogICAgICAgKGNhZHIgZGVzYykKICAgICAgIChvciAocGFja2FnZS12
Yy0tZGVzYy0+c3BlYyAoY2FkciBkZXNjKSkKICAgICAgICAgICAoYW5kLWxldCogKChleHRyYXMg
KHBhY2thZ2UtZGVzYy1leHRyYXMgKGNhZHIgZGVzYykpKQogICAgICAgICAgICAgICAgICAgICAg
KHVybCAoYWxpc3QtZ2V0IDp1cmwgZXh0cmFzKSkKICAgICAgICAgICAgICAgICAgICAgIChiYWNr
ZW5kIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHVybCkpKQogICAgICAgICAgICAgKGxpc3Qg
OnZjLWJhY2tlbmQgYmFja2VuZCA6dXJsIHVybCkpCiAgICAgICAgICAgKHVzZXItZXJyb3IgIlBh
Y2thZ2UgYCVzJyBoYXMgbm8gVkMgZGF0YSIgcGFja2FnZSkpCiAgICAgICByZXYpKSkKICAgKCh1
c2VyLWVycm9yICJVbmtub3duIHBhY2thZ2UgdG8gZmV0Y2g6ICVzIiBwYWNrYWdlKSkpKQoKOzs7
IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtdmMtY2hlY2tvdXQgKHBrZy1kZXNjIGRpcmVjdG9y
eSAmb3B0aW9uYWwgcmV2KQogICJDbG9uZSB0aGUgc291cmNlcyBmb3IgUEtHLURFU0MgaW50byBE
SVJFQ1RPUlkgYW5kIHZpc2l0IHRoYXQgZGlyZWN0b3J5LgpVbmxpa2UgYHBhY2thZ2UtdmMtaW5z
dGFsbCcsIHRoaXMgZG9lcyBub3QgeWV0IHNldCB1cCB0aGUgcGFja2FnZQpmb3IgdXNlIHdpdGgg
RW1hY3M7IHVzZSBgcGFja2FnZS12Yy1pbnN0YWxsLWZyb20tY2hlY2tvdXQnIGZvcgpzZXR0aW5n
IHRoZSBwYWNrYWdlIHVwIGFmdGVyIHRoaXMgZnVuY3Rpb24gZmluaXNoZXMuICBPcHRpb25hbAph
cmd1bWVudCBSRVYgbWVhbnMgdG8gY2xvbmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBwYWNr
YWdlOyBpdApkZWZhdWx0cyB0byB0aGUgbGFzdCB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBw
YWNrYWdlJ3MKcmVwb3NpdG9yeS4gIElmIFJFViBoYXMgdGhlIHNwZWNpYWwgdmFsdWUKYDpsYXN0
LXJlbGVhc2UnIChpbnRlcmFjdGl2ZWx5LCB0aGUgcHJlZml4IGFyZ3VtZW50KSwgdGhhdCBzdGFu
ZHMKZm9yIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuIgogIChpbnRl
cmFjdGl2ZQogICAobGV0KiAoKG5hbWUgKHBhY2thZ2UtdmMtLXJlYWQtcGFja2FnZS1uYW1lICJG
ZXRjaCBwYWNrYWdlIHNvdXJjZTogIikpKQogICAgIChsaXN0IChjYWRyIChhc3NvYyBuYW1lIHBh
Y2thZ2UtYXJjaGl2ZS1jb250ZW50cyAjJ3N0cmluZz0pKQogICAgICAgICAgIChyZWFkLWZpbGUt
bmFtZSAiQ2xvbmUgaW50byBuZXcgb3IgZW1wdHkgZGlyZWN0b3J5OiAiIG5pbCBuaWwgdCBuaWwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZGlyKSAob3IgKG5vdCAoZmlsZS1l
eGlzdHMtcCBkaXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoZGlyZWN0b3J5LWVtcHR5LXAgZGlyKSkpKQogICAgICAgICAgIChhbmQgY3VycmVudC1wcmVm
aXgtYXJnIDpsYXN0LXJlbGVhc2UpKSkpCiAgKHBhY2thZ2UtdmMtLWFyY2hpdmVzLWluaXRpYWxp
emUpCiAgKGxldCAoKHBrZy1zcGVjIChvciAocGFja2FnZS12Yy0tZGVzYy0+c3BlYyBwa2ctZGVz
YykKICAgICAgICAgICAgICAgICAgICAgIChhbmQtbGV0KiAoKGV4dHJhcyAocGFja2FnZS1kZXNj
LWV4dHJhcyBwa2ctZGVzYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cmwg
KGFsaXN0LWdldCA6dXJsIGV4dHJhcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChiYWNrZW5kIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHVybCkpKQogICAgICAgICAgICAg
ICAgICAgICAgICAobGlzdCA6dmMtYmFja2VuZCBiYWNrZW5kIDp1cmwgdXJsKSkKICAgICAgICAg
ICAgICAgICAgICAgICh1c2VyLWVycm9yICJQYWNrYWdlIGAlcycgaGFzIG5vIFZDIGRhdGEiCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRl
c2MpKSkpKQogICAgKHBhY2thZ2UtdmMtLWNsb25lIHBrZy1kZXNjIHBrZy1zcGVjIGRpcmVjdG9y
eSByZXYpCiAgICAoZmluZC1maWxlIGRpcmVjdG9yeSkpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVu
IHBhY2thZ2UtdmMtaW5zdGFsbC1mcm9tLWNoZWNrb3V0IChkaXIgbmFtZSkKICAiU2V0IHVwIHRo
ZSBwYWNrYWdlIE5BTUUgaW4gRElSIGJ5IGxpbmtpbmcgaXQgaW50byB0aGUgRUxQQSBkaXJlY3Rv
cnkuCkludGVyYWN0aXZlbHksIHByb21wdCB0aGUgdXNlciBmb3IgRElSLCB3aGljaCBzaG91bGQg
YmUgYSBkaXJlY3RvcnkKdW5kZXIgdmVyc2lvbiBjb250cm9sLCB0eXBpY2FsbHkgb25lIGNyZWF0
ZWQgYnkgYHBhY2thZ2UtdmMtY2hlY2tvdXQnLgpJZiBpbnZva2VkIGludGVyYWN0aXZlbHkgd2l0
aCBhIHByZWZpeCBhcmd1bWVudCwgcHJvbXB0IHRoZSB1c2VyCmZvciB0aGUgTkFNRSBvZiB0aGUg
cGFja2FnZSB0byBzZXQgdXAuICBPdGhlcndpc2UgaW5mZXIgdGhlIHBhY2thZ2UKbmFtZSBmcm9t
IHRoZSBiYXNlIG5hbWUgb2YgRElSLiIKICAoaW50ZXJhY3RpdmUgKGxldCAoKGRpciAocmVhZC1k
aXJlY3RvcnktbmFtZSAiRGlyZWN0b3J5OiAiKSkpCiAgICAgICAgICAgICAgICAgKGxpc3QgZGly
CiAgICAgICAgICAgICAgICAgICAgICAgKGlmIGN1cnJlbnQtcHJlZml4LWFyZwogICAgICAgICAg
ICAgICAgICAgICAgICAgICAocmVhZC1zdHJpbmcgIlBhY2thZ2UgbmFtZTogIikKICAgICAgICAg
ICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtYmFzZSAoZGlyZWN0b3J5LWZpbGUtbmFtZSBkaXIp
KSkpKSkKICAodW5sZXNzICh2Yy1yZXNwb25zaWJsZS1iYWNrZW5kIGRpcikKICAgICh1c2VyLWVy
cm9yICJEaXJlY3RvcnkgJVMgaXMgbm90IHVuZGVyIHZlcnNpb24gY29udHJvbCIgZGlyKSkKICAo
cGFja2FnZS12Yy0tYXJjaGl2ZXMtaW5pdGlhbGl6ZSkKICAobGV0KiAoKG5hbWUgKG9yIG5hbWUg
KGZpbGUtbmFtZS1iYXNlIChkaXJlY3RvcnktZmlsZS1uYW1lIGRpcikpKSkKICAgICAgICAgKHBr
Zy1kaXIgKGV4cGFuZC1maWxlLW5hbWUgbmFtZSBwYWNrYWdlLXVzZXItZGlyKSkpCiAgICAod2hl
biAoZmlsZS1leGlzdHMtcCBwa2ctZGlyKQogICAgICAoaWYgKHllcy1vci1uby1wIChmb3JtYXQg
Ik92ZXJ3cml0ZSBwcmV2aW91cyBjaGVja291dCBmb3IgcGFja2FnZSBgJXMnPyIgbmFtZSkpCiAg
ICAgICAgICAocGFja2FnZS0tZGVsZXRlLWRpcmVjdG9yeSBwa2ctZGlyKQogICAgICAgIChlcnJv
ciAiVGhlcmUgYWxyZWFkeSBleGlzdHMgYSBjaGVja291dCBmb3IgJXMiIG5hbWUpKSkKICAgICht
YWtlLXN5bWJvbGljLWxpbmsgKGV4cGFuZC1maWxlLW5hbWUgZGlyKSBwa2ctZGlyKQogICAgKHBh
Y2thZ2UtdmMtLXVucGFjay0xCiAgICAgKHBhY2thZ2UtZGVzYy1jcmVhdGUKICAgICAgOm5hbWUg
KGludGVybiBuYW1lKQogICAgICA6ZGlyIHBrZy1kaXIKICAgICAgOmtpbmQgJ3ZjKQogICAgIChm
aWxlLW5hbWUtYXMtZGlyZWN0b3J5IHBrZy1kaXIpKSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4g
cGFja2FnZS12Yy1yZWJ1aWxkIChwa2ctZGVzYykKICAiUmVidWlsZCB0aGUgaW5zdGFsbGF0aW9u
IGZvciBwYWNrYWdlIGdpdmVuIGJ5IFBLRy1ERVNDLgpSZWJ1aWxkaW5nIGFuIGluc3RhbGxhdGlv
biBtZWFucyBzY3JhcGluZyBmb3IgbmV3IGF1dG9sb2FkCmNvb2tpZXMsIHJlLWNvbXBpbGluZyBF
bWFjcyBMaXNwIGZpbGVzLCBidWlsZGluZyBhbmQgaW5zdGFsbGluZwphbnkgZG9jdW1lbnRhdGlv
biwgZG93bmxvYWRpbmcgYW55IG1pc3NpbmcgZGVwZW5kZW5jaWVzLiAgVGhpcwpjb21tYW5kIGRv
ZXMgbm90IGZldGNoIG5ldyByZXZpc2lvbnMgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuICBUaGF0Cmlz
IHRoZSByZXNwb25zaWJpbGl0eSBvZiBgcGFja2FnZS12Yy11cGdyYWRlJy4gIEludGVyYWN0aXZl
bHksCnByb21wdCBmb3IgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gcmVidWlsZC4iCiAgKGlu
dGVyYWN0aXZlIChsaXN0IChwYWNrYWdlLXZjLS1yZWFkLXBhY2thZ2UtZGVzYyAiUmVidWlsZCBw
YWNrYWdlOiAiIHQpKSkKICAocGFja2FnZS12Yy0tdW5wYWNrLTEgcGtnLWRlc2MgKHBhY2thZ2Ut
ZGVzYy1kaXIgcGtnLWRlc2MpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLXZjLXBy
ZXBhcmUtcGF0Y2ggKHBrZy1kZXNjIHN1YmplY3QgcmV2aXNpb25zKQogICJTZW5kIHBhdGNoIGZv
ciBSRVZJU0lPTlMgdG8gbWFpbnRhaW5lciBvZiB0aGUgcGFja2FnZSBQS0cgdXNpbmcgU1VCSkVD
VC4KVGhlIGZ1bmN0aW9uIHVzZXMgYHZjLXByZXBhcmUtcGF0Y2gnLCBwYXNzaW5nIFNVQkpFQ1Qg
YW5kClJFVklTSU9OUyBkaXJlY3RseS4gIFBLRy1ERVNDIG11c3QgYmUgYSBwYWNrYWdlIGRlc2Ny
aXB0aW9uLgpJbnRlcmFjdGl2ZWx5LCBwcm9tcHQgZm9yIFBLRy1ERVNDLCBTVUJKRUNULCBhbmQg
UkVWSVNJT05TLiAgV2hlbgppbnZva2VkIHdpdGggYSBudW1lcmljYWwgcHJlZml4IGFyZ3VtZW50
LCB1c2UgdGhlIGxhc3QgTgpyZXZpc2lvbnMuICBXaGVuIGludm9rZWQgaW50ZXJhY3RpdmVseSBp
biBhIExvZyBWaWV3IGJ1ZmZlciB3aXRoCm1hcmtlZCByZXZpc2lvbnMsIHVzZSB0aG9zZS4iCiAg
KGludGVyYWN0aXZlCiAgIChsaXN0IChwYWNrYWdlLXZjLS1yZWFkLXBhY2thZ2UtZGVzYyAiUGFj
a2FnZSB0byBwcmVwYXJlIGEgcGF0Y2ggZm9yOiAiIHQpCiAgICAgICAgIChhbmQgKG5vdCB2Yy1w
cmVwYXJlLXBhdGNoZXMtc2VwYXJhdGVseSkKICAgICAgICAgICAgICAocmVhZC1zdHJpbmcgIlN1
YmplY3Q6ICIgIltQQVRDSF0gIiBuaWwgbmlsIHQpKQogICAgICAgICAodmMtcHJlcGFyZS1wYXRj
aC1wcm9tcHQtcmV2aXNpb25zKSkpCiAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IChwYWNrYWdl
LWRlc2MtZGlyIHBrZy1kZXNjKSkpCiAgICAodmMtcHJlcGFyZS1wYXRjaCAocGFja2FnZS1tYWlu
dGFpbmVycyBwa2ctZGVzYyB0KQogICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCByZXZpc2lv
bnMpKSkKCihwcm92aWRlICdwYWNrYWdlLXZjKQo7OzsgcGFja2FnZS12Yy5lbCBlbmRzIGhlcmUK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA--=-=-Content-Type: text/x-diff
Content-Disposition: attachment;
 filename01-elpa-packages-package-package-vc-New-packages.patch

From 3834109bf379fae333b60adf49dd119bd538635a Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Fri, 18 Aug 2023 20:33:24 +0200
Subject: [PATCH] * elpa-packages (package,package-vc): New packages

---
 elpa-packages | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/elpa-packages b/elpa-packages
index 3949d8fe14..ced827955b 100644
--- a/elpa-packages
+++ b/elpa-packages
@@ -521,7 +521,9 @@
  (paced			:url "bzr::bzr://bzr.savannah.nongnu.org/paced-el/trunk"
   ;; The Bzr<->Git bridge wasn't working well enough last time I tried.
   :manual-sync t)
+ (package		:core "lisp/emacs-lisp/package.el")
  (package-fixes		:url nil)
+ (package-vc		:core "lisp/emacs-lisp/package-vc.el")
  (parsec              	:url "https://github.com/cute-jumper/parsec.el.git")
  (parser-generator	:url "https://github.com/cjohansson/emacs-parser-generator")
  (path-iterator		:url nil)
--
2.41.0


--=-=-=--

Page 1 of 2 • 59 total messages
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads