forked from ag91/code-compass
-
Notifications
You must be signed in to change notification settings - Fork 0
/
code-compass.el
7339 lines (7193 loc) · 515 KB
/
code-compass.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;;; code-compass.el --- Make Emacs your compass in a sea of software complexity.
;; Copyright (C) 2020 Andrea Giugliano
;; Author: Andrea Giugliano <[email protected]>
;; Version: 0.0.3
;; Package-Version: 20210101
;; Keywords: emacs, sofware, analysis
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Make Emacs your compass in a sea of software complexity
;;
;; This tool puts the power and knowledge of your repository history in your hands.
;; The current analyses supported are:
;; - c/show-hotspots:
;; show hotspots in code repository as a circle diagram.
;; Circles are packages or modules.
;; The redder the circle, the more it has been modified lately. The bigger the more code it contains.
;;
;; See documentation on https://github.com/ag91/code-compass
;;; Code:
(require 'f)
(require 's)
(require 'simple-httpd)
(require 'async)
(defgroup code-compass nil
"Options specific to code-compass."
:tag "code-compass"
:group 'code-compass)
(defcustom c/default-periods
'("beginning" "1d" "2d" "3d" "6d" "12d" "18d" "24d" "1m" "2m" "6m")
"A list of choices for starting date for reducing the Git log for analysis. 'beginning' is a keyword to say to not reduce.'Nd' means to start after N days, where N is a positive number. 'Nm' means to start after N months, where N is a positive number."
:group 'code-compass)
(defcustom c/snapshot-periods
'("1d" "3m" "6m" "9m" "12m" "15m")
"A list of snapshots periods to show evolution of analyses over time."
:group 'code-compass)
(defcustom c/code-maat-command
"docker run -v /tmp/:/data code-maat-app"
"Command to run Code-maat (https://github.com/adamtornhill/code-maat). Currently defaults to use docker because easier to setup."
:group 'code-compass)
(defcustom c/preferred-browser
"chromium"
"Browser to use to open graphs served by webserver."
:group 'code-compass)
(defconst c/path-to-code-compass (file-name-directory load-file-name))
(defun c/subtract-to-now (n month|day &optional time)
"Subtract N * MONTH|DAY to current time. Optionally give TIME from which to start."
(time-subtract
(or time (current-time))
(seconds-to-time (* 60 60 month|day n))))
(defun c/request-date (days|months &optional time)
"Request date in days or months by asking how many DAYS|MONTHS ago. Optionally give TIME from which to start."
(interactive
(list (completing-read "From how long ago?" c/default-periods)))
(when (not (string= days|months "beginning"))
(format-time-string
"%Y-%m-%d"
(apply
'c/subtract-to-now
(-concat
(if (s-contains-p "m" days|months)
(list (string-to-number (s-replace "m" "" days|months)) (* 24 31))
(list (string-to-number (s-replace "d" "" days|months)) 24))
(list time))))))
(defun c/first (l)
(car l))
(defun c/second (l)
(nth 1 l))
(defun c/third (l)
(nth 2 l))
(defun c/produce-git-report (repository date &optional before-date)
"Create git report for REPOSITORY with a Git log starting at DATE. Define optionally a BEFORE-DATE."
(interactive
(list (call-interactively 'c/request-date)))
(message "Producing git report...")
(shell-command
(s-concat
(format "cd %s;" repository)
"git log --all --numstat --date=short --pretty=format:'--%h--%ad--%aN' --no-renames "
(if date
(format
"--after=%s "
date)
"")
(if before-date
(format
"--before=%s "
before-date)
"")
(format
"> /tmp/%s.log"
(f-filename repository))))
repository)
(defun c/run-code-maat (command repository)
"Run code-maat's COMMAND on REPOSITORY."
(message "Producing code-maat %s report for %s..." command repository)
(shell-command
(format
"%s -l /data/%s.log -c git2 -a %s > /tmp/%s-%s.csv"
c/code-maat-command
(f-filename repository)
command
(f-filename repository)
command)))
(defun c/produce-code-maat-revisions-report (repository)
"Create code-maat revisions report for REPOSITORY."
(c/run-code-maat "revisions" repository)
repository)
(defun c/produce-cloc-report (repository)
"Create cloc report for REPOSITORY."
(message "Producing cloc report...")
(shell-command
(format "cd %s; cloc ./ --by-file --csv --quiet --report-file=/tmp/cloc-%s.csv" repository (f-filename repository)))
repository)
(defun c/generate-merger-script (repository)
"Generate a Python script to give weights to the circle diagram of REPOSITORY."
(copy-file
(expand-file-name "./scripts/csv_as_enclosure_json.py" c/path-to-code-compass)
"/tmp/"
t)
repository)
(defun c/generate-d3-lib (repository)
"Make available the D3 library for REPOSITORY. This is just to not depend on a network connection."
(mkdir (format "/tmp/%s/d3/" (f-filename repository)) t)
(with-temp-file (format "/tmp/%s/d3/d3.min.js" (f-filename repository))
(insert (base64-decode-string
"IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAv
MH1mdW5jdGlvbiB0KG4pe3JldHVybiBudWxsIT1uJiYhaXNOYU4obil9ZnVuY3Rpb24gZShuKXty
ZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0w
KSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24o
dFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9y
KGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0
aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1m
dW5jdGlvbiByKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiB1KG4pe2Zvcih2YXIgdD0xO24q
dCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBpKG4sdCl7dHJ5e2Zvcih2YXIgZSBpbiB0KU9i
amVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHt2YWx1ZTp0W2VdLGVudW1lcmFibGU6
ITF9KX1jYXRjaChyKXtuLnByb3RvdHlwZT10fX1mdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGEobil7
cmV0dXJuIGhhK24gaW4gdGhpc31mdW5jdGlvbiBjKG4pe3JldHVybiBuPWhhK24sbiBpbiB0aGlz
JiZkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiBzKCl7dmFyIG49W107cmV0dXJuIHRoaXMuZm9yRWFj
aChmdW5jdGlvbih0KXtuLnB1c2godCl9KSxufWZ1bmN0aW9uIGwoKXt2YXIgbj0wO2Zvcih2YXIg
dCBpbiB0aGlzKXQuY2hhckNvZGVBdCgwKT09PWdhJiYrK247cmV0dXJuIG59ZnVuY3Rpb24gZigp
e2Zvcih2YXIgbiBpbiB0aGlzKWlmKG4uY2hhckNvZGVBdCgwKT09PWdhKXJldHVybiExO3JldHVy
biEwfWZ1bmN0aW9uIGgoKXt9ZnVuY3Rpb24gZyhuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFy
IHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24gcChuLHQp
e2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJp
bmcoMSk7Zm9yKHZhciBlPTAscj1wYS5sZW5ndGg7cj5lOysrZSl7dmFyIHU9cGFbZV0rdDtpZih1
IGluIG4pcmV0dXJuIHV9fWZ1bmN0aW9uIHYoKXt9ZnVuY3Rpb24gZCgpe31mdW5jdGlvbiBtKG4p
e2Z1bmN0aW9uIHQoKXtmb3IodmFyIHQscj1lLHU9LTEsaT1yLmxlbmd0aDsrK3U8aTspKHQ9clt1
XS5vbikmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBufXZhciBlPVtdLHI9bmV3IG87
cmV0dXJuIHQub249ZnVuY3Rpb24odCx1KXt2YXIgaSxvPXIuZ2V0KHQpO3JldHVybiBhcmd1bWVu
dHMubGVuZ3RoPDI/byYmby5vbjoobyYmKG8ub249bnVsbCxlPWUuc2xpY2UoMCxpPWUuaW5kZXhP
ZihvKSkuY29uY2F0KGUuc2xpY2UoaSsxKSksci5yZW1vdmUodCkpLHUmJmUucHVzaChyLnNldCh0
LHtvbjp1fSkpLG4pfSx0fWZ1bmN0aW9uIHkoKXtHby5ldmVudC5wcmV2ZW50RGVmYXVsdCgpfWZ1
bmN0aW9uIHgoKXtmb3IodmFyIG4sdD1Hby5ldmVudDtuPXQuc291cmNlRXZlbnQ7KXQ9bjtyZXR1
cm4gdH1mdW5jdGlvbiBNKG4pe2Zvcih2YXIgdD1uZXcgZCxlPTAscj1hcmd1bWVudHMubGVuZ3Ro
OysrZTxyOyl0W2FyZ3VtZW50c1tlXV09bSh0KTtyZXR1cm4gdC5vZj1mdW5jdGlvbihlLHIpe3Jl
dHVybiBmdW5jdGlvbih1KXt0cnl7dmFyIGk9dS5zb3VyY2VFdmVudD1Hby5ldmVudDt1LnRhcmdl
dD1uLEdvLmV2ZW50PXUsdFt1LnR5cGVdLmFwcGx5KGUscil9ZmluYWxseXtHby5ldmVudD1pfX19
LHR9ZnVuY3Rpb24gXyhuKXtyZXR1cm4gZGEobixfYSksbn1mdW5jdGlvbiBiKG4pe3JldHVybiJm
dW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbWEobix0aGlzKX19ZnVuY3Rp
b24gdyhuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIHlh
KG4sdGhpcyl9fWZ1bmN0aW9uIFMobix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1
dGUobil9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2Fs
KX1mdW5jdGlvbiB1KCl7dGhpcy5zZXRBdHRyaWJ1dGUobix0KX1mdW5jdGlvbiBpKCl7dGhpcy5z
ZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwsdCl9ZnVuY3Rpb24gbygpe3ZhciBlPXQuYXBw
bHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUobik6dGhpcy5z
ZXRBdHRyaWJ1dGUobixlKX1mdW5jdGlvbiBhKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50
cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6dGhpcy5z
ZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwsZSl9cmV0dXJuIG49R28ubnMucXVhbGlmeShu
KSxudWxsPT10P24ubG9jYWw/cjplOiJmdW5jdGlvbiI9PXR5cGVvZiB0P24ubG9jYWw/YTpvOm4u
bG9jYWw/aTp1fWZ1bmN0aW9uIGsobil7cmV0dXJuIG4udHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIg
Iil9ZnVuY3Rpb24gRShuKXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86XnxcXHMrKSIrR28ucmVxdW90
ZShuKSsiKD86XFxzK3wkKSIsImciKX1mdW5jdGlvbiBBKG4pe3JldHVybiBuLnRyaW0oKS5zcGxp
dCgvXnxccysvKX1mdW5jdGlvbiBDKG4sdCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT0tMTsrK2U8
dTspbltlXSh0aGlzLHQpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIGU9LTEscj10LmFwcGx5KHRoaXMs
YXJndW1lbnRzKTsrK2U8dTspbltlXSh0aGlzLHIpfW49QShuKS5tYXAoTik7dmFyIHU9bi5sZW5n
dGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIE4obil7dmFyIHQ9RShu
KTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZih1PWUuY2xhc3NMaXN0KXJldHVybiByP3UuYWRkKG4p
OnUucmVtb3ZlKG4pO3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJ
bmRleD0wLHQudGVzdCh1KXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixrKHUrIiAiK24pKSk6ZS5z
ZXRBdHRyaWJ1dGUoImNsYXNzIixrKHUucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gTChuLHQs
ZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gdSgp
e3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIGkoKXt2YXIgcj10LmFwcGx5
KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhp
cy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10
eXBlb2YgdD9pOnV9ZnVuY3Rpb24gVChuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1m
dW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIHUoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJn
dW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9l
OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6cn1mdW5jdGlvbiBxKG4pe3JldHVybiJmdW5jdGlvbiI9
PXR5cGVvZiBuP246KG49R28ubnMucXVhbGlmeShuKSkubG9jYWw/ZnVuY3Rpb24oKXtyZXR1cm4g
dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfTpmdW5j
dGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFt
ZXNwYWNlVVJJLG4pfX1mdW5jdGlvbiB6KG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBS
KG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYSh0aGlzLG4pfX1mdW5jdGlvbiBEKHQpe3Jl
dHVybiBhcmd1bWVudHMubGVuZ3RofHwodD1uKSxmdW5jdGlvbihuLGUpe3JldHVybiBuJiZlP3Qo
bi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX19ZnVuY3Rpb24gUChuLHQpe2Zvcih2YXIgZT0w
LHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztv
KyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFUobil7cmV0dXJuIGRhKG4s
d2EpLG59ZnVuY3Rpb24gaihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8s
YT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsx
KTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIEgoKXt2YXIgbj10aGlzLl9f
dHJhbnNpdGlvbl9fO24mJisrbi5hY3RpdmV9ZnVuY3Rpb24gRihuLHQsZSl7ZnVuY3Rpb24gcigp
e3ZhciB0PXRoaXNbb107dCYmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHQsdC4kKSxkZWxl
dGUgdGhpc1tvXSl9ZnVuY3Rpb24gdSgpe3ZhciB1PWModCxRbyhhcmd1bWVudHMpKTtyLmNhbGwo
dGhpcyksdGhpcy5hZGRFdmVudExpc3RlbmVyKG4sdGhpc1tvXT11LHUuJD1lKSx1Ll89dH1mdW5j
dGlvbiBpKCl7dmFyIHQsZT1uZXcgUmVnRXhwKCJeX19vbihbXi5dKykiK0dvLnJlcXVvdGUobikr
IiQiKTtmb3IodmFyIHIgaW4gdGhpcylpZih0PXIubWF0Y2goZSkpe3ZhciB1PXRoaXNbcl07dGhp
cy5yZW1vdmVFdmVudExpc3RlbmVyKHRbMV0sdSx1LiQpLGRlbGV0ZSB0aGlzW3JdfX12YXIgbz0i
X19vbiIrbixhPW4uaW5kZXhPZigiLiIpLGM9TzthPjAmJihuPW4uc3Vic3RyaW5nKDAsYSkpO3Zh
ciBzPWthLmdldChuKTtyZXR1cm4gcyYmKG49cyxjPUkpLGE/dD91OnI6dD92Oml9ZnVuY3Rpb24g
TyhuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1Hby5ldmVudDtHby5ldmVudD1lLHRbMF09
dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7R28uZXZlbnQ9cn19fWZ1
bmN0aW9uIEkobix0KXt2YXIgZT1PKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMs
cj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24o
dCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gWSgpe3ZhciBuPSIuZHJhZ3N1cHByZXNzLSIrICsr
QWEsdD0iY2xpY2siK24sZT1Hby5zZWxlY3QoZWEpLm9uKCJ0b3VjaG1vdmUiK24seSkub24oImRy
YWdzdGFydCIrbix5KS5vbigic2VsZWN0c3RhcnQiK24seSk7aWYoRWEpe3ZhciByPXRhLnN0eWxl
LHU9cltFYV07cltFYV09Im5vbmUifXJldHVybiBmdW5jdGlvbihpKXtmdW5jdGlvbiBvKCl7ZS5v
bih0LG51bGwpfWUub24obixudWxsKSxFYSYmKHJbRWFdPXUpLGkmJihlLm9uKHQsZnVuY3Rpb24o
KXt5KCksbygpfSwhMCksc2V0VGltZW91dChvLDApKX19ZnVuY3Rpb24gWihuLHQpe3QuY2hhbmdl
ZFRvdWNoZXMmJih0PXQuY2hhbmdlZFRvdWNoZXNbMF0pO3ZhciBlPW4ub3duZXJTVkdFbGVtZW50
fHxuO2lmKGUuY3JlYXRlU1ZHUG9pbnQpe3ZhciByPWUuY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4g
ci54PXQuY2xpZW50WCxyLnk9dC5jbGllbnRZLHI9ci5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3Jl
ZW5DVE0oKS5pbnZlcnNlKCkpLFtyLngsci55XX12YXIgdT1uLmdldEJvdW5kaW5nQ2xpZW50UmVj
dCgpO3JldHVyblt0LmNsaWVudFgtdS5sZWZ0LW4uY2xpZW50TGVmdCx0LmNsaWVudFktdS50b3At
bi5jbGllbnRUb3BdfWZ1bmN0aW9uIFYoKXtyZXR1cm4gR28uZXZlbnQuY2hhbmdlZFRvdWNoZXNb
MF0uaWRlbnRpZmllcn1mdW5jdGlvbiAkKCl7cmV0dXJuIEdvLmV2ZW50LnRhcmdldH1mdW5jdGlv
biBYKCl7cmV0dXJuIGVhfWZ1bmN0aW9uIEIobil7cmV0dXJuIG4+MD8xOjA+bj8tMTowfWZ1bmN0
aW9uIEoobix0LGUpe3JldHVybih0WzBdLW5bMF0pKihlWzFdLW5bMV0pLSh0WzFdLW5bMV0pKihl
WzBdLW5bMF0pfWZ1bmN0aW9uIFcobil7cmV0dXJuIG4+MT8wOi0xPm4/Q2E6TWF0aC5hY29zKG4p
fWZ1bmN0aW9uIEcobil7cmV0dXJuIG4+MT9MYTotMT5uPy1MYTpNYXRoLmFzaW4obil9ZnVuY3Rp
b24gSyhuKXtyZXR1cm4oKG49TWF0aC5leHAobikpLTEvbikvMn1mdW5jdGlvbiBRKG4pe3JldHVy
bigobj1NYXRoLmV4cChuKSkrMS9uKS8yfWZ1bmN0aW9uIG50KG4pe3JldHVybigobj1NYXRoLmV4
cCgyKm4pKS0xKS8obisxKX1mdW5jdGlvbiB0dChuKXtyZXR1cm4obj1NYXRoLnNpbihuLzIpKSpu
fWZ1bmN0aW9uIGV0KCl7fWZ1bmN0aW9uIHJ0KG4sdCxlKXtyZXR1cm4gbmV3IHV0KG4sdCxlKX1m
dW5jdGlvbiB1dChuLHQsZSl7dGhpcy5oPW4sdGhpcy5zPXQsdGhpcy5sPWV9ZnVuY3Rpb24gaXQo
bix0LGUpe2Z1bmN0aW9uIHIobil7cmV0dXJuIG4+MzYwP24tPTM2MDowPm4mJihuKz0zNjApLDYw
Pm4/aSsoby1pKSpuLzYwOjE4MD5uP286MjQwPm4/aSsoby1pKSooMjQwLW4pLzYwOml9ZnVuY3Rp
b24gdShuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqcihuKSl9dmFyIGksbztyZXR1cm4gbj1pc05h
TihuKT8wOihuJT0zNjApPDA/biszNjA6bix0PWlzTmFOKHQpPzA6MD50PzA6dD4xPzE6dCxlPTA+
ZT8wOmU+MT8xOmUsbz0uNT49ZT9lKigxK3QpOmUrdC1lKnQsaT0yKmUtbyx5dCh1KG4rMTIwKSx1
KG4pLHUobi0xMjApKX1mdW5jdGlvbiBvdChuLHQsZSl7cmV0dXJuIG5ldyBhdChuLHQsZSl9ZnVu
Y3Rpb24gYXQobix0LGUpe3RoaXMuaD1uLHRoaXMuYz10LHRoaXMubD1lfWZ1bmN0aW9uIGN0KG4s
dCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxzdChlLE1hdGguY29z
KG4qPXphKSp0LE1hdGguc2luKG4pKnQpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gbmV3IGx0
KG4sdCxlKX1mdW5jdGlvbiBsdChuLHQsZSl7dGhpcy5sPW4sdGhpcy5hPXQsdGhpcy5iPWV9ZnVu
Y3Rpb24gZnQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1
cm4gdT1ndCh1KSpaYSxyPWd0KHIpKlZhLGk9Z3QoaSkqJGEseXQodnQoMy4yNDA0NTQyKnUtMS41
MzcxMzg1KnItLjQ5ODUzMTQqaSksdnQoLS45NjkyNjYqdSsxLjg3NjAxMDgqcisuMDQxNTU2Kmkp
LHZ0KC4wNTU2NDM0KnUtLjIwNDAyNTkqcisxLjA1NzIyNTIqaSkpfWZ1bmN0aW9uIGh0KG4sdCxl
KXtyZXR1cm4gbj4wP290KE1hdGguYXRhbjIoZSx0KSpSYSxNYXRoLnNxcnQodCp0K2UqZSksbik6
b3QoMC8wLDAvMCxuKX1mdW5jdGlvbiBndChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihu
LTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHB0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3co
biwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiB2dChuKXtyZXR1cm4gTWF0aC5yb3VuZCgy
NTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5j
dGlvbiBkdChuKXtyZXR1cm4geXQobj4+MTYsMjU1Jm4+PjgsMjU1Jm4pfWZ1bmN0aW9uIG10KG4p
e3JldHVybiBkdChuKSsiIn1mdW5jdGlvbiB5dChuLHQsZSl7cmV0dXJuIG5ldyB4dChuLHQsZSl9
ZnVuY3Rpb24geHQobix0LGUpe3RoaXMucj1uLHRoaXMuZz10LHRoaXMuYj1lfWZ1bmN0aW9uIE10
KG4pe3JldHVybiAxNj5uPyIwIitNYXRoLm1heCgwLG4pLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigy
NTUsbikudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIF90KG4sdCxlKXt2YXIgcix1LGksbz0wLGE9MCxj
PTA7aWYocj0vKFthLXpdKylcKCguKilcKS9pLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgi
LCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQo
dVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoa3QodVsw
XSksa3QodVsxXSksa3QodVsyXSkpfXJldHVybihpPUphLmdldChuKSk/dChpLnIsaS5nLGkuYik6
KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc3Vic3RyaW5n
KDEpLDE2KSl8fCg0PT09bi5sZW5ndGg/KG89KDM4NDAmaSk+PjQsbz1vPj40fG8sYT0yNDAmaSxh
PWE+PjR8YSxjPTE1JmksYz1jPDw0fGMpOjc9PT1uLmxlbmd0aCYmKG89KDE2NzExNjgwJmkpPj4x
NixhPSg2NTI4MCZpKT4+OCxjPTI1NSZpKSksdChvLGEsYykpfWZ1bmN0aW9uIGJ0KG4sdCxlKXt2
YXIgcix1LGk9TWF0aC5taW4obi89MjU1LHQvPTI1NSxlLz0yNTUpLG89TWF0aC5tYXgobix0LGUp
LGE9by1pLGM9KG8raSkvMjtyZXR1cm4gYT8odT0uNT5jP2EvKG8raSk6YS8oMi1vLWkpLHI9bj09
bz8odC1lKS9hKyhlPnQ/NjowKTp0PT1vPyhlLW4pL2ErMjoobi10KS9hKzQscio9NjApOihyPTAv
MCx1PWM+MCYmMT5jPzA6cikscnQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9
U3QodCksZT1TdChlKTt2YXIgcj1wdCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUp
L1phKSx1PXB0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS9WYSksaT1wdCgoLjAx
OTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvJGEpO3JldHVybiBzdCgxMTYqdS0xNiw1MDAq
KHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24v
MTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1w
YXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQo
Mi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVu
Y3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIG59ZnVuY3Rpb24gQ3Qobil7
cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5j
dGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4s
dCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZjLnJlc3BvbnNlVGV4
dHx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0
dXJuIG8uZXJyb3IuY2FsbChpLHIpLHZvaWQgMH1vLmxvYWQuY2FsbChpLG4pfWVsc2Ugby5lcnJv
ci5jYWxsKGksYyl9dmFyIGk9e30sbz1Hby5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNz
IiwibG9hZCIsImVycm9yIiksYT17fSxjPW5ldyBYTUxIdHRwUmVxdWVzdCxzPW51bGw7cmV0dXJu
IWVhLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzop
P1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25s
b2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0
YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PUdvLmV2ZW50O0dvLmV2
ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7R28uZXZlbnQ9dH19LGkuaGVh
ZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRz
Lmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVU
eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpu
KyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVu
Z3RoPyhzPW4saSk6c30saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0
IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNl
bmQuYXBwbHkoaSxbbl0uY29uY2F0KFFvKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24o
ZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9
cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0
PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBsIGluIGEpYy5zZXRSZXF1ZXN0
SGVhZGVyKGwsYVtsXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVy
cmlkZU1pbWVUeXBlKHQpLG51bGwhPXMmJihjLnJlc3BvbnNlVHlwZT1zKSxudWxsIT11JiZpLm9u
KCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2Vu
ZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7
cmV0dXJuIGMuYWJvcnQoKSxpfSxHby5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChM
dChyKSl9ZnVuY3Rpb24gTHQobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24o
bnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIFR0KCl7dmFyIG49cXQoKSx0PXp0KCktbjt0PjI0
Pyhpc0Zpbml0ZSh0KSYmKGNsZWFyVGltZW91dChRYSksUWE9c2V0VGltZW91dChUdCx0KSksS2E9
MCk6KEthPTEsdGMoVHQpKX1mdW5jdGlvbiBxdCgpe3ZhciBuPURhdGUubm93KCk7Zm9yKG5jPVdh
O25jOyluPj1uYy50JiYobmMuZj1uYy5jKG4tbmMudCkpLG5jPW5jLm47cmV0dXJuIG59ZnVuY3Rp
b24genQoKXtmb3IodmFyIG4sdD1XYSxlPTEvMDt0Oyl0LmY/dD1uP24ubj10Lm46V2E9dC5uOih0
LnQ8ZSYmKGU9dC50KSx0PShuPXQpLm4pO3JldHVybiBHYT1uLGV9ZnVuY3Rpb24gUnQobix0KXty
ZXR1cm4gdC0obj9NYXRoLmNlaWwoTWF0aC5sb2cobikvTWF0aC5MTjEwKToxKX1mdW5jdGlvbiBE
dChuLHQpe3ZhciBlPU1hdGgucG93KDEwLDMqZmEoOC10KSk7cmV0dXJue3NjYWxlOnQ+OD9mdW5j
dGlvbihuKXtyZXR1cm4gbi9lfTpmdW5jdGlvbihuKXtyZXR1cm4gbiplfSxzeW1ib2w6bn19ZnVu
Y3Rpb24gUHQobil7dmFyIHQ9bi5kZWNpbWFsLGU9bi50aG91c2FuZHMscj1uLmdyb3VwaW5nLHU9
bi5jdXJyZW5jeSxpPXI/ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLHU9W10saT0wLG89
clswXTt0PjAmJm8+MDspdS5wdXNoKG4uc3Vic3RyaW5nKHQtPW8sdCtvKSksbz1yW2k9KGkrMSkl
ci5sZW5ndGhdO3JldHVybiB1LnJldmVyc2UoKS5qb2luKGUpfTpBdDtyZXR1cm4gZnVuY3Rpb24o
bil7dmFyIGU9cmMuZXhlYyhuKSxyPWVbMV18fCIgIixvPWVbMl18fCI+IixhPWVbM118fCIiLGM9
ZVs0XXx8IiIscz1lWzVdLGw9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0i
IixtPSExO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChzfHwiMCI9PT1yJiYiPSI9PT1v
KSYmKHM9cj0iMCIsbz0iPSIsZiYmKGwtPU1hdGguZmxvb3IoKGwtMSkvNCkpKSxnKXtjYXNlIm4i
OmY9ITAsZz0iZyI7YnJlYWs7Y2FzZSIlIjpwPTEwMCxkPSIlIixnPSJmIjticmVhaztjYXNlInAi
OnA9MTAwLGQ9IiUiLGc9InIiO2JyZWFrO2Nhc2UiYiI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6
IiMiPT09YyYmKHY9IjAiK2cudG9Mb3dlckNhc2UoKSk7Y2FzZSJjIjpjYXNlImQiOm09ITAsaD0w
O2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1n
fHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgp
KTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9dWMu
Z2V0KGcpfHxVdDt2YXIgeT1zJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4l
MSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOmE7aWYoMD5wKXt2
YXIgYz1Hby5mb3JtYXRQcmVmaXgobixoKTtuPWMuc2NhbGUobiksZT1jLnN5bWJvbCtkfWVsc2Ug
bio9cDtuPWcobixoKTt2YXIgeD1uLmxhc3RJbmRleE9mKCIuIiksTT0wPng/bjpuLnN1YnN0cmlu
ZygwLHgpLF89MD54PyIiOnQrbi5zdWJzdHJpbmcoeCsxKTshcyYmZiYmKE09aShNKSk7dmFyIGI9
di5sZW5ndGgrTS5sZW5ndGgrXy5sZW5ndGgrKHk/MDp1Lmxlbmd0aCksdz1sPmI/bmV3IEFycmF5
KGI9bC1iKzEpLmpvaW4ocik6IiI7cmV0dXJuIHkmJihNPWkodytNKSksdSs9dixuPU0rXywoIjwi
PT09bz91K24rdzoiPiI9PT1vP3crdStuOiJeIj09PW8/dy5zdWJzdHJpbmcoMCxiPj49MSkrdStu
K3cuc3Vic3RyaW5nKGIpOnUrKHk/bjp3K24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4r
IiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUu
VVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEh0KG4sdCxl
KXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1
bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBvYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixl
KXtyZXR1cm4gdChuPW5ldyBvYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4p
LGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywx
KTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVu
Y3Rpb24gYShuLHQsZSl7dHJ5e29jPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQs
ZSl9ZmluYWxseXtvYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0
PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUZ0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1G
dChyKSxjLmNlaWw9RnQodSksYy5vZmZzZXQ9RnQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gRnQo
bil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e29jPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5f
PXQsbihyLGUpLl99ZmluYWxseXtvYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChu
KXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1u
LmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zdWJzdHJpbmcoYyxhKSksbnVsbCE9KHU9Y2NbZT1u
LmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLChpPUNbZV0pJiYoZT1pKHQsbnVsbD09
dT8iZSI9PT1lPyIgIjoiMCI6dSkpLG8ucHVzaChlKSxjPWErMSk7cmV0dXJuIG8ucHVzaChuLnN1
YnN0cmluZyhjLGEpKSxvLmpvaW4oIiIpfXZhciByPW4ubGVuZ3RoO3JldHVybiB0LnBhcnNlPWZ1
bmN0aW9uKHQpe3ZhciByPXt5OjE5MDAsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjAsWjpudWxsfSx1
PWUocixuLHQsMCk7aWYodSE9dC5sZW5ndGgpcmV0dXJuIG51bGw7InAiaW4gciYmKHIuSD1yLkgl
MTIrMTIqci5wKTt2YXIgaT1udWxsIT1yLlomJm9jIT09anQsbz1uZXcoaT9qdDpvYyk7cmV0dXJu
ImoiaW4gcj9vLnNldEZ1bGxZZWFyKHIueSwwLHIuaik6InciaW4gciYmKCJXImluIHJ8fCJVImlu
IHIpPyhvLnNldEZ1bGxZZWFyKHIueSwwLDEpLG8uc2V0RnVsbFllYXIoci55LDAsIlciaW4gcj8o
ci53KzYpJTcrNypyLlctKG8uZ2V0RGF5KCkrNSklNzpyLncrNypyLlUtKG8uZ2V0RGF5KCkrNikl
NykpOm8uc2V0RnVsbFllYXIoci55LHIubSxyLmQpLG8uc2V0SG91cnMoci5IK01hdGguZmxvb3Io
ci5aLzEwMCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9vLl86b30sdC50b1N0cmluZz1mdW5jdGlv
bigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksbyxhPTAsYz10
Lmxlbmd0aCxzPWUubGVuZ3RoO2M+YTspe2lmKHI+PXMpcmV0dXJuLTE7aWYodT10LmNoYXJDb2Rl
QXQoYSsrKSwzNz09PXUpe2lmKG89dC5jaGFyQXQoYSsrKSxpPU5bbyBpbiBjYz90LmNoYXJBdChh
KyspOm9dLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVB
dChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe2IubGFzdEluZGV4PTA7
dmFyIHI9Yi5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi53PXcuZ2V0KHJbMF0udG9M
b3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdShuLHQsZSl7TS5sYXN0SW5k
ZXg9MDt2YXIgcj1NLmV4ZWModC5zdWJzdHJpbmcoZSkpO3JldHVybiByPyhuLnc9Xy5nZXQoclsw
XS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxh
c3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnN1YnN0cmluZyhlKSk7cmV0dXJuIHI/KG4ubT1BLmdl
dChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8obix0LGUp
e1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5t
PWsuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYShu
LHQscil7cmV0dXJuIGUobixDLmMudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGMobix0LHIpe3Jl
dHVybiBlKG4sQy54LnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxyKXtyZXR1cm4gZShu
LEMuWC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQsZSl7dmFyIHI9eC5nZXQodC5zdWJz
dHJpbmcoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9
dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxk
PW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4p
e2Z1bmN0aW9uIGUobil7dHJ5e29jPWp0O3ZhciB0PW5ldyBvYztyZXR1cm4gdC5fPW4scih0KX1m
aW5hbGx5e29jPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5
e29jPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e29jPURhdGV9fSxl
LnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgeD1Hby5t
YXAoKSxNPVl0KHYpLF89WnQodiksYj1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0
KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7eC5zZXQobi50b0xvd2VyQ2FzZSgp
LHQpfSk7dmFyIEM9e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rp
b24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRN
b250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpm
dW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7
cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5n
ZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEy
fHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDEraWMuZGF5T2ZZZWFyKG4pLHQs
Myl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxt
OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24o
bix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4g
cFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNl
Y29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGljLnN1bmRheU9mWWVhcihu
KSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7
cmV0dXJuIEl0KGljLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rp
b24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4s
dCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24o
KXtyZXR1cm4iJSJ9fSxOPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUs
ajpuZSxMOnVlLG06S3QsTTplZSxwOmwsUzpyZSxVOiR0LHc6VnQsVzpYdCx4OmMsWDpzLHk6SnQs
WTpCdCxaOld0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8i
LSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUt
aSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoi
K24ubWFwKEdvLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3Io
dmFyIHQ9bmV3IG8sZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNl
KCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe3NjLmxhc3RJbmRleD0wO3ZhciByPXNj
LmV4ZWModC5zdWJzdHJpbmcoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5n
dGgpOi0xfWZ1bmN0aW9uICR0KG4sdCxlKXtzYy5sYXN0SW5kZXg9MDt2YXIgcj1zYy5leGVjKHQu
c3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0
aW9uIFh0KG4sdCxlKXtzYy5sYXN0SW5kZXg9MDt2YXIgcj1zYy5leGVjKHQuc3Vic3RyaW5nKGUp
KTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxl
KXtzYy5sYXN0SW5kZXg9MDt2YXIgcj1zYy5leGVjKHQuc3Vic3RyaW5nKGUsZSs0KSk7cmV0dXJu
IHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7c2MubGFz
dEluZGV4PTA7dmFyIHI9c2MuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLnk9
R3QoK3JbMF0pLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtyZXR1cm4vXlsr
LV1cZHs0fSQvLnRlc3QodD10LnN1YnN0cmluZyhlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5j
dGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe3Nj
Lmxhc3RJbmRleD0wO3ZhciByPXNjLmV4ZWModC5zdWJzdHJpbmcoZSxlKzIpKTtyZXR1cm4gcj8o
bi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdChuLHQsZSl7c2MubGFzdElu
ZGV4PTA7dmFyIHI9c2MuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLmQ9K3Jb
MF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbmUobix0LGUpe3NjLmxhc3RJbmRleD0wO3Zh
ciByPXNjLmV4ZWModC5zdWJzdHJpbmcoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclsw
XS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtzYy5sYXN0SW5kZXg9MDt2YXIgcj1zYy5l
eGVjKHQuc3Vic3RyaW5nKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3Ro
KTotMX1mdW5jdGlvbiBlZShuLHQsZSl7c2MubGFzdEluZGV4PTA7dmFyIHI9c2MuZXhlYyh0LnN1
YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVu
Y3Rpb24gcmUobix0LGUpe3NjLmxhc3RJbmRleD0wO3ZhciByPXNjLmV4ZWModC5zdWJzdHJpbmco
ZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVl
KG4sdCxlKXtzYy5sYXN0SW5kZXg9MDt2YXIgcj1zYy5leGVjKHQuc3Vic3RyaW5nKGUsZSszKSk7
cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpZShuKXt2YXIg
dD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPX5+KGZhKHQpLzYwKSx1PWZh
KHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxl
KXtsYy5sYXN0SW5kZXg9MDt2YXIgcj1sYy5leGVjKHQuc3Vic3RyaW5nKGUsZSsxKSk7cmV0dXJu
IHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBhZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0t
MTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFy
IGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBj
ZSgpe31mdW5jdGlvbiBzZShuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1p
Kyh0LXUpfWZ1bmN0aW9uIGxlKG4sdCl7biYmcGMuaGFzT3duUHJvcGVydHkobi50eXBlKSYmcGNb
bi50eXBlXShuLHQpfWZ1bmN0aW9uIGZlKG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtm
b3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3Qu
bGluZUVuZCgpfWZ1bmN0aW9uIGhlKG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5
Z29uU3RhcnQoKTsrK2U8cjspZmUobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGdl
KCl7ZnVuY3Rpb24gbihuLHQpe24qPXphLHQ9dCp6YS8yK0NhLzQ7dmFyIGU9bi1yLG89ZT49MD8x
Oi0xLGE9byplLGM9TWF0aC5jb3ModCkscz1NYXRoLnNpbih0KSxsPWkqcyxmPXUqYytsKk1hdGgu
Y29zKGEpLGg9bCpvKk1hdGguc2luKGEpO2RjLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWMs
aT1zfXZhciB0LGUscix1LGk7bWMucG9pbnQ9ZnVuY3Rpb24obyxhKXttYy5wb2ludD1uLHI9KHQ9
bykqemEsdT1NYXRoLmNvcyhhPShlPWEpKnphLzIrQ2EvNCksaT1NYXRoLnNpbihhKX0sbWMubGlu
ZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gcGUobil7dmFyIHQ9blswXSxlPW5bMV0s
cj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2lu
KGUpXX1mdW5jdGlvbiB2ZShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsy
XX1mdW5jdGlvbiBkZShuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1u
WzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gbWUobix0KXtuWzBdKz10WzBd
LG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB5ZShuLHQpe3JldHVybltuWzBdKnQsblsx
XSp0LG5bMl0qdF19ZnVuY3Rpb24geGUobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFd
Km5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiBNZShuKXty
ZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLEcoblsyXSldfWZ1bmN0aW9uIF9lKG4sdCl7cmV0
dXJuIGZhKG5bMF0tdFswXSk8VGEmJmZhKG5bMV0tdFsxXSk8VGF9ZnVuY3Rpb24gYmUobix0KXtu
Kj16YTt2YXIgZT1NYXRoLmNvcyh0Kj16YSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4p
LE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt5YyxNYys9KG4tTWMpL3ljLF9jKz0o
dC1fYykveWMsYmMrPShlLWJjKS95Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj16
YTt2YXIgaT1NYXRoLmNvcyh1Kj16YSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxj
PU1hdGguc2luKHUpLHM9TWF0aC5hdGFuMihNYXRoLnNxcnQoKHM9ZSpjLXIqYSkqcysocz1yKm8t
dCpjKSpzKyhzPXQqYS1lKm8pKnMpLHQqbytlKmErcipjKTt4Yys9cyx3Yys9cyoodCsodD1vKSks
U2MrPXMqKGUrKGU9YSkpLGtjKz1zKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO05jLnBv
aW50PWZ1bmN0aW9uKHUsaSl7dSo9emE7dmFyIG89TWF0aC5jb3MoaSo9emEpO3Q9bypNYXRoLmNv
cyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxOYy5wb2ludD1uLHdlKHQsZSxyKX19
ZnVuY3Rpb24ga2UoKXtOYy5wb2ludD1iZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtu
Kj16YTt2YXIgZT1NYXRoLmNvcyh0Kj16YSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihu
KSxjPU1hdGguc2luKHQpLHM9dSpjLWkqYSxsPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0
KHMqcytsKmwrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLVcoZykvaCx2PU1hdGguYXRhbjIoaCxn
KTtFYys9cCpzLEFjKz1wKmwsQ2MrPXAqZix4Yys9dix3Yys9dioocisocj1vKSksU2MrPXYqKHUr
KHU9YSkpLGtjKz12KihpKyhpPWMpKSx3ZShyLHUsaSl9dmFyIHQsZSxyLHUsaTtOYy5wb2ludD1m
dW5jdGlvbihvLGEpe3Q9byxlPWEsTmMucG9pbnQ9bixvKj16YTt2YXIgYz1NYXRoLmNvcyhhKj16
YSk7cj1jKk1hdGguY29zKG8pLHU9YypNYXRoLnNpbihvKSxpPU1hdGguc2luKGEpLHdlKHIsdSxp
KX0sTmMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKSxOYy5saW5lRW5kPWtlLE5jLnBvaW50PWJl
fX1mdW5jdGlvbiBBZSgpe3JldHVybiEwfWZ1bmN0aW9uIENlKG4sdCxlLHIsdSl7dmFyIGk9W10s
bz1bXTtpZihuLmZvckVhY2goZnVuY3Rpb24obil7aWYoISgodD1uLmxlbmd0aC0xKTw9MCkpe3Zh
ciB0LGU9blswXSxyPW5bdF07aWYoX2UoZSxyKSl7dS5saW5lU3RhcnQoKTtmb3IodmFyIGE9MDt0
PmE7KythKXUucG9pbnQoKGU9blthXSlbMF0sZVsxXSk7cmV0dXJuIHUubGluZUVuZCgpLHZvaWQg
MH12YXIgYz1uZXcgTGUoZSxuLG51bGwsITApLHM9bmV3IExlKGUsbnVsbCxjLCExKTtjLm89cyxp
LnB1c2goYyksby5wdXNoKHMpLGM9bmV3IExlKHIsbixudWxsLCExKSxzPW5ldyBMZShyLG51bGws
YywhMCksYy5vPXMsaS5wdXNoKGMpLG8ucHVzaChzKX19KSxvLnNvcnQodCksTmUoaSksTmUobyks
aS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxzPW8ubGVuZ3RoO3M+YTsrK2Epb1thXS5lPWM9IWM7
Zm9yKHZhciBsLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09
aClyZXR1cm47bD1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihw
KWZvcih2YXIgYT0wLHM9bC5sZW5ndGg7cz5hOysrYSl1LnBvaW50KChmPWxbYV0pWzBdLGZbMV0p
O2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe2w9Zy5wLno7Zm9yKHZhciBh
PWwubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1sW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54
LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLGw9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5k
KCl9fX1mdW5jdGlvbiBOZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBd
Oysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBM
ZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEs
dGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFRlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1
LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2lu
dCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1
bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBzKCl7eS5wb2ludD1v
LGQubGluZUVuZCgpfWZ1bmN0aW9uIGwobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTtN
LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe00ubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlv
biBoKCl7bCh2WzBdWzBdLHZbMF1bMV0pLE0ubGluZUVuZCgpO3ZhciBuLHQ9TS5jbGVhbigpLGU9
eC5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEm
dCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKF98fChpLnBvbHln
b25TdGFydCgpLF89ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0s
dVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChl
LnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIocWUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZl
cnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6cyxwb2x5Z29uU3Rh
cnQ6ZnVuY3Rpb24oKXt5LnBvaW50PWwseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9
W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVF
bmQ9cyxnPUdvLm1lcmdlKGcpO3ZhciBuPURlKG0scCk7Zy5sZW5ndGg/KF98fChpLnBvbHlnb25T
dGFydCgpLF89ITApLENlKGcsUmUsbixlLGkpKTpuJiYoX3x8KGkucG9seWdvblN0YXJ0KCksXz0h
MCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxfJiYoaS5wb2x5
Z29uRW5kKCksXz0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0
KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVu
ZCgpfX0seD16ZSgpLE09dCh4KSxfPSExO3JldHVybiB5fX1mdW5jdGlvbiBxZShuKXtyZXR1cm4g
bi5sZW5ndGg+MX1mdW5jdGlvbiB6ZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5j
dGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxs
aW5lRW5kOnYsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0s
cmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hp
ZnQoKSkpfX19ZnVuY3Rpb24gUmUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tTGEtVGE6
TGEtblsxXSktKCh0PXQueClbMF08MD90WzFdLUxhLVRhOkxhLXRbMV0pfWZ1bmN0aW9uIERlKG4s
dCl7dmFyIGU9blswXSxyPW5bMV0sdT1bTWF0aC5zaW4oZSksLU1hdGguY29zKGUpLDBdLGk9MCxv
PTA7ZGMucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2M+YTsrK2Epe3ZhciBzPXRbYV0s
bD1zLmxlbmd0aDtpZihsKWZvcih2YXIgZj1zWzBdLGg9ZlswXSxnPWZbMV0vMitDYS80LHA9TWF0
aC5zaW4oZyksdj1NYXRoLmNvcyhnKSxkPTE7Oyl7ZD09PWwmJihkPTApLG49c1tkXTt2YXIgbT1u
WzBdLHk9blsxXS8yK0NhLzQseD1NYXRoLnNpbih5KSxNPU1hdGguY29zKHkpLF89bS1oLGI9Xz49
MD8xOi0xLHc9YipfLFM9dz5DYSxrPXAqeDtpZihkYy5hZGQoTWF0aC5hdGFuMihrKmIqTWF0aC5z
aW4odyksdipNK2sqTWF0aC5jb3ModykpKSxpKz1TP18rYipOYTpfLFNeaD49ZV5tPj1lKXt2YXIg
RT1kZShwZShmKSxwZShuKSk7eGUoRSk7dmFyIEE9ZGUodSxFKTt4ZShBKTt2YXIgQz0oU15fPj0w
Py0xOjEpKkcoQVsyXSk7KHI+Q3x8cj09PUMmJihFWzBdfHxFWzFdKSkmJihvKz1TXl8+PTA/MTot
MSl9aWYoIWQrKylicmVhaztoPW0scD14LHY9TSxmPW59fXJldHVybigtVGE+aXx8VGE+aSYmMD5k
YyleMSZvfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5l
U3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2
YXIgYT1pPjA/Q2E6LUNhLGM9ZmEoaS1lKTtmYShjLUNhKTxUYT8obi5wb2ludChlLHI9KHIrbykv
Mj4wP0xhOi1MYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2lu
dChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1DYSYmKGZhKGUtdSk8VGEmJihlLT11
KlRhKSxmYShpLWEpPFRhJiYoaS09YSpUYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5s
aW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8p
LHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0
aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNp
bihuLWUpO3JldHVybiBmYShvKT5UYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29z
KHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikp
Lyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1
PWUqTGEsci5wb2ludCgtQ2EsdSksci5wb2ludCgwLHUpLHIucG9pbnQoQ2EsdSksci5wb2ludChD
YSwwKSxyLnBvaW50KENhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLUNhLC11KSxyLnBvaW50
KC1DYSwwKSxyLnBvaW50KC1DYSx1KTtlbHNlIGlmKGZhKG5bMF0tdFswXSk+VGEpe3ZhciBpPW5b
MF08dFswXT9DYTotQ2E7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50
KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gSGUobil7ZnVuY3Rpb24gdChu
LHQpe3JldHVybiBNYXRoLmNvcyhuKSpNYXRoLmNvcyh0KT5pfWZ1bmN0aW9uIGUobil7dmFyIGUs
aSxjLHMsbDtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7cz1jPSExLGw9MX0scG9pbnQ6ZnVu
Y3Rpb24oZixoKXt2YXIgZyxwPVtmLGhdLHY9dChmLGgpLGQ9bz92PzA6dShmLGgpOnY/dShmKygw
PmY/Q2E6LUNhKSxoKTowO2lmKCFlJiYocz1jPXYpJiZuLmxpbmVTdGFydCgpLHYhPT1jJiYoZz1y
KGUscCksKF9lKGUsZyl8fF9lKHAsZykpJiYocFswXSs9VGEscFsxXSs9VGEsdj10KHBbMF0scFsx
XSkpKSx2IT09YylsPTAsdj8obi5saW5lU3RhcnQoKSxnPXIocCxlKSxuLnBvaW50KGdbMF0sZ1sx
XSkpOihnPXIoZSxwKSxuLnBvaW50KGdbMF0sZ1sxXSksbi5saW5lRW5kKCkpLGU9ZztlbHNlIGlm
KGEmJmUmJm9edil7dmFyIG07ZCZpfHwhKG09cihwLGUsITApKXx8KGw9MCxvPyhuLmxpbmVTdGFy
dCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSxuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5s
aW5lRW5kKCkpOihuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCksbi5saW5lU3Rh
cnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSkpKX0hdnx8ZSYmX2UoZSxwKXx8bi5wb2ludChw
WzBdLHBbMV0pLGU9cCxjPXYsaT1kfSxsaW5lRW5kOmZ1bmN0aW9uKCl7YyYmbi5saW5lRW5kKCks
ZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBsfChzJiZjKTw8MX19fWZ1bmN0aW9uIHIo
bix0LGUpe3ZhciByPXBlKG4pLHU9cGUodCksbz1bMSwwLDBdLGE9ZGUocix1KSxjPXZlKGEsYSks
cz1hWzBdLGw9Yy1zKnM7aWYoIWwpcmV0dXJuIWUmJm47dmFyIGY9aSpjL2wsaD0taSpzL2wsZz1k
ZShvLGEpLHA9eWUobyxmKSx2PXllKGEsaCk7bWUocCx2KTt2YXIgZD1nLG09dmUocCxkKSx5PXZl
KGQsZCkseD1tKm0teSoodmUocCxwKS0xKTtpZighKDA+eCkpe3ZhciBNPU1hdGguc3FydCh4KSxf
PXllKGQsKC1tLU0pL3kpO2lmKG1lKF8scCksXz1NZShfKSwhZSlyZXR1cm4gXzt2YXIgYix3PW5b
MF0sUz10WzBdLGs9blsxXSxFPXRbMV07dz5TJiYoYj13LHc9UyxTPWIpO3ZhciBBPVMtdyxDPWZh
KEEtQ2EpPFRhLE49Q3x8VGE+QTtpZighQyYmaz5FJiYoYj1rLGs9RSxFPWIpLE4/Qz9rK0U+MF5f
WzFdPChmYShfWzBdLXcpPFRhP2s6RSk6azw9X1sxXSYmX1sxXTw9RTpBPkNhXih3PD1fWzBdJiZf
WzBdPD1TKSl7dmFyIEw9eWUoZCwoLW0rTSkveSk7cmV0dXJuIG1lKEwscCksW18sTWUoTCldfX19
ZnVuY3Rpb24gdSh0LGUpe3ZhciByPW8/bjpDYS1uLHU9MDtyZXR1cm4tcj50P3V8PTE6dD5yJiYo
dXw9MiksLXI+ZT91fD00OmU+ciYmKHV8PTgpLHV9dmFyIGk9TWF0aC5jb3Mobiksbz1pPjAsYT1m
YShpKT5UYSxjPWdyKG4sNip6YSk7cmV0dXJuIFRlKHQsZSxjLG8/WzAsLW5dOlstQ2Esbi1DYV0p
fWZ1bmN0aW9uIEZlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1KXt2YXIgaSxvPXUuYSxhPXUu
YixjPW8ueCxzPW8ueSxsPWEueCxmPWEueSxoPTAsZz0xLHA9bC1jLHY9Zi1zO2lmKGk9bi1jLHB8
fCEoaT4wKSl7aWYoaS89cCwwPnApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHA+
MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ZS1jLHB8fCEoMD5pKSl7aWYoaS89cCww
PnApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHA+MCl7aWYoaD5pKXJldHVybjtn
PmkmJihnPWkpfWlmKGk9dC1zLHZ8fCEoaT4wKSl7aWYoaS89diwwPnYpe2lmKGg+aSlyZXR1cm47
Zz5pJiYoZz1pKX1lbHNlIGlmKHY+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ci1z
LHZ8fCEoMD5pKSl7aWYoaS89diwwPnYpe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlm
KHY+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfXJldHVybiBoPjAmJih1LmE9e3g6YytoKnAs
eTpzK2gqdn0pLDE+ZyYmKHUuYj17eDpjK2cqcCx5OnMrZyp2fSksdX19fX19fWZ1bmN0aW9uIE9l
KG4sdCxlLHIpe2Z1bmN0aW9uIHUocix1KXtyZXR1cm4gZmEoclswXS1uKTxUYT91PjA/MDozOmZh
KHJbMF0tZSk8VGE/dT4wPzI6MTpmYShyWzFdLXQpPFRhP3U+MD8xOjA6dT4wPzM6Mn1mdW5jdGlv
biBpKG4sdCl7cmV0dXJuIG8obi54LHQueCl9ZnVuY3Rpb24gbyhuLHQpe3ZhciBlPXUobiwxKSxy
PXUodCwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP3RbMV0tblsxXToxPT09ZT9uWzBdLXRbMF06
Mj09PWU/blsxXS10WzFdOnRbMF0tblswXX1yZXR1cm4gZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhu
KXtmb3IodmFyIHQ9MCxlPWQubGVuZ3RoLHI9blsxXSx1PTA7ZT51OysrdSlmb3IodmFyIGksbz0x
LGE9ZFt1XSxjPWEubGVuZ3RoLHM9YVswXTtjPm87KytvKWk9YVtvXSxzWzFdPD1yP2lbMV0+ciYm
SihzLGksbik+MCYmKyt0OmlbMV08PXImJkoocyxpLG4pPDAmJi0tdCxzPWk7cmV0dXJuIDAhPT10
fWZ1bmN0aW9uIHMoaSxhLGMscyl7dmFyIGw9MCxmPTA7aWYobnVsbD09aXx8KGw9dShpLGMpKSE9
PShmPXUoYSxjKSl8fG8oaSxhKTwwXmM+MCl7ZG8gcy5wb2ludCgwPT09bHx8Mz09PWw/bjplLGw+
MT9yOnQpO3doaWxlKChsPShsK2MrNCklNCkhPT1mKX1lbHNlIHMucG9pbnQoYVswXSxhWzFdKX1m
dW5jdGlvbiBsKHUsaSl7cmV0dXJuIHU+PW4mJmU+PXUmJmk+PXQmJnI+PWl9ZnVuY3Rpb24gZihu
LHQpe2wobix0KSYmYS5wb2ludChuLHQpfWZ1bmN0aW9uIGgoKXtOLnBvaW50PXAsZCYmZC5wdXNo
KG09W10pLFM9ITAsdz0hMSxfPWI9MC8wfWZ1bmN0aW9uIGcoKXt2JiYocCh5LHgpLE0mJncmJkEu
cmVqb2luKCksdi5wdXNoKEEuYnVmZmVyKCkpKSxOLnBvaW50PWYsdyYmYS5saW5lRW5kKCl9ZnVu
Y3Rpb24gcChuLHQpe249TWF0aC5tYXgoLVRjLE1hdGgubWluKFRjLG4pKSx0PU1hdGgubWF4KC1U
YyxNYXRoLm1pbihUYyx0KSk7dmFyIGU9bChuLHQpO2lmKGQmJm0ucHVzaChbbix0XSksUyl5PW4s
eD10LE09ZSxTPSExLGUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSk7ZWxzZSBpZihlJiZ3
KWEucG9pbnQobix0KTtlbHNle3ZhciByPXthOnt4Ol8seTpifSxiOnt4Om4seTp0fX07QyhyKT8o
d3x8KGEubGluZVN0YXJ0KCksYS5wb2ludChyLmEueCxyLmEueSkpLGEucG9pbnQoci5iLngsci5i
LnkpLGV8fGEubGluZUVuZCgpLGs9ITEpOmUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSxr
PSExKX1fPW4sYj10LHc9ZX12YXIgdixkLG0seSx4LE0sXyxiLHcsUyxrLEU9YSxBPXplKCksQz1G
ZShuLHQsZSxyKSxOPXtwb2ludDpmLGxpbmVTdGFydDpoLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6
ZnVuY3Rpb24oKXthPUEsdj1bXSxkPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthPUUs
dj1Hby5tZXJnZSh2KTt2YXIgdD1jKFtuLHJdKSxlPWsmJnQsdT12Lmxlbmd0aDsoZXx8dSkmJihh
LnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLHMobnVsbCxudWxsLDEsYSksYS5saW5l
RW5kKCkpLHUmJkNlKHYsaSx0LHMsYSksYS5wb2x5Z29uRW5kKCkpLHY9ZD1tPW51bGx9fTtyZXR1
cm4gTn19ZnVuY3Rpb24gSWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQo
ZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24o
ZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1
bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1DYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFy
YWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKkNhLzE4
MCxlPW5bMV0qQ2EvMTgwKTpbMTgwKih0L0NhKSwxODAqKGUvQ2EpXX0sdX1mdW5jdGlvbiBaZShu
LHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLnNxcnQoaS0yKnUqTWF0aC5zaW4odCkpL3U7
cmV0dXJuW2UqTWF0aC5zaW4obio9dSksby1lKk1hdGguY29zKG4pXX12YXIgcj1NYXRoLnNpbihu
KSx1PShyK01hdGguc2luKHQpKS8yLGk9MStyKigyKnUtciksbz1NYXRoLnNxcnQoaSkvdTtyZXR1
cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQ7cmV0dXJuW01hdGguYXRhbjIobixl
KS91LEcoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9u
IG4obix0KXt6Yys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O2pjLnBvaW50PWZ1bmN0aW9u
KGksbyl7amMucG9pbnQ9bix0PXI9aSxlPXU9b30samMubGluZUVuZD1mdW5jdGlvbigpe24odCxl
KX19ZnVuY3Rpb24gJGUobix0KXtSYz5uJiYoUmM9biksbj5QYyYmKFBjPW4pLERjPnQmJihEYz10
KSx0PlVjJiYoVWM9dCl9ZnVuY3Rpb24gWGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixu
LCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1m
dW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1u
fWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixs
aW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVu
Y3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEu
cG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0
OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19
fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAx
LDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBKZShu
LHQpe01jKz1uLF9jKz10LCsrYmN9ZnVuY3Rpb24gV2UoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9
bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO3djKz1vKih0K24pLzIsU2MrPW8qKGUrcikv
MixrYys9byxKZSh0PW4sZT1yKX12YXIgdCxlO0ZjLnBvaW50PWZ1bmN0aW9uKHIsdSl7RmMucG9p
bnQ9bixKZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtGYy5wb2ludD1KZX1mdW5jdGlvbiBLZSgp
e2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7d2Mr
PW8qKHIrbikvMixTYys9byoodSt0KS8yLGtjKz1vLG89dSpuLXIqdCxFYys9byoocituKSxBYys9
byoodSt0KSxDYys9MypvLEplKHI9bix1PXQpfXZhciB0LGUscix1O0ZjLnBvaW50PWZ1bmN0aW9u
KGksbyl7RmMucG9pbnQ9bixKZSh0PXI9aSxlPXU9byl9LEZjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtu
KHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0LGUpLG4uYXJj
KHQsZSxvLDAsTmEpfWZ1bmN0aW9uIGUodCxlKXtuLm1vdmVUbyh0LGUpLGEucG9pbnQ9cn1mdW5j
dGlvbiByKHQsZSl7bi5saW5lVG8odCxlKX1mdW5jdGlvbiB1KCl7YS5wb2ludD10fWZ1bmN0aW9u
IGkoKXtuLmNsb3NlUGF0aCgpfXZhciBvPTQuNSxhPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlv
bigpe2EucG9pbnQ9ZX0sbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2EubGluZUVu
ZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YS5saW5lRW5kPXUsYS5wb2ludD10fSxwb2ludFJh
ZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gbz1uLGF9LHJlc3VsdDp2fTtyZXR1cm4gYX1mdW5jdGlv
biBucihuKXtmdW5jdGlvbiB0KG4pe3JldHVybihhP3I6ZSkobil9ZnVuY3Rpb24gZSh0KXtyZXR1
cm4gcnIodCxmdW5jdGlvbihlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX0pfWZ1bmN0
aW9uIHIodCl7ZnVuY3Rpb24gZShlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX1mdW5j
dGlvbiByKCl7eD0wLzAsUy5wb2ludD1pLHQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gaShlLHIpe3Zh
ciBpPXBlKFtlLHJdKSxvPW4oZSxyKTt1KHgsTSx5LF8sYix3LHg9b1swXSxNPW9bMV0seT1lLF89
aVswXSxiPWlbMV0sdz1pWzJdLGEsdCksdC5wb2ludCh4LE0pfWZ1bmN0aW9uIG8oKXtTLnBvaW50
PWUsdC5saW5lRW5kKCl9ZnVuY3Rpb24gYygpe3IoKSxTLnBvaW50PXMsUy5saW5lRW5kPWx9ZnVu
Y3Rpb24gcyhuLHQpe2koZj1uLGg9dCksZz14LHA9TSx2PV8sZD1iLG09dyxTLnBvaW50PWl9ZnVu
Y3Rpb24gbCgpe3UoeCxNLHksXyxiLHcsZyxwLGYsdixkLG0sYSx0KSxTLmxpbmVFbmQ9byxvKCl9
dmFyIGYsaCxnLHAsdixkLG0seSx4LE0sXyxiLHcsUz17cG9pbnQ6ZSxsaW5lU3RhcnQ6cixsaW5l
RW5kOm8scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKSxTLmxpbmVTdGFy
dD1jfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19
O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsYSxjLHMsbCxmLGgsZyxwLHYsZCxtKXt2YXIgeT1s
LXQseD1mLWUsTT15KnkreCp4O2lmKE0+NCppJiZkLS0pe3ZhciBfPWErZyxiPWMrcCx3PXMrdixT
PU1hdGguc3FydChfKl8rYipiK3cqdyksaz1NYXRoLmFzaW4ody89UyksRT1mYShmYSh3KS0xKTxU
YXx8ZmEoci1oKTxUYT8ocitoKS8yOk1hdGguYXRhbjIoYixfKSxBPW4oRSxrKSxDPUFbMF0sTj1B
WzFdLEw9Qy10LFQ9Ti1lLHE9eCpMLXkqVDsocSpxL00+aXx8ZmEoKHkqTCt4KlQpL00tLjUpPi4z
fHxvPmEqZytjKnArcyp2KSYmKHUodCxlLHIsYSxjLHMsQyxOLEUsXy89UyxiLz1TLHcsZCxtKSxt
LnBvaW50KEMsTiksdShDLE4sRSxfLGIsdyxsLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1N
YXRoLmNvcygzMCp6YSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJu
IGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVu
Y3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpSYSxlKlJhXSl9
KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlz
LnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9u
KCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVu
ZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHln
b25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlv
biB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7
ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qemEsblsxXSp6YSksW25bMF0qaCtjLHMtblsx
XSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKHMtblsxXSkv
aCksbiYmW25bMF0qUmEsblsxXSpSYV19ZnVuY3Rpb24gcigpe2E9SWUobz1zcihtLHkseCksaSk7
dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLHM9cCtuWzFdKmgsdSgpCn1mdW5jdGlvbiB1
KCl7cmV0dXJuIGwmJihsLnZhbGlkPSExLGw9bnVsbCksdH12YXIgaSxvLGEsYyxzLGwsZj1ucihm
dW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2Mscy1uWzFdKmhdfSksaD0xNTAs
Zz00ODAscD0yNTAsdj0wLGQ9MCxtPTAseT0wLHg9MCxNPUxjLF89QXQsYj1udWxsLHc9bnVsbDty
ZXR1cm4gdC5zdHJlYW09ZnVuY3Rpb24obil7cmV0dXJuIGwmJihsLnZhbGlkPSExKSxsPW9yKE0o
byxmKF8obikpKSksbC52YWxpZD0hMCxsfSx0LmNsaXBBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4g
YXJndW1lbnRzLmxlbmd0aD8oTT1udWxsPT1uPyhiPW4sTGMpOkhlKChiPStuKSp6YSksdSgpKTpi
fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9bixf
PW4/T2UoblswXVswXSxuWzBdWzFdLG5bMV1bMF0sblsxXVsxXSk6QXQsdSgpKTp3fSx0LnNjYWxl
PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFu
c2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsx
XSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0
aD8odj1uWzBdJTM2MCp6YSxkPW5bMV0lMzYwKnphLHIoKSk6W3YqUmEsZCpSYV19LHQucm90YXRl
PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKnphLHk9blsx
XSUzNjAqemEseD1uLmxlbmd0aD4yP25bMl0lMzYwKnphOjAscigpKTpbbSpSYSx5KlJhLHgqUmFd
fSxHby5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHko
dGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gb3Iobil7
cmV0dXJuIHJyKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqemEsZSp6YSl9KX1mdW5jdGlvbiBh
cihuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIGNyKG4sdCl7cmV0dXJuW24+Q2E/bi1OYTotQ2E+
bj9uK05hOm4sdF19ZnVuY3Rpb24gc3Iobix0LGUpe3JldHVybiBuP3R8fGU/SWUoZnIobiksaHIo
dCxlKSk6ZnIobik6dHx8ZT9ocih0LGUpOmNyfWZ1bmN0aW9uIGxyKG4pe3JldHVybiBmdW5jdGlv
bih0LGUpe3JldHVybiB0Kz1uLFt0PkNhP3QtTmE6LUNhPnQ/dCtOYTp0LGVdfX1mdW5jdGlvbiBm
cihuKXt2YXIgdD1scihuKTtyZXR1cm4gdC5pbnZlcnQ9bHIoLW4pLHR9ZnVuY3Rpb24gaHIobix0
KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0
aC5zaW4obikqZSxzPU1hdGguc2luKHQpLGw9cypyK2EqdTtyZXR1cm5bTWF0aC5hdGFuMihjKmkt
bCpvLGEqci1zKnUpLEcobCppK2MqbyldfXZhciByPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiks
aT1NYXRoLmNvcyh0KSxvPU1hdGguc2luKHQpO3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQp
e3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUscz1NYXRo
LnNpbih0KSxsPXMqaS1jKm87cmV0dXJuW01hdGguYXRhbjIoYyppK3MqbyxhKnIrbCp1KSxHKGwq
ci1hKnUpXX0sZX1mdW5jdGlvbiBncihuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4o
bik7cmV0dXJuIGZ1bmN0aW9uKHUsaSxvLGEpe3ZhciBjPW8qdDtudWxsIT11Pyh1PXByKGUsdSks
aT1wcihlLGkpLChvPjA/aT51OnU+aSkmJih1Kz1vKk5hKSk6KHU9bitvKk5hLGk9bi0uNSpjKTtm
b3IodmFyIHMsbD11O28+MD9sPmk6aT5sO2wtPWMpYS5wb2ludCgocz1NZShbZSwtcipNYXRoLmNv
cyhsKSwtcipNYXRoLnNpbihsKV0pKVswXSxzWzFdKX19ZnVuY3Rpb24gcHIobix0KXt2YXIgZT1w
ZSh0KTtlWzBdLT1uLHhlKGUpO3ZhciByPVcoLWVbMV0pO3JldHVybigoLWVbMl08MD8tcjpyKSsy
Kk1hdGguUEktVGEpJSgyKk1hdGguUEkpfWZ1bmN0aW9uIHZyKG4sdCxlKXt2YXIgcj1Hby5yYW5n
ZShuLHQtVGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVu
Y3Rpb24odCl7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gZHIobix0LGUpe3ZhciByPUdvLnJhbmdl
KG4sdC1UYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5j
dGlvbih0KXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBtcihuKXtyZXR1cm4gbi5zb3VyY2V9ZnVu
Y3Rpb24geXIobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uIHhyKG4sdCxlLHIpe3ZhciB1PU1h
dGguY29zKHQpLGk9TWF0aC5zaW4odCksbz1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLGM9dSpN
YXRoLmNvcyhuKSxzPXUqTWF0aC5zaW4obiksbD1vKk1hdGguY29zKGUpLGY9bypNYXRoLnNpbihl
KSxoPTIqTWF0aC5hc2luKE1hdGguc3FydCh0dChyLXQpK3Uqbyp0dChlLW4pKSksZz0xL01hdGgu
c2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4o
aC1uKSpnLHI9ZSpjK3QqbCx1PWUqcyt0KmYsbz1lKmkrdCphO3JldHVybltNYXRoLmF0YW4yKHUs
cikqUmEsTWF0aC5hdGFuMihvLE1hdGguc3FydChyKnIrdSp1KSkqUmFdfTpmdW5jdGlvbigpe3Jl
dHVybltuKlJhLHQqUmFdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24gTXIoKXtmdW5j
dGlvbiBuKG4sdSl7dmFyIGk9TWF0aC5zaW4odSo9emEpLG89TWF0aC5jb3ModSksYT1mYSgobio9
emEpLXQpLGM9TWF0aC5jb3MoYSk7T2MrPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChhPW8qTWF0aC5z
aW4oYSkpKmErKGE9cippLWUqbypjKSphKSxlKmkrcipvKmMpLHQ9bixlPWkscj1vfXZhciB0LGUs
cjtJYy5wb2ludD1mdW5jdGlvbih1LGkpe3Q9dSp6YSxlPU1hdGguc2luKGkqPXphKSxyPU1hdGgu
Y29zKGkpLEljLnBvaW50PW59LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtJYy5wb2ludD1JYy5saW5l
RW5kPXZ9fWZ1bmN0aW9uIF9yKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQp
LHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2lu
KGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2Uq
ZSksdT10KHIpLGk9TWF0aC5zaW4odSksbz1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihu
KmkscipvKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9u
IGUobix0KXtvPjA/LUxhK1RhPnQmJih0PS1MYStUYSk6dD5MYS1UYSYmKHQ9TGEtVGEpO3ZhciBl
PW8vTWF0aC5wb3codSh0KSxpKTtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLG8tZSpNYXRoLmNvcyhp
Km4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbihDYS80
K24vMil9LGk9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5s
b2codSh0KS91KG4pKSxvPXIqTWF0aC5wb3codShuKSxpKS9pO3JldHVybiBpPyhlLmludmVydD1m
dW5jdGlvbihuLHQpe3ZhciBlPW8tdCxyPUIoaSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltN
YXRoLmF0YW4yKG4sZSkvaSwyKk1hdGguYXRhbihNYXRoLnBvdyhvL3IsMS9pKSktTGFdfSxlKTpT
cn1mdW5jdGlvbiB3cihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1pLXQ7cmV0dXJuW2UqTWF0
aC5zaW4odSpuKSxpLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1uPT09dD9N
YXRoLnNpbihuKTooci1NYXRoLmNvcyh0KSkvKHQtbiksaT1yL3UrbjtyZXR1cm4gZmEodSk8VGE/
YXI6KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9aS10O3JldHVybltNYXRoLmF0YW4yKG4s
ZSkvdSxpLUIodSkqTWF0aC5zcXJ0KG4qbitlKmUpXX0sZSl9ZnVuY3Rpb24gU3Iobix0KXtyZXR1
cm5bbixNYXRoLmxvZyhNYXRoLnRhbihDYS80K3QvMikpXX1mdW5jdGlvbiBrcihuKXt2YXIgdCxl
PXVyKG4pLHI9ZS5zY2FsZSx1PWUudHJhbnNsYXRlLGk9ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNj
YWxlPWZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/
ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgbj11LmFw
cGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxl
LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7dmFyIG89aS5hcHBseShlLGFyZ3VtZW50cyk7aWYobz09
PWUpe2lmKHQ9bnVsbD09bil7dmFyIGE9Q2EqcigpLGM9dSgpO2koW1tjWzBdLWEsY1sxXS1hXSxb
Y1swXSthLGNbMV0rYV1dKX19ZWxzZSB0JiYobz1udWxsKTtyZXR1cm4gb30sZS5jbGlwRXh0ZW50
KG51bGwpfWZ1bmN0aW9uIEVyKG4sdCl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKENhLzQrdC8y
KSksLW5dfWZ1bmN0aW9uIEFyKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIENyKG4pe3JldHVybiBu
WzFdfWZ1bmN0aW9uIE5yKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51
O3UrKyl7Zm9yKDtyPjEmJkoobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2Vbcisr
XT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24gTHIobix0KXtyZXR1cm4gblswXS10WzBd
fHxuWzFdLXRbMV19ZnVuY3Rpb24gVHIobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRb
MV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIHFyKG4sdCxlLHIpe3ZhciB1PW5b
MF0saT1lWzBdLG89dFswXS11LGE9clswXS1pLGM9blsxXSxzPWVbMV0sbD10WzFdLWMsZj1yWzFd
LXMsaD0oYSooYy1zKS1mKih1LWkpKS8oZipvLWEqbCk7cmV0dXJuW3UraCpvLGMraCpsXX1mdW5j
dGlvbiB6cihuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8
dFsxXS1lWzFdKX1mdW5jdGlvbiBScigpe3R1KHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhp
cy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBEcihuKXt2YXIgdD1ucy5wb3AoKXx8bmV3IFJyO3JldHVy
biB0LnNpdGU9bix0fWZ1bmN0aW9uIFByKG4peyRyKG4pLEdjLnJlbW92ZShuKSxucy5wdXNoKG4p
LHR1KG4pfWZ1bmN0aW9uIFVyKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUs
eTpyfSxpPW4uUCxvPW4uTixhPVtuXTtQcihuKTtmb3IodmFyIGM9aTtjLmNpcmNsZSYmZmEoZS1j
LmNpcmNsZS54KTxUYSYmZmEoci1jLmNpcmNsZS5jeSk8VGE7KWk9Yy5QLGEudW5zaGlmdChjKSxQ
cihjKSxjPWk7YS51bnNoaWZ0KGMpLCRyKGMpO2Zvcih2YXIgcz1vO3MuY2lyY2xlJiZmYShlLXMu
Y2lyY2xlLngpPFRhJiZmYShyLXMuY2lyY2xlLmN5KTxUYTspbz1zLk4sYS5wdXNoKHMpLFByKHMp
LHM9bzthLnB1c2gocyksJHIocyk7dmFyIGwsZj1hLmxlbmd0aDtmb3IobD0xO2Y+bDsrK2wpcz1h
W2xdLGM9YVtsLTFdLEtyKHMuZWRnZSxjLnNpdGUscy5zaXRlLHUpO2M9YVswXSxzPWFbZi0xXSxz
LmVkZ2U9V3IoYy5zaXRlLHMuc2l0ZSxudWxsLHUpLFZyKGMpLFZyKHMpfWZ1bmN0aW9uIGpyKG4p
e2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxvPW4ueSxhPUdjLl87YTspaWYocj1IcihhLG8pLWkscj5U
YSlhPWEuTDtlbHNle2lmKHU9aS1GcihhLG8pLCEodT5UYSkpe3I+LVRhPyh0PWEuUCxlPWEpOnU+
LVRhPyh0PWEsZT1hLk4pOnQ9ZT1hO2JyZWFrfWlmKCFhLlIpe3Q9YTticmVha31hPWEuUn12YXIg
Yz1EcihuKTtpZihHYy5pbnNlcnQodCxjKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gJHIodCksZT1E
cih0LnNpdGUpLEdjLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9V3IodC5zaXRlLGMuc2l0ZSks
VnIodCksVnIoZSksdm9pZCAwO2lmKCFlKXJldHVybiBjLmVkZ2U9V3IodC5zaXRlLGMuc2l0ZSks
dm9pZCAwOyRyKHQpLCRyKGUpO3ZhciBzPXQuc2l0ZSxsPXMueCxmPXMueSxoPW4ueC1sLGc9bi55
LWYscD1lLnNpdGUsdj1wLngtbCxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLHg9dip2
K2QqZCxNPXt4OihkKnktZyp4KS9tK2wseTooaCp4LXYqeSkvbStmfTtLcihlLmVkZ2UscyxwLE0p
LGMuZWRnZT1XcihzLG4sbnVsbCxNKSxlLmVkZ2U9V3IobixwLG51bGwsTSksVnIodCksVnIoZSl9
fWZ1bmN0aW9uIEhyKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJl
dHVybiByO3ZhciBvPW4uUDtpZighbylyZXR1cm4tMS8wO2U9by5zaXRlO3ZhciBhPWUueCxjPWUu
eSxzPWMtdDtpZighcylyZXR1cm4gYTt2YXIgbD1hLXIsZj0xL2ktMS9zLGg9bC9zO3JldHVybiBm
PygtaCtNYXRoLnNxcnQoaCpoLTIqZioobCpsLygtMipzKS1jK3MvMit1LWkvMikpKS9mK3I6KHIr
YSkvMn1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBIcihlLHQpO3ZhciBy
PW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIE9yKG4pe3RoaXMuc2l0ZT1u
LHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gSXIobil7Zm9yKHZhciB0LGUscix1LGksbyxhLGMscyxs
LGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PVdjLGQ9di5sZW5ndGg7
ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKGE9aS5lZGdlcyxjPWEubGVuZ3RoLG89
MDtjPm87KWw9YVtvXS5lbmQoKSxyPWwueCx1PWwueSxzPWFbKytvJWNdLnN0YXJ0KCksdD1zLngs
ZT1zLnksKGZhKHItdCk+VGF8fGZhKHUtZSk+VGEpJiYoYS5zcGxpY2UobywwLG5ldyBRcihHcihp
LnNpdGUsbCxmYShyLWYpPFRhJiZwLXU+VGE/e3g6Zix5OmZhKHQtZik8VGE/ZTpwfTpmYSh1LXAp
PFRhJiZoLXI+VGE/e3g6ZmEoZS1wKTxUYT90OmgseTpwfTpmYShyLWgpPFRhJiZ1LWc+VGE/e3g6
aCx5OmZhKHQtaCk8VGE/ZTpnfTpmYSh1LWcpPFRhJiZyLWY+VGE/e3g6ZmEoZS1nKTxUYT90OmYs
eTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrYyl9ZnVuY3Rpb24gWXIobix0KXtyZXR1cm4gdC5h
bmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFpyKCl7dHUodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFy
Yz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFZyKG4pe3ZhciB0PW4uUCxlPW4uTjtp
Zih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBvPXUu
eCxhPXUueSxjPXIueC1vLHM9ci55LWEsbD1pLngtbyxmPWkueS1hLGg9MiooYypmLXMqbCk7aWYo
IShoPj0tcWEpKXt2YXIgZz1jKmMrcypzLHA9bCpsK2YqZix2PShmKmctcypwKS9oLGQ9KGMqcC1s
KmcpL2gsZj1kK2EsbT10cy5wb3AoKXx8bmV3IFpyO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrbyxt
Lnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGws
eD1RYy5fO3g7KWlmKG0ueTx4Lnl8fG0ueT09PXgueSYmbS54PD14Lngpe2lmKCF4Lkwpe3k9eC5Q
O2JyZWFrfXg9eC5MfWVsc2V7aWYoIXguUil7eT14O2JyZWFrfXg9eC5SfVFjLmluc2VydCh5LG0p
LHl8fChLYz1tKX19fX1mdW5jdGlvbiAkcihuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwoS2M9
dC5OKSxRYy5yZW1vdmUodCksdHMucHVzaCh0KSx0dSh0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlv
biBYcihuKXtmb3IodmFyIHQsZT1KYyxyPUZlKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1b
MV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFCcih0LG4pfHwhcih0KXx8ZmEodC5hLngtdC5i
LngpPFRhJiZmYSh0LmEueS10LmIueSk8VGEpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkp
fWZ1bmN0aW9uIEJyKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxv
PXRbMF1bMF0sYT10WzFdWzBdLGM9dFswXVsxXSxzPXRbMV1bMV0sbD1uLmwsZj1uLnIsaD1sLngs
Zz1sLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYobz5kfHxk
Pj1hKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49cylyZXR1cm59ZWxzZSBpPXt4OmQseTpj
fTtlPXt4OmQseTpzfX1lbHNle2lmKGkpe2lmKGkueTxjKXJldHVybn1lbHNlIGk9e3g6ZCx5OnN9
O2U9e3g6ZCx5OmN9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYo
aD5wKXtpZihpKXtpZihpLnk+PXMpcmV0dXJufWVsc2UgaT17eDooYy11KS9yLHk6Y307ZT17eDoo
cy11KS9yLHk6c319ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OihzLXUpL3Is
eTpzfTtlPXt4OihjLXUpL3IseTpjfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1hKXJldHVy
bn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19ZWxzZXtpZihpKXtpZihpLng8
bylyZXR1cm59ZWxzZSBpPXt4OmEseTpyKmErdX07ZT17eDpvLHk6cipvK3V9fXJldHVybiBuLmE9
aSxuLmI9ZSwhMH1mdW5jdGlvbiBKcihuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlz
LmI9bnVsbH1mdW5jdGlvbiBXcihuLHQsZSxyKXt2YXIgdT1uZXcgSnIobix0KTtyZXR1cm4gSmMu
cHVzaCh1KSxlJiZLcih1LG4sdCxlKSxyJiZLcih1LHQsbixyKSxXY1tuLmldLmVkZ2VzLnB1c2go
bmV3IFFyKHUsbix0KSksV2NbdC5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LHQsbikpLHV9ZnVuY3Rp
b24gR3Iobix0LGUpe3ZhciByPW5ldyBKcihuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxKYy5w
dXNoKHIpLHJ9ZnVuY3Rpb24gS3Iobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9
cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIFFyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7
dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxl
LngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIu
eC11LngsdS55LXIueSl9ZnVuY3Rpb24gbnUoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiB0dShuKXtu
LlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIGV1KG4sdCl7dmFyIGU9dCxyPXQu
Uix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxl
LlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBydShuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7
dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5M
LlU9ZSksci5SPWV9ZnVuY3Rpb24gdXUobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0
aW9uIGl1KG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KG91KS5wb3AoKTtmb3IoSmM9W10sV2M9bmV3
IEFycmF5KG4ubGVuZ3RoKSxHYz1uZXcgbnUsUWM9bmV3IG51OzspaWYodT1LYyxpJiYoIXV8fGku
eTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoV2NbaS5pXT1u
ZXcgT3IoaSksanIoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO1Vy
KHUuYXJjKX10JiYoWHIodCksSXIodCkpO3ZhciBvPXtjZWxsczpXYyxlZGdlczpKY307cmV0dXJu
IEdjPVFjPUpjPVdjPW51bGwsb31mdW5jdGlvbiBvdShuLHQpe3JldHVybiB0Lnktbi55fHx0Lngt
bi54fWZ1bmN0aW9uIGF1KG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54
KSooZS55LW4ueSl9ZnVuY3Rpb24gY3Uobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBzdShuKXtyZXR1
cm4gbi55fWZ1bmN0aW9uIGx1KCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4
Om51bGwseTpudWxsfX1mdW5jdGlvbiBmdShuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7
dmFyIG89LjUqKGUrdSksYT0uNSoocitpKSxjPXQubm9kZXM7Y1swXSYmZnUobixjWzBdLGUscixv
LGEpLGNbMV0mJmZ1KG4sY1sxXSxvLHIsdSxhKSxjWzJdJiZmdShuLGNbMl0sZSxhLG8saSksY1sz
XSYmZnUobixjWzNdLG8sYSx1LGkpfX1mdW5jdGlvbiBodShuLHQpe249R28ucmdiKG4pLHQ9R28u
cmdiKHQpO3ZhciBlPW4ucixyPW4uZyx1PW4uYixpPXQuci1lLG89dC5nLXIsYT10LmItdTtyZXR1
cm4gZnVuY3Rpb24obil7cmV0dXJuIiMiK010KE1hdGgucm91bmQoZStpKm4pKStNdChNYXRoLnJv
dW5kKHIrbypuKSkrTXQoTWF0aC5yb3VuZCh1K2EqbikpfX1mdW5jdGlvbiBndShuLHQpe3ZhciBl
LHI9e30sdT17fTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPWR1KG5bZV0sdFtlXSk6dVtlXT1uW2Vd
O2ZvcihlIGluIHQpZSBpbiBufHwodVtlXT10W2VdKTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGUg
aW4gcil1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIHB1KG4sdCl7cmV0dXJuIHQtPW49
K24sZnVuY3Rpb24oZSl7cmV0dXJuIG4rdCplfX1mdW5jdGlvbiB2dShuLHQpe3ZhciBlLHIsdSxp
PXJzLmxhc3RJbmRleD11cy5sYXN0SW5kZXg9MCxvPS0xLGE9W10sYz1bXTtmb3Iobis9IiIsdCs9
IiI7KGU9cnMuZXhlYyhuKSkmJihyPXVzLmV4ZWModCkpOykodT1yLmluZGV4KT5pJiYodT10LnN1
YnN0cmluZyhpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9h
W29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6cHUoZSxyKX0p
KSxpPXVzLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zdWJzdHJpbmcoaSksYVtv
XT9hW29dKz11OmFbKytvXT11KSxhLmxlbmd0aDwyP2NbMF0/KHQ9Y1swXS54LGZ1bmN0aW9uKG4p
e3JldHVybiB0KG4pKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gdH06KHQ9Yy5sZW5ndGgsZnVuY3Rp
b24obil7Zm9yKHZhciBlLHI9MDt0PnI7KytyKWFbKGU9Y1tyXSkuaV09ZS54KG4pO3JldHVybiBh
LmpvaW4oIiIpfSl9ZnVuY3Rpb24gZHUobix0KXtmb3IodmFyIGUscj1Hby5pbnRlcnBvbGF0b3Jz
Lmxlbmd0aDstLXI+PTAmJiEoZT1Hby5pbnRlcnBvbGF0b3JzW3JdKG4sdCkpOyk7cmV0dXJuIGV9
ZnVuY3Rpb24gbXUobix0KXt2YXIgZSxyPVtdLHU9W10saT1uLmxlbmd0aCxvPXQubGVuZ3RoLGE9
TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpO2ZvcihlPTA7YT5lOysrZSlyLnB1c2goZHUobltl
XSx0W2VdKSk7Zm9yKDtpPmU7KytlKXVbZV09bltlXTtmb3IoO28+ZTsrK2UpdVtlXT10W2VdO3Jl
dHVybiBmdW5jdGlvbihuKXtmb3IoZT0wO2E+ZTsrK2UpdVtlXT1yW2VdKG4pO3JldHVybiB1fX1m
dW5jdGlvbiB5dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+PXQ/MDp0Pj0xPzE6bih0
KX19ZnVuY3Rpb24geHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLW4oMS10KX19ZnVu
Y3Rpb24gTXUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybi41KiguNT50P24oMip0KToyLW4o
Mi0yKnQpKX19ZnVuY3Rpb24gX3Uobil7cmV0dXJuIG4qbn1mdW5jdGlvbiBidShuKXtyZXR1cm4g
bipuKm59ZnVuY3Rpb24gd3Uobil7aWYoMD49bilyZXR1cm4gMDtpZihuPj0xKXJldHVybiAxO3Zh
ciB0PW4qbixlPXQqbjtyZXR1cm4gNCooLjU+bj9lOjMqKG4tdCkrZS0uNzUpfWZ1bmN0aW9uIFN1
KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24ga3Uo
bil7cmV0dXJuIDEtTWF0aC5jb3MobipMYSl9ZnVuY3Rpb24gRXUobil7cmV0dXJuIE1hdGgucG93
KDIsMTAqKG4tMSkpfWZ1bmN0aW9uIEF1KG4pe3JldHVybiAxLU1hdGguc3FydCgxLW4qbil9ZnVu
Y3Rpb24gQ3Uobix0KXt2YXIgZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD0uNDUpLGFy
Z3VtZW50cy5sZW5ndGg/ZT10L05hKk1hdGguYXNpbigxL24pOihuPTEsZT10LzQpLGZ1bmN0aW9u
KHIpe3JldHVybiAxK24qTWF0aC5wb3coMiwtMTAqcikqTWF0aC5zaW4oKHItZSkqTmEvdCl9fWZ1
bmN0aW9uIE51KG4pe3JldHVybiBufHwobj0xLjcwMTU4KSxmdW5jdGlvbih0KXtyZXR1cm4gdCp0
KigobisxKSp0LW4pfX1mdW5jdGlvbiBMdShuKXtyZXR1cm4gMS8yLjc1Pm4/Ny41NjI1Km4qbjoy
LzIuNzU+bj83LjU2MjUqKG4tPTEuNS8yLjc1KSpuKy43NToyLjUvMi43NT5uPzcuNTYyNSoobi09
Mi4yNS8yLjc1KSpuKy45Mzc1OjcuNTYyNSoobi09Mi42MjUvMi43NSkqbisuOTg0Mzc1fWZ1bmN0
aW9uIFR1KG4sdCl7bj1Hby5oY2wobiksdD1Hby5oY2wodCk7dmFyIGU9bi5oLHI9bi5jLHU9bi5s
LGk9dC5oLWUsbz10LmMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIp
P3QuYzpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgw
PmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBjdChlK2kqbixyK28qbix1K2EqbikrIiJ9
fWZ1bmN0aW9uIHF1KG4sdCl7bj1Hby5oc2wobiksdD1Hby5oc2wodCk7dmFyIGU9bi5oLHI9bi5z
LHU9bi5sLGk9dC5oLWUsbz10LnMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlz
TmFOKHIpP3QuczpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2
MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBpdChlK2kqbixyK28qbix1K2Eq
bikrIiJ9fWZ1bmN0aW9uIHp1KG4sdCl7bj1Hby5sYWIobiksdD1Hby5sYWIodCk7dmFyIGU9bi5s
LHI9bi5hLHU9bi5iLGk9dC5sLWUsbz10LmEtcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXty
ZXR1cm4gZnQoZStpKm4scitvKm4sdSthKm4pKyIifX1mdW5jdGlvbiBSdShuLHQpe3JldHVybiB0
LT1uLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKG4rdCplKX19ZnVuY3Rpb24gRHUobil7
dmFyIHQ9W24uYSxuLmJdLGU9W24uYyxuLmRdLHI9VXUodCksdT1QdSh0LGUpLGk9VXUoanUoZSx0
LC11KSl8fDA7dFswXSplWzFdPGVbMF0qdFsxXSYmKHRbMF0qPS0xLHRbMV0qPS0xLHIqPS0xLHUq
PS0xKSx0aGlzLnJvdGF0ZT0ocj9NYXRoLmF0YW4yKHRbMV0sdFswXSk6TWF0aC5hdGFuMigtZVsw
XSxlWzFdKSkqUmEsdGhpcy50cmFuc2xhdGU9W24uZSxuLmZdLHRoaXMuc2NhbGU9W3IsaV0sdGhp
cy5za2V3PWk/TWF0aC5hdGFuMih1LGkpKlJhOjB9ZnVuY3Rpb24gUHUobix0KXtyZXR1cm4gblsw
XSp0WzBdK25bMV0qdFsxXX1mdW5jdGlvbiBVdShuKXt2YXIgdD1NYXRoLnNxcnQoUHUobixuKSk7
cmV0dXJuIHQmJihuWzBdLz10LG5bMV0vPXQpLHR9ZnVuY3Rpb24ganUobix0LGUpe3JldHVybiBu
WzBdKz1lKnRbMF0sblsxXSs9ZSp0WzFdLG59ZnVuY3Rpb24gSHUobix0KXt2YXIgZSxyPVtdLHU9
W10saT1Hby50cmFuc2Zvcm0obiksbz1Hby50cmFuc2Zvcm0odCksYT1pLnRyYW5zbGF0ZSxjPW8u
dHJhbnNsYXRlLHM9aS5yb3RhdGUsbD1vLnJvdGF0ZSxmPWkuc2tldyxoPW8uc2tldyxnPWkuc2Nh
bGUscD1vLnNjYWxlO3JldHVybiBhWzBdIT1jWzBdfHxhWzFdIT1jWzFdPyhyLnB1c2goInRyYW5z
bGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6MSx4OnB1KGFbMF0sY1swXSl9LHtp
OjMseDpwdShhWzFdLGNbMV0pfSkpOmNbMF18fGNbMV0/ci5wdXNoKCJ0cmFuc2xhdGUoIitjKyIp
Iik6ci5wdXNoKCIiKSxzIT1sPyhzLWw+MTgwP2wrPTM2MDpsLXM+MTgwJiYocys9MzYwKSx1LnB1
c2goe2k6ci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiLG51bGwsIikiKS0yLHg6cHUocyxsKX0pKTps
JiZyLnB1c2goci5wb3AoKSsicm90YXRlKCIrbCsiKSIpLGYhPWg/dS5wdXNoKHtpOnIucHVzaChy
LnBvcCgpKyJza2V3WCgiLG51bGwsIikiKS0yLHg6cHUoZixoKX0pOmgmJnIucHVzaChyLnBvcCgp
KyJza2V3WCgiK2grIikiKSxnWzBdIT1wWzBdfHxnWzFdIT1wWzFdPyhlPXIucHVzaChyLnBvcCgp
KyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6ZS00LHg6cHUoZ1swXSxwWzBd
KX0se2k6ZS0yLHg6cHUoZ1sxXSxwWzFdKX0pKTooMSE9cFswXXx8MSE9cFsxXSkmJnIucHVzaChy
LnBvcCgpKyJzY2FsZSgiK3ArIikiKSxlPXUubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxp
PS0xOysraTxlOylyWyh0PXVbaV0pLmldPXQueChuKTtyZXR1cm4gci5qb2luKCIiKX19ZnVuY3Rp
b24gRnUobix0KXtyZXR1cm4gdD10LShuPStuKT8xLyh0LW4pOjAsZnVuY3Rpb24oZSl7cmV0dXJu
KGUtbikqdH19ZnVuY3Rpb24gT3Uobix0KXtyZXR1cm4gdD10LShuPStuKT8xLyh0LW4pOjAsZnVu
Y3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSwoZS1uKSp0KSl9fWZ1bmN0aW9u
IEl1KG4pe2Zvcih2YXIgdD1uLnNvdXJjZSxlPW4udGFyZ2V0LHI9WnUodCxlKSx1PVt0XTt0IT09
cjspdD10LnBhcmVudCx1LnB1c2godCk7Zm9yKHZhciBpPXUubGVuZ3RoO2UhPT1yOyl1LnNwbGlj
ZShpLDAsZSksZT1lLnBhcmVudDtyZXR1cm4gdX1mdW5jdGlvbiBZdShuKXtmb3IodmFyIHQ9W10s
ZT1uLnBhcmVudDtudWxsIT1lOyl0LnB1c2gobiksbj1lLGU9ZS5wYXJlbnQ7cmV0dXJuIHQucHVz
aChuKSx0fWZ1bmN0aW9uIFp1KG4sdCl7aWYobj09PXQpcmV0dXJuIG47Zm9yKHZhciBlPVl1KG4p
LHI9WXUodCksdT1lLnBvcCgpLGk9ci5wb3AoKSxvPW51bGw7dT09PWk7KW89dSx1PWUucG9wKCks
aT1yLnBvcCgpO3JldHVybiBvfWZ1bmN0aW9uIFZ1KG4pe24uZml4ZWR8PTJ9ZnVuY3Rpb24gJHUo
bil7bi5maXhlZCY9LTd9ZnVuY3Rpb24gWHUobil7bi5maXhlZHw9NCxuLnB4PW4ueCxuLnB5PW4u
eX1mdW5jdGlvbiBCdShuKXtuLmZpeGVkJj0tNX1mdW5jdGlvbiBKdShuLHQsZSl7dmFyIHI9MCx1
PTA7aWYobi5jaGFyZ2U9MCwhbi5sZWFmKWZvcih2YXIgaSxvPW4ubm9kZXMsYT1vLmxlbmd0aCxj
PS0xOysrYzxhOylpPW9bY10sbnVsbCE9aSYmKEp1KGksdCxlKSxuLmNoYXJnZSs9aS5jaGFyZ2Us
cis9aS5jaGFyZ2UqaS5jeCx1Kz1pLmNoYXJnZSppLmN5KTtpZihuLnBvaW50KXtuLmxlYWZ8fChu
LnBvaW50LngrPU1hdGgucmFuZG9tKCktLjUsbi5wb2ludC55Kz1NYXRoLnJhbmRvbSgpLS41KTt2
YXIgcz10KmVbbi5wb2ludC5pbmRleF07bi5jaGFyZ2UrPW4ucG9pbnRDaGFyZ2U9cyxyKz1zKm4u
cG9pbnQueCx1Kz1zKm4ucG9pbnQueX1uLmN4PXIvbi5jaGFyZ2Usbi5jeT11L24uY2hhcmdlfWZ1
bmN0aW9uIFd1KG4sdCl7cmV0dXJuIEdvLnJlYmluZChuLHQsInNvcnQiLCJjaGlsZHJlbiIsInZh
bHVlIiksbi5ub2Rlcz1uLG4ubGlua3M9bmksbn1mdW5jdGlvbiBHdShuKXtyZXR1cm4gbi5jaGls
ZHJlbn1mdW5jdGlvbiBLdShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBRdShuLHQpe3JldHVy
biB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gbmkobil7cmV0dXJuIEdvLm1lcmdlKG4ubWFwKGZ1
bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntz
b3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiB0aShuKXtyZXR1cm4gbi54fWZ1bmN0aW9u
IGVpKG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gcmkobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlv
biB1aShuKXtyZXR1cm4gR28ucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIGlpKG4pe2Zvcih2YXIg
dD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBv
aShuKXtmb3IodmFyIHQsZT0xLHI9MCx1PW5bMF1bMV0saT1uLmxlbmd0aDtpPmU7KytlKSh0PW5b
ZV1bMV0pPnUmJihyPWUsdT10KTtyZXR1cm4gcn1mdW5jdGlvbiBhaShuKXtyZXR1cm4gbi5yZWR1
Y2UoY2ksMCl9ZnVuY3Rpb24gY2kobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIHNpKG4sdCl7
cmV0dXJuIGxpKG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVu