Add Symfony Deprecation Contracts package

- Created CHANGELOG.md to maintain version history.
- Added README.md with usage instructions for the trigger_deprecation() function.
- Initialized composer.json for the Symfony Deprecation Contracts library, specifying dependencies and autoloading.
This commit is contained in:
2025-12-15 08:43:18 +01:00
parent 0eedc919db
commit 778ee26fe4
643 changed files with 113899 additions and 109267 deletions

View File

@@ -1,92 +1,22 @@
<?php //ICB0 74:0 81:91d 82:118a ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
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
=
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=
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
hV1jT/u=
<?php
namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider\Exception;
use Exception;
class EncryptionConfigurationException extends Exception
{
/**
* Returns properly formatted exception when response decryption fails.
*
* @return \PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider\Exception\EncryptionConfigurationException
*/
public static function undeterminedEncryption()
{
return new static(
'The given response may be encrypted and sufficient '.
'encryption configuration has not been provided.',
400
);
}
}

View File

@@ -1,465 +1,391 @@
<?php //ICB0 74:0 81:2f3b 82:5ce4 ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
HR+cPvMzklJJFn/x3s8lroPy2D6ZiaMhiv0tuF8do15jog2GvaPtwGLGkBAuWpcVpwAuCDF/DrJ8
+B9nf9R1l2IQtsvgIWAWHlcoU4QYG9XOkaL3fmosKhD43GurBkxBIwjA7Q0tkEZZ6U5XqZs7YDOo
a4qSMAOjCTPCA1I5g1DXzoKvWxdjg7sJdyAbkwgaXe/KjLIcI+9/JU+7L8s3YJTAvULB52Ef29tT
rpbz/WziGwEi/9z42QBO1anknPDeWAF1cGBcEy9MMHRxXhycK8DOblo+annCoc8nqSTpmbPi8bnP
g/MFYsstzBb5KMjMqd9OopJph6hMs+sLn56HBDldttQRFyl5yOL2YnM2qwj8kzu005h+xfIfvQKq
PjWKVQZbQKPwLkDmoQuIXr88uorWmYI/4TxLlD9E+z+E6gKo/zj/Ovr59Ra31WTueNN/fRU6lZ44
6Us5VCo0JwBJOZqfUg5rkzeBeVo3mGcBpVX0FtV+0uRO4+bQh4ggv4nAATv4zzNJdjTFGFsjxlWg
KBDF+FBj1yiFw4/XADgOLmkZvq8sIkn01blI15qLiYlpIsrHR0ckymi4GLgexKFBzqeNSYSWlAjp
ERAAgyPxQXxaaL31EC+8woyedYVXtR9tfjFwvstrmRJvs7F/+HusXY4pkUzwPYPEfvW4A2tWBbbU
RV7O6gYk/1hRsxUFprvZPl5QAACG4UmFh6y6ijfzRaPrZS4YJrRnfzzjgC6US9vRVgWEq1L7PhU8
M3SP7iUbHNQkT7gK1IToZQRtS6MWIZh89RvyIE7bbl/aOQJeQBNsoPkG76KaX0kwWHwKbGnOB+Pq
PoBgXx4vPSzFq/e166HL+muSy6unSkNGYliun7GR1xxCzgYkg3zCYG6pvaro7Ugg+YITx6UcFO9y
5wix/jZZSLDHaNsrxHeEA9lIBAv6CoI8dzvuDGFsQD51Qc8U89go9vkegvTptMKKGzkW+YqPUz7F
WP+/tfLEQnA0kCQFRm2eIkri+SyvzrMM39Ogq+b1Ekh3Bea/rFQua7EEwUs7o0Zsp41Bj2zdcEeD
wWXIMVJa8WIT6VZE7aevMZYAGsSlBFBkjBGEt84Xrci0MJ8IzmJRahjS3yN3L1vONZquvZTh/wqU
vznC2pHrisNl50r6ROt8vREVnVCY82u4AsykK9u8L2f8+hXOWkRel0bz5SyFGpAYEIfm5TOJcfNM
rq6FnN2wVmqASC9T7hqjlEi69YWLoHtb8SzHBJ1jDld8ahZNn7ymtgse9BFeS6N7lbrA4j4i8yRx
S2QphHwDm+Z/N8V6d+ux8YQNpFeOdtcQGGi+2PFqScwhAgVlduokNqJytEZIzdDu44bwhp2Cd9ab
jN+PfXA3CRaXwhFEnDi1CeuG8fhmCsH/XTNGtRsXrYZX/gK4HaNU4NYq7j1zzLDpmos+U6kyfcnI
Lv5gIJNxtMhEnuPChuxv6L1fp9780WtueJfK+KAI2YCiMDUgzbI5SLp4Iax+D30BRYB527gL8+3n
8tfzFeyxfP9BBbA0mV0Gfq/vUlVJTzc9taLL/BGq38AcNNPKq8AoJTE31+coHwe+InC5+2Cjcau1
gjHXPRC9DEv3ddl2SUEotXEh8iStTJRRCizv37JxFxN6gjZFJV3itEFBQ57Ycc8uc47CbJEbzkhG
/Qaha396VMWG2Q91mZiSmBKF7Qih5lOdhQLZNn5up3z469NMoTvE9pKcDivRlILnCsjheT1MMs57
dAS+EZ7mdRZ2bxwaNzJBj03ukAdoc2QbwdwOt4CAk9a4GSM0OBPoRs6BtJDZnlSN+ZvDvXTPinky
QvrUsrs5HYHU9j5T2t9Hw24YRWn2jbl++XjChjLFJU3R77SF5epoWmvBNp//cXWo3MenZi3BS5kb
5fBu668CJZ8jKT3wxXF+0tXCnRriRV9v9DPgZ8HJBz3U/BYQ9Sf7Fi2VXkDvhBWinajc8rPg5p6B
bfNoqpHN+ygUkcojDIR4JQlIb0vnKqMoE4VqYcDs8OAeOuCs/OC1iLaCBPaPYmLm8I5fXg3SkpyA
cvJBRt3iD9oIZKUeIZVZL/18rERyB6b7cv3aKZy6cK78Nqn46bdRKgf/iiIBjg0TzzY19hYts4DW
MQ7tfp/4E8VVkB9zNRPeMwF1ud5rPcery7FuG9xt2n3ICAn4ikYOfsIxP0sOimignrRIez3G5LB4
jztVEPukRQwShL8xvqmJ3vnPJ8c4DB+3NjqtQoqCBqJpTYqSCTvbtwSV7xbYEQ4vEiAtwOyWBMcu
BUxlFHKNT26yfq8BAD3ysuIdaKRWqqiVPlh2ZuViMgjEJVr99bqGTSzJwpl74J4WZRPktqgCRfnl
gr9kB/CU75Z1C9BkvjCUPpjY/+l8DxI1oUwePHs3ker/rr1t98YYvHCeOl248rXC6et2U1ikNm8j
81PASmCNG7hpDYAo22/SBYxImtvAZ12H5lHPRrIvAE4AQ2PNvxhsERpbsP2Ffi94uCy6ilSCE1Jl
3LUH9fXU5cUMd0V/jrVhZ3B+dl6/gVxHiZ/u5QLc6jjfO0L9iUotWZfY4xKdkGjXCW2MUbgPTkQx
agaA/fA/69+16pcyNtINidBFgwsGDHb2M8EHSUpvLgq7JVUqDFbCdgfZ7IQ6pwp0IuyvNCdjEN9f
OD3l/MaScV5dWu+TlROtbFFeb0QgNHfz2pJy9nka7avgaTXX4XEKDgYVNoYBUBSOi0I5gqVgBFpX
2Pz6ZTOPPuj0wzJTQe63CZH+9CrClk7mbLrKL5g+/dGCi9sbZj3aTPyza+KEZ99o/VeiGdYvzbpw
vyjdJ2gDVl28OPjIRhnv2MyJ1BKSkvHcMIKE5Mer9wpCN0UQeMqJ8t2cM+K9QMOZtY2QHzcMGF7S
p8pnSHAe0PJ4Ro6IBFPMAjGbtH3zZfco2roXmFfqzbbRcjsBWizL/7oy2y+5kOhGj+0/CUWf78Xk
P63FzuhWEkRorjSaWeXxX4nrYJDLhT/6Bs8Q+xmI/g6r1VYBEAw3W+jM0sAbZfPWSYr1NgPsRG0q
+40B0YOKjP4DzFWH3w+LdSRgPY1s4G1E/Ei/jBSmnCit5I+IdzEIzmPJo/2bWyBP0igBeRd/rVkx
cZ6ylG0HIOWR3t3ywQnfsB1v7B9vE33gwhKJ84gRSzUC2mxCvrhqQy9vX8BEsrieeIMdiPTcl+gS
/MlRD0g6Vhgj5ik6d7q8FrcHEzzObs0orB7ayvNii46YMiQrnvBsDIKoxrza5S3DG2WYYUwj33eE
NSiDb4PtE60B0z5U7wcBSyScBdEeYbAYn20flBfRyxlGQywOzncbh/ezTRmLEOIL8kaV7QkgTJNi
lcHDbdOjLl7EKsHSkqO1jfXQk59yj0QvJl6KIE3YlTIjQVfY+ZX+H3sFu84HZ/fv9t5bsd3bh9bF
HEou/OKx9m+3kxpxTNXYgmSPxv8J5EH3BlzjrHZzsUhvbF+PNsJcGhEDH9/59oVkikKJA/+ob3qQ
u2iJJYjMTrCPajybAhPPSv/P8Gnkox9cIM2WOEjrPtrWk/TJgDBK0fEOsxWX4Knw+F8CaDf9Bp7/
N5JE2IhMay5PqYcIQJfjs3rbfKzomqDFiyDbLy3u52OMqYRDkV01sEmGRGhF8CyCqgzL7s/6FwtI
LRxqrzSZxtIBzuwf6cXT7D50Tq6G2A9BoWNRsetZ0/frqUcDfL3jmtRSUW7rqa+Eo40pNc2fHFN1
UAYw2sG777fc85FZ1LGcD5lqNC9VUHl/oh3xH0kbZ+vFtuGK7CxB46Nul/CwenRKkh9Vg5qS1hp4
Nal4Gi6Myg0lKqGlVhb/7WK7x+MZG1jFHsXqzuwpLmB5Jv0sT1sLYw253bpMCd2Tv6bfjG8Ezqjy
XyqFf7vN/42LGgMRCNV5n5vj1tfFp489NbHbJ3LbuqIPmJwczh/nQkIErayc/rA9JEnMerdUrjwt
bJ6kVU58UlRbSSVtMuza37f0mAzyzuR3GeoU2LcJoW4ab1dtfgwp2wwcBYHSPsMia5idkdVnnyBX
i5w3PSmsgC9DmR+knRLyKiYA9F3VyvknQaoOr8GpAQ7lwPkHpU8KnO0Dwu5zdGt2ZAj3GQy7lol7
lAQFyybxHc++YzxEH98i1ijwA/VzwybjbX0Ej6+m95UMTfsXKSKItHLB+/WBgBY8r1dAn5C8WVmb
1Dcm17uCs25PG50YNP43KOBUu1H9PS24bnVwfYerghC9DI1xCdRHzIURzp1Q3C1wFXAGCwzrZW5T
Vd1a5xOY/qBqK8KDvgtIxRvz7eUeVT5d4PwGvTNNMG84dMgepo98RCOYuSuY0dn/pA8e4jjP6Igs
Q2tO0QB1QyQe5763sNpN5IIWZt8/LDxoU8VaMHDSi5XcG4GnfMkuP5ar0x2dcKZpe5PJHRErtG9p
Mez4LGJc0Id8ofGHXXL4pOx5Cv7unsKeSQ59SbNdCHdVn6NQgUSzFxMWW17i1Hacyfex/kXFFnXj
4KFeIDRsW1QkKYTJwI6woNrv2SIkKtyec0hcUamikFJ9LMi+6rkUKlIXJNGeKS3UK0zUvRWO5t/c
81eH5ygtPTrTUZtQGZgrArsipNBCSwtB9+sgY+IHSMcsAZh/Cq32aMF9aDaOVBvWCCWeLmTBoD/T
09zVvrs0orl/Mp9zh1focLvoSMRHHMqCmH9jsjp2OUjDm/LwkPO/bLDfC/MU0i6ueAL7K7Cd3ty/
hmPcow/koaJ6CElbmMFAxLNvhKZ5mXb0BhlYaTi8yTfBNjaTC6XmZXM3j9yXPtZvOUe/7PZLIGK4
OVkvR3HbgFJl9ICwiGRt/TuQ9qqpYU3R5rsYI4dFA/4otcdW7Zgq+yKGTfYtlEmLcLK+54O59MVB
1D6/6QhjDanRDEVfm90wYWHGLRUeVbQmr6NGJnXEBFN78ut5w9wk4XOpi+a0/bSrpJ35Z2S+RHWN
uSw075aBTnHg+5C6inCEx7BMzTKZWzoX/dsYsPSl4kfb8jOlfSZ8Zc51VBtyrQgbWxHvkz8XmgpM
Ou9Q6O+Mf5qD/dWH7E9On9tugPWk4wY0R0Nwian5FhrlR+6scj8hRW1QmWjORQm9CRhjUfqo71wA
3zH+MTk3gLepb/RElIkqk3fYI53kK+M5rPSczzSXXk0B3A1OqRfH9Ug4/Q//1Hnz15L0H0CE7sdf
C01yJz9eP5XCmCi9lgXGL7GAvv8KJcOFf2zulPa7agyAArGcG9+RrzKCbOUHrtVm+kxnZ1njIK6L
mNcvlmW2oz8MMAju+09I53IE0ORr6ns7E8fnZONdqUXkhP9hQ9Osc1HdbCRPUdmgP4srn+O1wJhS
LvOJ3xfXSV7J3iFXuIdc3S8kermC8A5HYuPasftXLBS9+Gt/FfuLAYg7iWrox/31spJQ1t1AKWMm
hFBphgbnp70GMB//d35zfATpmNrKpnn3OmLRNxmeXftttJ4FioVmkEgS2umK82/hhVNE+MUMKnVM
18A4jjKA+aHSVqFKUrhQ1HyfNYUGbjifPe3DN+VWQmTijJyjhmYv22MVmsW8gj4vjM6eluC/reCO
6fQUKD8F512auBvOZ60xBw4hyS9iUy8HovnF4N+mvlMLpFumGSoIH6RGU7es9GRBo8+TaleGAiMd
ahlyIKM/kuZ1dpDNamN/rDmD8kpHB2SMZznnOaWejHAxt30TbMuHkgalukzLb8f4rgNvasyIixae
UM4RD0+gRjXseO1rNpySNXOACmUmVfrCOrHOCdi9SiU4FgIJdoxKAzZqEbWCL+KN3IzLmi2mnvv3
3IgFDg364XwN7vmiN8EW1wdg23jbRXzM3cYuZf6ilshJ2caB8QTlb8DBQFsEV0ogh4r5/vdfhyWE
RpPOFd6eggi8YgHxAZ/rnn+Qko+nRcalB6mt4FnGHKifrfGUqriFavCKqDFwHHNGguhPrCBOXplc
hrAddYgPcWEe57vjWBwgXDrOIaaZiH0Ui/gzptnOYDWn4/48XpBTeXQwKly8MUdGDAEuZPKOOZew
l4GnsfHGLUV3Ps7EcACIHBpKKzuGyyTbD47Rv/JfkptAJVchHpKAHHVq0EwRLBQn+F5zwGYMknNj
HIsXyx6T8DQUTRU6kfLAWpAFXXbBJMtO6HzqkFZExgF9Ji9r/mYZyUvryE5BG6Hr/qsfz+zCAeSd
YGLNMhau7SqNJMoWzZ9tfj51QFciKb5SDFA7jbXmVYrYXcDTkK/Zimx7D8gfMquDYva9KApXJHrd
kcnuO/7GHuE4Br1EVNX7/pK9VXN0pghy/7dDTFsjOL2DWF/lnFDGyv4u1oCplO8VZ92efM8S5RSG
UeBBRto8H4HwhL7ZLOOJPhRuovVAkijbhTjpvzPiau5+SYGZfwTU28RBBxdr12fEmFunUvphVPBB
wM6i/KkAXN1JtXbYaLmw9FY84FsewPrd43c3vvJX9jStKXV0Hmx4Q0wso6rAcxOtrHpl39MP9Ttq
NreAcPD18vXiI7NxbE3qy8L/J/RVHdjVEZXfl7jXWiwMJTVaTtia5rrTVzAoumARXAD/sx70OOTv
AMEfj6FBW2FCgNLyUg6HA4fD/emYUv0LWSO9AXkVgYz9UsvpgCNIFivj3jOBIT1U11GHoLCkEbMl
pQ6qcNgotL5FG+7fsqI3tZh0xF+R//gWCLKFzz6eTn4mwxeJPBMW2tjeU+++B6sGwmU3+763+/T4
BQRx+aIy8iyBWmCg1JDHq+6uNxtpVwAoG6PurE1X27PTEIHYNshpXOzpt7C5VmcqvVfe3NvnNcwr
wccwib8QXSx1POZG/pASSAuHyUB9Klk0v9PV4Ymx8Et+RVCNo7hbDfZzaElEtUu+/iVQeT+uis1c
tp2jE8q6bxWAdKUlHRKl+qosHglPZOnIRYykI9BKTcsUvxHq3JwxpRwrzunWAC889p2QHXiTc6WL
IEZ8u7cOPGj2yryEIiIW+nxgW92RZveGTPyvRyRmHr8SjbPBwj7QI+knYPGCbt0ce3J33uXIwfqU
t+SebYryyYcV5sj2bWjot9HsR85oKDvavbEiNAotCc3GeO35ptYF6xh1NvRPB0Ci4fdatZWEB/gF
AmIuyaje0Djfu3EqkQVhAPFBMYIzKHBk2GOidrUeQbFx0AM7qfvyLjo2jF5rM1C/eXYylG7L8r7v
E+MMO39EZaCQLiD2fkxLYB1A+lCKgaaPzK8G/WDSVAqUU185sCUA1eeIee2saE2hb8B2ORDkJ+HN
bFCAdsFpEdBpKNzDozSsQpKYg8JCvm2QY55wvNipMiZakSJKyBJJPJSJsKmIIkB3H/kdZj2x1mET
1n4clOieZRM/BSsiO75axlMGns8WRMJkCig0BMHJtf6ee9AUZYlynCpvQV8bsRqbImw1DS8r/s37
KTpOWfoJOltLBpg9YpCop7i6zapTtSjpvUPo4YStTLq7ixZBfrezwABnl1N3H53vVW95o0aEwSu5
cY5wKRVpx7THCijWTp6S8lGwCeDmgXBIM+LqnHqo7QtHJXYQtoqKGMIIxxxlmoKk9/rFt/C7t0NI
bBGhIkhvXGRfZMQ1jP3xVaCU4jiLnu9eCrFTEvZt+cfsrbmrgzxpAc4bNS8qsJ5oUTw0PsRAiukm
ls8H39bB/DgVmzHjRhtmFs2SLVjorqIDPuTG6RbkwhpvawecQKc452qg8TwzfQgQvJ5uJF/RNpwq
Vd8HVtT3GMI2Uef26jRxzXnXM0HU9GBOUrBFSuI5Nj+dOk+g6OahQ0VtuyiwzuG0G8Ohe6RXQvi9
GPciAzygMulb2CuPwassGOhX2tHAeoSEh49Ux26/k3scaEAT8pH6qsbSjpRxm0PplUjz006yXIRa
EcSlJHZsG6VBzwRLJ5hSlEveKpIPq9WiivNZAv1y9vXuz65/leYj6AuK+4EgQkk1osV9vg311zBn
DgCn7k59SyuKPor9Ks7yiHki1SaxT7XjzZb00qbMuwwX5GodcnNkSniYuubsAjX1nQbO8WK/N/1X
GYS1ahMCaiT01T9AKRiEW6XmAOxshCttXIYt+ecRSa5aWv62kehty1xGYnNvg5IKhViW96DfnNhm
Rby5Ll+YzbWE/ngzYwxDtICCD6SMDy5N9LbX6QElhRd1TAqETvgtQ0CMg3GnJ2pUgYlZ7EtlN+6e
RAPE45rJj6Y8b8k/d673l8aOv0vZrI/uE8x3QYVnOJ+vqf09SymxbMq8+c9muRuepqQPD4uuEnII
fepZfZfmIQ+xg3+Aop9ZxvMMz+eN5HFiDjDlTW95krL+ZLZHzXWqQt5AUdv5O2rqHToc/mXD1Egy
ufB0zLuWclEyQIgBsJiXV+k3MG2bKOwAmc4xKDBaY4TIwYoPxrgofsEDGldE7hm6GSF1AQz7REB4
KUuSyPuGq+pjBXWkTy1uARqEKaCaciJuDEE524pvz5aOEx1pG2e0a2q0MTTm0x3Jo8i2+WQWkpW7
cGbRVnqexO1GtAyz2Ppzv93fkV6ZeDg7nZUd4yqvKjg39RjNDm66bvLHMQi/DMxC+3L+Jk2WfGaV
wiR1oMlETsViHIGRXSyKqu7tAJsAIiBlLIOm4J9l4yuIy/IM5zFKigdHUi8OAfL4pamRjexF1omH
8g2cglXqA8MlEjEnU1873TlVaP09Q4Fx57m919vkSbl7FTsJ9h/RStcAzftMDMCpi1YW366VYI7y
9wm1a4cvS61h/LNHk3wNxkQnQHlXkOFgx09Jf11V94ZITtc5VLfxnzFTXE6LwDhSMwHRQB9HgWDt
urQFABR15RyG4VbeGF/xqw4U+rzs1mQBb0Ftn1zIr9Hr3XNvxmC2+2iRVlkPCCUhutEtXoValHGB
pQhZfh/PjwQzwL2HDl2aQU25hiYUr/pXRarXYGKEAloGW9Wt4PNgoW/py1Fs4ECH9BKxGkVCT/Nc
2Uy2OuPfoxy0kYPb1XF/I0Bpdchf9VNPm10MC2WbaRsSvXckBW/X2SJeejpuzjxspFAGW+gIl8mQ
sl/MLfg4CRPTZoeW+ZaU9mysRkQLxjWD5JbzXMu4Llxcl+gjGDj/QPj5y58b9TDa908ALEdPsgdJ
Yf5ZWg5lMpc+UcBx40VaDlgw6L6/GDySVLd1ONQXKbDV7AreJGpTsbSuLUZFkDatCZCUwItGnKyn
tHUPkC3xW+Tr85oVrpi4Bii4s4KuesfCLsNkcQOQrcvf9skjnjjCkHaR1gPqERt0wYEkOvzZ1zpN
lbQGy+2dLIbj9s7qM7oOMGYfzmaU8SjBQarsvXcCTieajwihQHert7Rc88Q2ks4x/+hSqHmJIXjf
urnzAKq1vGYQ1sUhfoG9tKaFxcqg9KDYFY67hnomOqQsVhfffZvkuqG4crxNb3uhRzVrO6nnXlhG
Rs1iwBGjrQVNl2GtKwbop6G7gajl1ektJ7F59cnc0LwWDAxUZEQ7Q8zjOt61Psaamf6VJwh1RCFG
VqwDw8p+lq5rk68U9qpJOI///NG6b9ORj2EaQSzFZsgotrYgUM7YSBS63lH/dUxwhZXwbMhWmJQW
mzuHaSagFxf/1hUBFfHBtufFJtwJWe/jsyDW0xJzDDhxfDhkD7NDJcT/uDLYTjxeUUGefYl6oDI/
hSFNlDnfEMB0MsBMaxtNNYVHbde42yfsnY8Cxa7rrIpKqKfNRu7NnSDCByV8lLS6tLGBAjELo8YA
JTm7MfUzMYw49M+3/Y4LnDw9XfLHluXsxGp7tfwCa4aV9scevFu9+Ag+wv1Xy4jfK2Eop/FNLmW5
lED+KBapaUL7c7+TzTx3wzraH2GlhYKjV6mH7cCqgC2AZOFIz1uSA+JhxuGGOGoaAA0p6CNWZOeQ
CxM1YMnT/qDY0qFI1wkj9WkIy4vwQJito/86UsE5lXqi7nJLfrf82SsquI2rRK2s6BCwUYfkgXTT
yJSzFtdoT8DaowSvT0kKfSWMY7oVY2SEWxtDkwntbtkg2tx3HbohnnqYZ2PJb4A1uzVRXjKHdtn/
nLuzPdLQyceLf/iaCb5mEPvuthGaq8o6x1ktzgWCvkaLB6Tr06FQJfKIKz7bTZqdvA2l2GVSQSjm
//yr3dkfrf1Y4rkm2MXfvTpSO8qMJQD8LKpi6mHSxNJDF/pkGH32BfhIVncUYiPU4kqUvtPvIN6Y
XZB9A5B5rFerwW9ppIa6XV0rc6tfJ9fLgOGakMgnYLwVAvjgmffpacwk/Xcj6hixhCCQKj+JaBB6
EO4rK9mLugCBP8GIuq9Idp6+1WRju4pwW1TCDEJj7bcKfLAsrsJBnpfVWirIF/hOBvpXPfdjMgf2
mPvre6syRFfSJaTve2l2ZH7MdRsCgEJ+DmIVDnTQeV9ITndxjSN45xPtnNOpDuYgOiuhp9z4zw0e
7ICuCRYDqO+T+OXhcj/lOO1NBARAUHEL8MPLyC0uIXTBHmwcq2/tFq+aKj9khyk3EfcN15ilxe/9
4ckXZeZehw9nslqSujYw9nUqLiv2T0/ziSRMN1jXv8/z3aOqjGmIHbNYrDA9koWPqsVJhHexXsJ/
keXjaYuUfJwuIK2BqGvbrnm3kkLnjtbTlko5dll8xmerIsdHe4nx0B30KsLnpFRqyzLfEPADrz+3
TaEMJjmuOOm1AsJp/j0ckk1zUzcWpg2R6jzLXYXqG9A/yjo00sk9N7lrI73pghf1wSIyNTcwHLoR
2t/Lkjmkewf1Zfp2jl2pMhdRW3UllKQMydr1csr8zEQhvKNkJnA5VFixScmSz0Zhya4LVyKNzjwP
bwkO1fyHwngqIpemySe/r/8uuv0C6WGKgSPxNCnpjW1EYlKm9/hkloqwjMD3M6zwaaGIdI0Dmqna
LUR48UevmspiOz3M+93uS4rw7kTu1Sodgr7gM+k9Uz7GEETQeJq4E1qPV7LgMXw6Wf0DQMHjaAZb
+oeXeluGexr/gFdTKEf/0orOEuu+1VhWbXmT3vzFLcSYG7QXwup8Ee5QDefkBW4V/56A3r0sy2EM
INm5uEMwBNpWzVAiwkoZAUNb8FoPVUw+PohlGzUfMVW/ujhtsHAh7NvbfkvjOJ73bU7dPMeB3q3m
9GhgzET7hv4NadwEymGXH1GzuArpw505ycpjABghXG63X43ap40vMSjkz0DnFQZuJEnDWHVy+BIm
2qTA4Wqx4ZLJnb5CNKVWJLzxZa7ux4+Icu49rQ2TpsDmb3NVcubP4oRV7Y910NiakQ21ZnUDtmAa
hpMWFRf071l/XZrFlb/OoBdbuuTt27AToD9cdKu/Ft7bTc67jZAK2PUG/T8fOreewZx2DzYe/9rp
w+Yy+iE4/55dRGhwJEz/C0DblMgtZ0cAiwgnRTELYLRfiVd8YmE4+d6tctoaGwfYiMRMUVM9m6te
VPArDkg7wVBj1AsBujjKA6WABtWG3OC3H5UklJVtmHuHpoJKT6Ou2uSmhjI1tYBoOySN5NywjzCd
dKzxTRxJ2Z2lYdgvvnZjSNzALtheIKGFkMUji5+TE50udTQt/1hAA6Q95oPd+kh9gtYmWlgPFtyL
nHPCSgzbjq0P71IfuLVoe4B8XWLIVnpXLVO+6Ltsvuygz9ByBgfMjquMG3x493dQkYioVEQuKxTS
xYi690UCZ0DG0ESzItG8grdCrizga/4se9IBHYJ9mb9t4fFum926HUJghLLjq1zLAkb1mrnosdeY
lsc7u3VkGoikmmXMLLrNG8yvwkL1N+YscMMlOaEuMEzuotiojNJcPhgppn7eWHKZvNSPVFfEsluI
sOcICDALU+sleuKo6Hwpzil0UA3qf88i5kzvoR6ERHDv8A66IxOhbh1t=
HR+cPv8KPDbusbmVeCdn+anDYEbzWl1Gh9QpFlMwzOmswFloPfrGRhwFNxROx8DhBwLIMXyLiYH4
axmIJDyt1k2cAkneZLQDQZjb+yTMdyFay/oTCXDUKwLi6J+RO5ZCnMW/hYtqFZWR3OCehx1gxxIS
e4FOC6TV9wT9v1WjJuTeBGa9ips3m3hHzxhb4YZVUeGiFwCKFIAazqeb7MJ2WdXSpmVVQqDukxCA
ccOqIO0ztV4W9ukPoSJUl0/wnCHDG/3DTugAa17Or76Di5khubX3e9gE4jKsas9eLvCUSUjwA8gl
qtfSXc5h2LOtQ36ID+AWn6uMf9xYnTtQXxfOeyfGQfA4sK4W4idiWmXJu4OwCIWtm0WPcOZY3M0M
4WI8cBqzduki7MlcQEuFyxN39jyIXdFQ4wKXXgAPptoQh70H4FEmoBphPFSgzUyA5MyrGlbCQxw5
qWHzKHho8qabdrypCefV7cxHLHkCB1jkHdJsf2jaICC8OTUc+qt/SPgGwP60QHaLpPEoRjWWgTIz
3CknMv44XJ2D5ovDfcxbSH9O/2Jv+FaOw+2uplCP0Odz0tm2WCTMDZBB/Km3MI4SL14N03TQPWC/
4JkIzKf5vKLkalNtwPu27dfMNL5de5OjeLsNsoHLDo2N/C8gbp+MA+DN+jIkxXlrR1EBfxHnNXeR
8ZapNkyWRVMJCgrqZC1aROdCJyv6PMN3VpQGTcTTrdrdsexrg2X9HMsuY1z8hZ6bijCvpMiv6xoF
oWKY5QlbZRAvYZSkln26luNHl8o79M69Ga4HGyW/pCDS68UxEpG7T8eWeq+1ksaJUKG8BTNy59Np
afqpx7uoiqY5E8dyNd4Qc+l+essykJBLv7zlRyRm4X6+BnkW2vNBkNfKVwvtaFe7fR02Bjq3txwc
dKfpyIIMaaA04xwcxjeayZVLKJdREZDl4OFaBszX2/DY3JY4/fHUrR+8oFbe0g6uXvsT0pT8LIpS
LlBzud5DrRBg+R/JzTvxH23/KjjYTGjGQlthiRObKvVajpTcDp6h1FT4ms78KXoxdOHBHKQOyR4D
xVF8wrXL4ombEwP8Mt01hChNrryUmCqtE42vUO6Cg7/MldozCXbd24fHI0Q5kXVK3lCdiqsIXJMn
y1J4KEHuur3tOV/5N66EEygTWxZu+/SvRGrK6HIDXvofCQPhcnhyFId4PiSMGS69ptHOetJ3s0Ei
g3/0z7NVPz5X7sRAmR9iYYiWN5F7vWjZTgl8wM9yHji8xRh7Khof0CAb9D7zb8xJz3qQHxfpkK4z
/1wZijNEtbvoghGanztyK/FKL60q65R9VEvJ0LBUADfKjPnLEWYeO6uMPp+PYwKKYFOsH2Fr5NWJ
d0/FAf88W0AKyecMAHreRP5SHX0znLOSyiNSYpaITzu++CXS2KIdRSjNCQeIWxRGOO7D1TZE13hM
qaTwdm/DyykaVcrWbvT2e7fxqflOssf0Y6459u1w6XYJwtXq0V5G6CTnA6uteUoGbTr6ON61J80J
vbr8axJU1f0XEZz7XFaY251e3pLLe7DI21BW8DGHatEdhhEZwO4qHoeN9gWIyN5OEcRmigjYroT3
Oah1cFx4CeW4w2QFJfJ3RCIQJ4eERHz6Zfxs6GLen/qJzZAAI9r8R7oof0SbZ8Lf1cpVHr8mEGrq
u0Mz7+5N8X93O8PL5cVSdrzhzO/tqCTMcE+snh0pTOSdBn4unzOYtNC3sczUgvQBI8s4uvMfUZGG
4gyZ1sfbbwU+CiDhlkiUtPt8I1TycYWmNUo9EIkVmusJGvZIDua9zRKOJahtZtX9tmpkZBPY6PFZ
u7D4Z8z0wyUaT7s+w8pZ61TpueD4EJ9DiHZEtqkBq2UdtpKahi/ybuCY5axEXVttcPheQFrZuhbP
vIQdm0BtNkLwOGGpz82XeUulndnDsMccAHcgcYMQN9nHCESje7fMBnLJxm/cicxfjMeWpplSKUz8
+FXtwiv2qMpBfpFYFtCD9O+tBrWbtFIjwdzjzclcpYhALlVJGcwL47kysDmiGh9xiCkBGeHKB4XI
egZ+TER1ziSHvR8GpgBO78xGTClEZYFKE4DFh8/zlOqQRXzzM5L3AKG37TEunPtBS5XfjwJ0SSYY
EfC1/hF0Xy4sZb1xBIY7YauBZ/yJG0mR9F5k6eWPRB8frZG6McwPtS4V5VASDk30VFsIb/pM+FET
GNx/hEP3bzPq0Nk77QuecVbM/SdeGY9S39bn1fPFURLRKtva6ZSaQm23bZWvZ+ejw/FrvmdrbUOr
9V8lCvIHLmXKyr5LiidZsFUfbiw5YK0LJ465eELkRz4HGlEgyhAZuf8zSArgrqJeCAd0RpfAQNx1
3zQFVSAZP7ePJ39M83HMdiUD+GUBvEATBk/FAMtWHnEjmqu9VuT9CqJKZZHRYzXt7auK1b5TosVw
qrk0YZPR6vsHg26yqeSW9C9hp5ebNeNLyG3aL2xlZhljUzCKIrVyTBaLuMu1J/KLp4Otce4lZvTu
HVmm1gXbTz5la/WQ6q472g+pzC3ePb1+loYC2i3NOVzFdPRbgnu/4f/8zYvqiM50aOhf3ByWPPq3
2pRi9+I0/vAzKwoas6/f5hUwBHfYk8DSXxBBBE+MFkP2OxqjVkfc7TT348d9BTE2mI1G2oNkK75+
DcnLDPnzqeIt2vxUA+G0XvbuwUBIyaqKjoPvf9+5UQbIkHBsvfbn61MsrZ7MqU0OriaLwOPW/t+S
YC/yom/QChrfTGyIjdKsneuV/xS7JUTokHr6ylu+M9avcCC/mqsabmuEgxbZxxur5P4kTnPuR7Nb
UYiAODQ//FgwZ47MMOI0OfBOZ/jATf+xKv/w/5PWYWk5cYt3yDLKHDBJiH7GcZdbzU4SC6+xj2Ao
jWLgk4oGeRx5vtpQ8svJWam8PT81lwbDPqzzuW+9pwnrK8m6tFXq60KfWpvXcOQlQbYDwjguhJ76
rO+MWIWGxiFYb33d/WhGviH2GAtqEMvs4eiE1fx6W2w+RgDM2remej72aC46G7x6AqAlPNt0n5BM
O0fwcFil/e47LD2zZkKaJlzSrRJUvD2MFY92fSPSZfy6myzTLxRHk7Duds/+zcEA5IM6k0agvQ8n
zmlDL3FqRtFDtJ7Vmtf0EyIAsuZR4o+6wYQfs1LegD+tQ2S0cZHhW+8jZDWoho1jrzDFzNjDllXv
19hw+mYdT7YLiwwxtvDEAnNdtHkD/BWY5lGknurNfnJquRTFlwmc1hH/NQsTkeP1CFYRdmxBg0KS
WCI+5TZ8KUKFeMmq050G97OMNMHf/tgr4A/+vYZja3gdHPBpn1biU/RBAwBHWKWAenWZTo4/u6aP
/K5xiwD0KcWbdyO/CBujzSylefExLh67eNpBcdvvnGkJitQtgJepsKyOOvECfUme7p1sOj2JfB6+
geQOhCFUC4zf7kRIrvugauIDZCE1K3B07/mon1rcha4vpbQi/X8Zjh7cC5hTG4CmSIfJ4cVhULxF
xIbGqLYDNjFsz2c8gvnW5uPgiMnmb9rKPYU57zA4upPdf+6PaffgJLHyDV9034/WDSGR8Ju7SzPe
dcaZibfkmgXhBxEIQMB/83XwQOjQI5fWwe/rV8O2RSR8W3RpejT3n3Oih15jlYOlrP09fP1oBO6W
2wc9icKxf3zLhWFJB6ZErqzONRmk2GXAYzuwijQx1hxA01LptwjlQVsSsss0aqajw6ILEONl39K8
Ua4sTR80/xv/M329IHcSf+X2PC06u/m2BAtG/rsdwsqYeOAL9fqv5FbjLUpMYzq7UlT7V6gx50ip
mtKFg8zyNF5lX9O94Gxidgpo0SMn2ujWjFbHD8e/r8H0UtBZ7kF0p3z/pcW3hOlE6MbqJzKpDqbz
zO8ND1O19mTui6BmmBD1VbA7Q1EPej4q/V27C86Ej0L3Dc3VBInlx4NhTdF24f8K8BQYnUy5dO2I
8pgWRbG1dcOUwN1B9+40XmJCfJrJXJVTXc3HXQlhY0BEGg9E+/eaC0iKZMcSs3ZWl6rKpAoFAbfX
Qetkx8CsbbLcGWWEn0DeiSHqy42knql4kcUs4sHMkj0Ume4czXtkG8nzZqG3bemNYxnOQNXqDio9
fD8ZS09L2731BGu70tzgeUy1usHbRToj/bt9mraHe+ZKtj8wmFecf1VEX/f3I7Fkg/RTLI1dOSRC
dlHLs1VYYQHwcpW0ncT3trq9dtCTkl3WmIT3EhJ4IUQaRBtBa5g2PCxR+RQGhFriOp/YC+/A7Tmk
iLtHyCEhHGtUYrvVq8hmdTXT4oHKe9tWCFJOdbz15xcszWJ+nxoTaGdhbDrwx8d5fskl0KesZ1HR
VR8r88pVCjh1tz8/EY+TlTd28tP0Pa1vtfkTgLQlrx+a73zOXZY1eLaRt3t/nEhRTFdBCqs/4Lko
sNObQkDWc6r5XHmTwHqOadtFa9+T+XRLc2I1RNevUIalZCOLTNOHnzVLKMfykZarr8lq5PX60qb4
xwKt5cK9mgiPdLVKgvQQIDctZU4wv595Sf63f09WDMPOvK5XmiiqNiU5OmKEee/6qohnj46rGfpM
zbFBvtS9S/rT3kOfZqg3GCl3vjY66aV4L0JHYc21Jrj1a86gZI9gu03FSiCG5qfVc6F/mF1KXgid
rTlbD82HDDdtINlC16Z9BCz55VBHXvR8n8CDqkr9wfY/EyGOgtB4mtiBvhd2ozwLbg0pOgjZ5X7Y
TfV+j3AZaAWjAqOXL4eS2YR3pidpWlLPdggRcKuVE9X8csGXAwxajIStQ5zRclx2uphl3bIPzWwF
/f5RZX1ntSU1Ph6LJ9CswJku6Fa4nV4DywVdrPDfYk5JMwVV45IX+d9ZStEllhP53cK8LIUeOxZV
JkFSJoXKFsPYKjF/yAchUqSezfi/bQvN3+bfAhXfbtKUExZ7R+mcHP344mUvWPeAI4LXs3yTARQ/
Z6CgRHQaQv73vrexEaJvwhP7C4dnEvbk2HKSfEu0d0XYLWx9igUFRoIi2m7ja3gekRK3Ze0ib/AZ
lIOeJZIIqbBLk7/QzIY41fetleFQ6sUUlwjDCvvwyebWUD/m10GN3RTPENfm3vRyAJNZnffaPNH+
Ifx6aME96HmO0yhYvwXqsI/SnmHqJLvCuPjQzTqJRwwxwx138pSz6V1/eqQAej/EaYDOdznogA4u
uk2OJUERD4aeV+fU66VQrSn8SN5clFoNt6vrR6iCON3fcxscoU7kKN36MDE0bsE7gOafHpi8J7nf
0vbzB/5i8gIT6rcczyqfRehYmB/SjISMV6uef43C2J3s3JZZaoc0yBLJSzfjmnONfLbDFS+zdKC1
XY09xHc5q3aFxnb7W0D2AMW7rXLWkqlLj1l2616Y/uOr0KQMmUQ60rQOVis2to8gzGLTD7937oUC
WWHQfnMwktIQNAIgscncv/DzO5J+8ZYfPQgVIczrS6rnXhAygoAfoLczcjFzjtuo0Re9tGBIEHhl
0HLhm3l251sOlxKQ57WPWMjWLA4HRrfjKAHI+GyP7ZH7yRsx7JsirSH8De94pAna3MKqZZZuvj4I
J9/Uhhe1u+A4QBY8Ltv3zGGJjfVpiVPlnqHjB1T8O+U5bvuV9lz0t8VRbR4Qaq/VnP84tKTTwgc1
cWSg8yGRkdYmik8ir7MAETpSxodgcbIIx1aimPlARE2Z8tT/hw9yTF+yQ1JiKlN3qTkA8sWivo6G
56UPZ6aVzJdSpWaNH2tyWtt+U9Mq87Dy3y82YwB1XfOe4FsTZm26KXwunlI3GB/OkjsWj1PsHTwg
pDf6u9J37CIF0/6wdPDsI5kozil4dfdbC/FlIDrUr8L7JhGev2ue6RCqumFSCQ0DHV83QAj6yEov
YXbK9fMr6rY4XWdGSgc3Cq8sWHoV/KD1cSVd+R/IdvEwlhqZ5jd8XMtLgDZjGz07MrANqV0gCPr3
glvMVUMWrl1mfIA2MQGx49Ivvgknijz7W70LTSdAyARrE7zLVGqH08q7tredCAKXCMPiepFX2SSC
ey09Q5yeWJNOvzrT/oJv7B+QhLKmopc/whhfsE4Nui1hubpa4gGh+tySLGGb+eJX+hxBkxQkMQEc
eZ4uH6mn9P77mlUfelnOcaFj3ZlPe7JXxvYUak7jVns3SGpxQx48h+bb5ZDqiV7PHYK9PZleaa/K
Fb12KxFHfo9ReZ0k0G38KQ+R/5pQWxtKcUuEbDkSAkT0jNz3AxSl6wOohrZ0mI/GrsL+OoHf4LnJ
b2kswiauLBG7M7L8nGE3LY70cHW6nTbV5WHMh1LxbFJif007UPR84lU9w+djH9wAU/RI0OLZMdIz
lZWRwwC9hoocP33QNfTRTA650DzoRNncmO0TloBwFTFDETT9OdY/gtmT2QY1ik6XE9KAcxtHb+Yi
NlANt4ijLO86HhjUE9sSFHhXHMftbFszAAqPpiqCJq+oqyUtuWfeBj8gQtNPNc3e1qIXFyn4LYzV
j+IqEyOpBsWeRlFEYFzMSaFzzM6m/YIGpXJFZkxmNc3u84P0RRrT0a5Ef/PwN9zuNXK9EsthpInz
Y+Ozkvf4i2xwLJG5SjxAxDyelo/wSMK3yLbp3hEjOW+de/ZmmojF2nGbw/1l1oQZB9IkZimM1C7a
ck0wjhKoWjMctpcM+rxrnR/Kqi7WWlG09jTH6oDZb3O4yMdkEkX1VSsdMByV5XUtzRr6GJ18Jwsl
HdvScNqWDTH9FoDlbwzt4qTtNMPapqNbqTA0fNPKV6QDh3qSlHQwcXIFXjwWR6X88xnUNDBnscJd
VZaMXEPBiUEyAE5GnO4AopuAj9P0MMvLQy814utqPvDqQRSKwQJoSxEGUnDFh4deDS6PEPEnqEgO
EApn86CRuFh9Jr8NahyFsPbD6QaGfEnuaP0sEpdfWa60bWu5s+ML4TbJgCTI28NtmQ3IRYVbHhtI
BTHqNNoxC/ReHBdhQLNMMN2bRdsaxghPP14K/p21wa4g899JL2PWlL1wvxshpJCIO9NKCeiXUSox
tutomXVIhfUhUK/xc3/zJ4mXv0ylA74fxEepzNvuRlsJSQGNEpruEsaZbKSM3fnwjdmi8vkzpwMg
xJW9ioCAIK93GoxBdhfdLU1kaZU+q6CY/0y2vI6zL+LgTMaTdmWQB405e5SUlJqPbsClpIHIVZug
sHHRKnu6HGO4pvV0/cqUxB/jqHUnHAGbEJ4Tg/xUHb3Et5edSZiCZf1XNwwo95poVGnWfYGNgm1Y
RP/+ytWqrEJaKY4OqFb1cB7EK+w6BsZiAxAfkaAl0Kb9TfMP+Krnx65KeWHAYxwA7s/tRtj2mcru
8QWpcbnZICE73Lt2E6Ipg5EgIKs+/3wE2NqUBVFcxS23p4NF9php64/84tkUaSaA/fgW1mZnLWEm
TRpZsAFwMpSiYAtPo7pVBVJp/Gg++oGnc563z/SnLD30ms3g02LgmzZS7joUXSpiGZe6VCeuZRS+
eafZ2GqFgCIeHB0pR/Z+YuGbE4zZU3a9Awyf3noB+j9T4FEqOciXUaRSxziocgXMUV81pv4GPEHJ
ZTl+dIN8ptm42bs8TlJV2inCnNZnCgtFGH3CgAFoPA6xrlCiIZUAp5gmcCzrVKQKbB/Ju5wWFxaG
OYoa0KM+JU4kLvmrDfxhfGoXcZybFcZdjrNOTxzqmZjBlk26EIqBTZH8t7ZmL14RwFNf4s/3dhUx
onw3hY42WE/7u33LnSCeZdMWOhnVZRH8FYD/Y/wQESt3vYAQN30FdvUvrHLgix8NUJ9tsxXYInAR
3hJXWVPPhWOt4A32pkjukpw841BWW+lHCV7m05/mu4ZpedvS9w6gNwK7EkgXun5pDG+GyrdIZ1je
mdyTB0+ch4UAyOBfpv9F2VE3kTpICaJdWaBKEg2tUHaaUW6m7gGE8xVcHgVvu4A/ok6NBpEdONsU
MB5CRA+4nLvxAIEhoxlvlYZ9u5ICTI42TYPljb3AjfAU5K524ON6lrCOGSNURZuh7AZgFoQFOp+A
FVPshCtgTONp6hsEXXXAnzVPKm8kk173QMgvP8l5KyoTxQAG/ManSjMH0BI/MS7i9bnnJw3nVx6X
S1aP+xmsNEEi6Z63zD0nl9dy2NUtP6ynHWBH9c7hVAfq/pJsIqqQdxGxCvbtewa+tc+D/XcMl6dd
v3b0wxAN5HEvwSssBmgF3CIQpS/Q0GbTcxlWBB2w+xy9QPu911ciY9qFHVgRIBExcnkux+9b5XKp
GL6cUe6b3GNmOeTgm1XGVkCloC7aB18ft/FUc81bXgATm1To9cLhGt0bb4WmjMwEj6SJomHuuLjP
u/qoSAcytdgVTdl7KDzsqD07scvLqqDcBsG4PVkN9yVoHKVIU6MICyvFbw7HK50aLO0BzGCa4xdD
tsCmQf0bFtUAUGWKMFNklOdwOymSZjeE/v1kqiRrN3Sp4qofh3gGjDYEFRFE6nYVtSjK9tqwTrxL
MFsWTIh/2VYiCoh1/Y7jxQmCerqeI9JnaHJ9NmmHDa2AOoo7RY4vgblccKqP+i98bWOBnYdZPFAk
jxLrO2JfAIdu/mCNGp8xPFjMRfroZacHZIkirgS6Ozeb4LO79LtuCNyuNM2y2iSnrjFynB/XggnH
BdTypqDhtiybyxAPw0odkA+y6JfCJcjFQ2z9Ow9rTQI+MwmscohE7osec3Y1qtepxHtMvGro62Lk
+e5sytY1GSvSoQL/xVAx3eNTFay6+j3PyQrvOV8sp720Zdo7fYLTiadS5+2fgdoRDoPDNxgOwp+a
14fiAD6/Koa1ZMJKow4TAYZsdaJId5GDyewnAiRi4dUFNVz8o7VnrEY95LXZxLEZVBi2h6WY6t5d
cK+QrLvZ+8GkqL5qDI+Ms4TjG5NQq5UtM/vNbuHoSZLzizO9JAorPKPcI8jmqDbHyzLcuw6GpHXf
ut+Jhu3vXzNyAHN2xVAh5XfM6/tOEH5J5IX/3X1z/x+2Ey5I4rRXf0qGy8yZNvtxvbrAfi++I8OH
wrr4JqAE4eOR//xR4tdPq3dEv9SioxzxP+W68dt+ilAjhHs7Iiyf8UcQHBms58mYfMC7ku72EDhy
teAJhqyfsOPvey7Xi/WznpRmrEJZAtYbyaEjxQYhZX/c+NT1/gikhQ7bxhK2SJg86QU9btGg2POp
RyAe28r4rH+pRAKcddM/0QLZFyNmjGkHj+1i2Ka0Um2Kf+4pWfTMSHp0fy1ymhDtl3bWHaNk8FIP
jL9aTUxkYoH4ceEglvazaUk08n8HE6htXGsqSbVjC5MkE8KxshR9kEfWP+VO9pQE78AQRgAQilbr
ji+U5/9UYQ70BO5BEUAtQA2dYSggsS6VypW5raCNZF6I8/Gg2jjI9JD3obXS8K1TqBJqDbgrMune
V/vKOc6FzHRx8VzodaLPx+mRCPelualnaLljYhXJI6ihsj6puIcJ6NOLtW914by8v8GVVYcARFYg
xYrJ231DdCBJmEy6RHngbm0Nn0TQ9clq4qsckpg9J1MeVNeGZHAetsucYi2XHiJGpK1Zo+Puy/6C
DW2dh/7nQT0rIbrG3wWRwK8tJBR8YZZ3WtFZzX9vkFEhsBW8FqkZ5ST3vUNRRC/W4jzx1xgnoGT9
3HcZTfBsPgSPWyC5XsYwQL3qAgieenTjqqZgt7UEXOK5mhh7yeJn1jnN20TMZlf283zk+Yib8tBd
MhN8xghPBkfo/QJLQSeY5Cl3xkdW/5JxeP+dOCP8vqGWLNgwaczMLjx7c0LmVann+HFIoywRdRe5
EtmlvGpLFjZc0kTzTVTJ+v0c8pjRCJhuvdvKu7lGzMYM2XPVKWDvWOFNM78eCY8wPyrX6yfUkiba
V3QAhmtfHftBckEoJ/zLw0sOSbERk2K2TWhU8vOLAeKI3NSvJP3ffT8lWXFZYl/vy6ZhAu1gcXWR
mF/XatOs9k6uQvtIHMrfJahYdI4Sknb6UY+L1yJPTfqvLjpWkisVevZY0N0VCBnG5N5MsTb2mrmI
S4BxnOzSGm1PfsaH08XbzATBmBT/ZtIIp+ccgyIVdNQ6b7/Onjc9z0SkvX/+BI/VQ04DNnvnza8/
6Z2Zwvdzi+k5gogBI1mkw+DKiL7LRSuPWZ5lL+KSFXhA8rXqSEtiD6mH9/PAvGu/ZPJoUl2qfOcQ
8AOprfS3FqPlil7ecL32TCk4yW9s19HFBXWnq496uNEeXbPb1PnoYpir/r8thaSNnfVBMyUfKiQh
iOQceNtrqsmp1nHFCxZfXhg/DyhgI3Au6bKf+M5EpWTKjOOGAYDq0CldkU60WNvsTac7zi0JZa90
0EU7qLXEv8XVuEr75aitbXefPRVbqM0ASp6kL5UmAUpajEupt6D7PRtRnRy867OYwJdVkkPvpuYY
fDVIpqYiKVqbIlFOlGgn8eTXRl8J6UHq7fxsNSY3Valr7/gdm3W65ggPQuBrYiOJRigy7825aT2s
18z6QTWdmJEgAd/Z4F4WsnyK3ok9Q2w9EFy6JKu93x4B3JTsYzhaWiopx8zsfAvZqacpwHhsDOEz
tdT/BxIl6VSEakZTzX9HiNQxIU++hROEbX3ve/ItpVSsq38ZTOJRRWbxXaSx+rW2V2StMy9pmN/s
t83T6+y0WisvvaujcAxcCrJzDDPx/w0W+gUvTp5Fw5icMnLzVfCSaaS7MOV8GHDPACh2ykGmJbLG
4GQgPqbjlPIS0cm0Tibg13NdAK4nlhIJUBYGdf/ojwuSrHntTdinDluALc8l9XH1oOXumEXCczeO
mY2U/b+3sXVFLldgnBgx1qcxXoOOKwJqiwl3jqD/PDxzvly2NOVikwEa94kW/2bmKgqbCJDuKVU1
4oF9khXX4SbE8Tbysj+gb3Do2vQrX81GNZ9S7L021S/lawNj9UaXQBRznbhR23TQVWxNdAs5wD1v
uYpyzXieYvwqGV0e4eFdH8cCfa6hdJXZb+h80ImbpeEd4MOudYRvcLYmccyPwwCrjW1T9OcZJ1kG
D1sGUMexgDZio6OJL7Vj13tpmq6TZCIInHfS2vReSP/lsHjRSuUXJTzyVXxRYdyWBNSz59Gz3vRh
OUXnu8ZQVZljcli7PUh7i/d8zB6Pg4OPMv4DN8vcUeQgHL/srtYmrZbD4vm692TW0Qd2K4Cd4C8r
yu1YhS5h6b0v4m0EPb6x+yT1XW0mbNa31ZeYydqtoI19499J+N2jtCvC4FK8U1tIELuM/xnPAP2t
rOBXPBtJ9W5+jbn2AxjVr+t90Vtl7woX1BlpMNJjwqN3j/krdtf9MgHYCBoCvpXlefCX/6GC6lfN
4g3Qu1uPJUQ5rbjRauzNFJFQTk4PmD74CaL75F2XRuEGMDbcGw9By2tSa8Sc0eQWoWAxamA4FghT
a+0c6ADEaIWasZfBYg2+ETkUVRwvisDHpF9WwvzkZfDjIOV0PKemntYvx6t0eEA9UugUynfVZjbN
ekv9eenjzJspzhgajjopEemZLlQAizImeaInKGdWJh27Tmh7J/dlSR2KlFWBRmghmrJqIEJtmAxh
lcd3aWXBeqMTTy528d5AWIOdaTad5JKcsi/Ouh7bIXoC70U64QIwfCautEu==
HR+cPq5kFk0mx8BNQBEhmwUhWJ6BNyNhtub1wyk/T3edhwYrOCmPoukox5WdZNrkDRVYUQbT8EJT
xPcJIibdmavRxUoFRsJuHPTYkps9N5XZBdPyxBjTk7Bd4kttWSiFmrNlBnW/d+HCg2iTbRIX97m7
WWwIZNRj96jFmZIaJPpVhwb3bxMLv8Q9n5KbUcbUBnvPhOqOWvmaWwxi60mG8Rd7ltYXxH0b3abU
4/iJx7LCgihejpM9IDYmMaW3W2BImZjcDiqXBPnzM45CBPq6iGEBWA2YzR3FpPvRXQQnNRxxTfti
XxGVNrQ4FJdR3q/nejEExroepgIzMTJMIymxqlRrm7JlWhFV0lC1H0vz2A/NSVuILNcLy6rUoOIH
6HM9KeNkQwXTvVuF7d0Ldcp+ZG1dMKyKj1VoHwJ7zA2WgMV2Fzy0NA/3AwV3I8zJ/p0xSIYScwyw
FOrJb6IcxQ6rBW8rUGRH0phOUcdHV1kp0o0e46i44gf8iGlMq2vMz6JUKcFT0F6ojBrf82FK6pfk
/8vP15eLHvHH6YllZDshDWsEEbFsjhUNfjRHpDQCKnY+e6zdd5ExxiWJxOUJP7/E9U8l/SOvnQT6
+oR+MHEewlVqjMrATH9JREAdO1sVM8WepaoFGfBxK0yHoNuz/PrS/Q/M8IKbe4oCusOGJrfOvQg+
mtsQhDrD4ZHPVXEO7UGOliJlLyRHFuWWbomsp66nwUZStH7Twujbu6bwVArZ1jAHz+IYU+xBWdx1
p6OTB84GDevSrmp8KOnMRGVZ2sF/9a+xVFzsOiUBNRo+ZuDxUtMvjc8pDiK0cCz03pD14skUDUsI
6mGloxfbzBthuluYqKAkUE7KEcnqCF0GloUR+8dkLakqDfCH5jW0ij7yyqAzwTzQOyf/Or9DVGKk
KX5HiZ/SK0iXSOJL3wrWwB4uSzIcAnKZP+4cZSuodvE6WYmBe9UqK14ht3ursazlSBg/IeYKDm0x
/ZtPxdXfPFKIhyVYrbHKCLbQHOC3MX5dokldbhcqM38fQJUCl1P0LTe0YNdO/Y5j4WwM4b6yYvGJ
DowWD/acmXHx8gKqVHYqyAfkcqSEm4UW3K+sTE4sGNarm6ihk+BOn9tosngIHYgrLVypJbV3Kjv+
KovJVAWCt6ucfJtDN9SFr+arEUg+ahfrD4XAUesRjPzu3m7oP6WYUYyG0mYxQqF998lPTwq4a7g/
aRut8jxb2A6ZRizkLTy5p+AIPS4mUeiXrRtEDKoD53IGylPSxjAlViYimnxBTzGvL+9VOxAtPLdP
0T0YwYfSNdOfg3HRXP54OE4iNXssyFgr4PAQ0yOqJ7bKDhONUl1OY3AIEh2RWrEzxXRsqoOI2ft9
QNjIGupyq4Wgc5i46dVkyZbbTOehu8BHw0r0NS8Omo7hJtxUJWtbacpC2rl5ApejaRNzgIs4du0K
Gx9NEND7anSz5gp3Dj5C1xapOzKbKoao+PEUxYKhU5WmCT+gck81PDQCPovG2x5uvT54+lz3JsxY
joY3nGZLzrhiSKlqH7gQzRCrH6UlWM1bfi0Fh1KO/zPVpLReD9uJ2/Z5X8k70nO5XJTPTB/Kdy4O
bFS9W+pTtmLflaQZwKgPXCds/0v8hz4hPb6XfLoWFqkXoDpRD2NABkXXYNF+LfhzGI1oP4eaGg5W
btg+eWKrWmn9vspfy5r2tB6ZpkCcTmoC05IVZd1bKaOukttJfM5Te6WOcp4cn0ASUk2JsCRzcJCF
DY8D12o8V4JXx9DHvtypEsrWuu3hkm2d3gbnPWuSVkzMVGsm7vKrv3LtRlUrbbS0tEXGWqqzWrx/
x8gLgiBANqN6u1OOhXsQRvIEsoir2k55T1jpBfAB6Oth2vty6yNfbPuzve9gao76bu66RH+SB/Ts
TnEU0Z8bh2K2FPTWpMhTWFi/wMpqNVDdOavoaeRaBPAQhNcPt+pCTDcSoL1YJMo+ruUTUNDm990U
20DP2eNHAC85Sp5GtVU/jpXb8zajn8ASOcba6LChdTjPdy7rHOW0/uh3sixVsjny48wyTn+qtGRl
UF9hZve68qmtOrfuVrwPTJsvkpH4Zkf7bVTcwAQ4T8gPe81gcc+16Mm3c6Pf/aNhNR6Tm2e2n1LZ
wP83nUCWWcbcrstuJw1Xl2r2/LY2SHsIUdswBJCf4Quk60rp/I+vKKeoykLAJHCQJPmg2x3h25p0
nORPJCZuxbJ9sSOC+Ph6NMWeHQu7/QAD9XzoUuEoSDHOw41DboZINz1ULNYJWEQzBS97OyU7zjR9
FgbMDi+92CVTsgo3KHchnnuVwku4pT8QD2qNNTtFKsDW1b+J/zLioIxbhG2HuiqdbBwq7fc5BGzf
T1BICVn90NjpG6W8ElI9tG+A0+CEl7XIicPLdp4RM6UTq6O4d6aOHy7a+ccSUqiagDbnutClU+wZ
CKGv4K7WIXLueqNt5nn4/TXHO0npH+EPJblgeOkJ/SXuRPtU2efQEnP2GslUc6STm35jamGFKNvb
N2/iiKzU/uRidh7yUbb++FWuSrXFDWLfuWL+FTz8/Km6H1IgA+lVkR7iZTyvr0Eof01LI3XbfMfQ
/gkyVwDwIUDDl5ex+8hb72eifD7SoFLKPtuTo2Gf6A5SMkTk201YNBcDGRnK7hVMQqECBge3LqzQ
jfhurxZNqubDy7uM+AXFWaGS3JiOkO3fFLldBF15EzFN+KoyOV36t44X1DrQAYKzXc3lqGsqNK4+
ymY+1MuPZhjl+Ah1ilmleW03SzTabGC29B9nULd24D6PZFMR2oy1pxnmQuNAUOoyVVK4/AWELGW/
GFTIpG0ogqi3L+geMlku0AjAqxj9pcBwmxbTf4Yk9sP6Ecnc6HUbx2Br7X09zPTRq1XIAfPzdV8P
CHcUG9N/TujW/B+vaUEl1qlU/hxvIKgCUuQNJvwCAhvCgT6PgmYOXHWir19fvGHO1IUlSZg40Rxp
KHINCLrVpyzTgoBdHmFAxtAEDp46q5fKZ190cDmWTKm6CFXTQY3+TvGpXLiWJ14JzE4r2841u17N
6ez/FOM9Ds5kUs02Ie1j4LlVmrev/rzhAseJPeY1sKmMTWtfzYbA66k49kzGz0wulMgFsV8iC83w
CFutIEci4DNVXRqop3PJFln7/LkJMZ9Sl1IG59GdmNGVitS58PWgkN4qGn+/S19N3dlUem0sVPCW
TqWQy96TjN03IOe/0HS8UsPdK8f9+pFeThJNZk0O9gCejLJnle9QTfJSnuWRClg8hru/QpOY8oaO
5Ph4B/lCaBLJwns5S3rWuo470V/APgWLB5QwKc8F8FSOKy9xM2GQpIPobMv2wsxUGHa2PX8n3XVW
Kpa8oY6p3q8EuNn5yJvFnS4/myMz/upPccdIGfnm0/vHXzw9cbvqSD/Hp08BtwmL5mHHriDdSoyT
3yImixIpANmg5mkYolF81i2uSMUdsC6SZoqB0ylBFio3nDSe8+7ICGF0edb/t9uIAp7VMNpxJvoG
5295+0crCZ0nHHikGLUAjry98FWad+U7hxhFJAtlXVNlrstGpTxVKwXeNeKYoFwinjTnb4dmY5Is
+EW/pTyEAbr9/FF5WtBjl0RTDP9xWnL1aqNz1VO7a1Jffn+rQnI1PI+EvbVeas+qw7cLXyDaW074
9qHQrKj4l/ydVK/J020GsRXmwn40eIU8GI6WotlDym5egIdHWBK8isp4peLgIUCp22K/EyFMMu7Y
sZKCCU3novQRIPf2lR9OE/XjleTdt6kFBHPXuxKeht1Mv7Z6rcbybVJNnhVZ1ifLHxRR0FwXv6oH
5G/QlZs11HK2Oh9uPVM0zWJjxpTNCAJUru9fNninHD4xJFVHOJcQG/MgyMYkiCBt0bLIWeq4LCGS
2/O/FSGBpU3LnPOYJsZbMpB/plTTi/VWafq6Dl7DvVwPyACYuflWjbEUXALSLrjdPtUG1u5MWQZ5
56+jtxZuOkTmj8ahGk+TBXLn11ZwOcnGsc8jNjS3M2Y+ZOAeE5taivZT0aFA0UvQih2fZGI1MJuK
hWiArp5BuIOh1iZtHvXTUYWUgkCODSwoUx6+QyNVA9xm2QxsI1yG48GpBipJFh3RrBV2UoWMpguX
HDmq1clGQL8kiIS4qaK3mC4JkAHyOpIdj27pjK5hp7mzzWIWJFpaeZRMRddfSuuZ/ObiyoHZcVte
5tRSUrZzD/RPRShAYG5wIyHGwETR24inzkcHcY/Pk9nHiLu1ykshjfdd+1HUG8LKFstE/NRR1MTL
rfhzdgtwQvazg98uV3l8RWM2WsOLf0IDEbP4QY0hNiMk4K3DeLf+RYbWGhXFjGoTxwo7YqlP7Xk/
S3wsUDupBHtJ2CXVw+dxCL1xLh5J1KcgwHRLZbbdtB7f45tru6ypiUe+PaiUZOdAQn7+P/dtJ58E
e95flb2Nwx6MW8GrUQF4jMJxJxJaOe7D/i+BvnNkVcJWvnQTILoclEnvCiSQ8yZ2n3UEKyrQCsIW
VfgSQrqcQcmHVPvbbnMezCX3RqNQ8opF3op9J8Q1VEFqgJs47O7iF+SVxNbEY2mlmJF7U/GN8PlP
fLw7afHcg/HGXyZCYl1dpRS0rbXjb4XfTzEqpT26rxhfDthgV2mlefHvR9CGOSZcOdz4JPA8U8sH
LX5la6KD01KuJne+pQVtPRUoM/FF2Q+1bdpv+Hd9DW5MFOHHw0NWCN7Yv7qI4s3uE9GDJ1sq429e
eAwVklIKicppz24zU2W5FedvaBh58UUR3s92i4pNaUz9auaZw5iX1YWwHl1rs/DHGvPIzLUZrHED
82vgiTQMKEIHllOMm4XoSH/1wuLCRp6isPZbXdDNnaPOsbTOMJM+3h49TTQdzrsGcEjPaqHq/rlG
XzvKrThQTdk9XiLtqMJyJLnBHlqQAu6HfguIv7NkFGh9Rq/8PuRPZARB7rjVuZrDtyJWXcB/WAe+
95MTEY8xhwhAQv1dgf2U0fW7DCb+v3SR1q/046EZc+31Mh3+cXIu+lntRIAonLAib8DBGcyV4BoJ
/hbaA/BOlQUeTMMapKR/6zMTYFlpaH7Lx/wNUZXW6EZQ85WWXwcCxcLLg3x2vFRp/jS5yy/HRymz
aYgJ54qh6lPmXQEDJSR0JkDhxdrG7MHU80hWPF+JH+00ybqVNYr7W3VSHplBBe2I2QrGVs2YItI2
FwIXV0sjR5UaVHJDbNxE877AZuZocAf7FLl2sdtGFGIHmSYggUJMhfK+TZbnS9nS41hHgHNT6T+s
/NBC2xsIxFOw+EBBg6pPgBZU7D4OnraYKlAZqFq7NeKM5OetnC+m0HxYTSYwZK39HVR7il2LYhW4
Bhf2HUrdDAuYrV+eB2+H0ugvysjlZuAnUjUq58VDMJklw9Y3qYMLgUft/654AWtM4lhPfhwLpkfm
IruM+kq+B3dsuf/tfRO7aKnvjZ/OzMqZ+JrSrtdLjdralP3dXjTm+U6DlYfZSIkEDIqzEeIGQFbz
gYMvSFiJOCTpG2nZCD9OcnDv1kvLcF241It2ViXaSJSh7uix5bmUE9crqgn8MPrCtReiMzR1naco
kyQy+gM9zD1jSQlen9iRfhJT08u28FMmpyzEV11WZGarLjRvfkhGyfBfIWpB+iNDIBamQb3YuB5p
4b/ocgDp1L+bbjXnrKkDlTBWcPFyEYysn/ZbXP+XngW3RI7DKsdBh1sHHjxojVOZ0qjJlLbVWcKC
O7Ptiu6JdOExrKvUrfeXCxnsqt6qXdgrgIt3g9TRmZifdrdeaK3RQh4X7iY9w/MCvR+v3dtfaPM4
GTnOTq8i1/JDPJrCtHs/lk3P6adKDIi9Leo5gQUrQQE9MZqwkC9gQsxh1va1v+6eK5PXbL9bTYI2
OqqTazkkKY7nylvAXYlaDYxlyYCzPx8FwdZjAYWGz0JkZaZLt/0OCKvQbdfmQZ+oA0RctwxA9kYR
p1nnKt6TqRrZg0VqWTTxlNMZNbY33gLrS3vxTjpHRYsAJ6i5MduqXy2BpH6LfdVxBDvSKVjsmYBL
zUL4HoYMoRd1SqyfgVwe+b5hfbaWBM4NdnjsDsZ3gB9D8huGSVQWb9fDy5VN3tjPia06xAxBI5os
nuLTDCiefNnVOOx/6g9+bW4AGsMifBBHMZxkgu1RqPGjLmnSOcmN/7TacptAFhYRm6lXHOFzP3i7
Ep7c7OwoM2xODb72i/YMQ+Ud0pke0jQHsMvZ1kRW97l9MX5B6p5SXUZzr9IxdCx+DAI/hcY18PVE
QQ2G4wbfwtWpnzln2/PhksQL/h8i60DnKlBrfVFzr4oBvFPKpopboCM9X35gVb1301zZLvEWerOG
uQRXKubbShmrD2vd9WFjh2o6OmBx5ACCEiGgJOTd75Um3x7glg0kKtpBlPiekmG8Hh8ITQbOEXnU
h8M3LpBTEd6FG9lcHgve8AwIvdkWfH9V0UrKzIOuq1AYhBLb67DnKlvkTLV0CKbn7T/Odu9sdcsG
MxWxh9yWHi0TiUlauIJX79Y5vNBCB3T65scb7L6uksbna/+o8kmsvEmnV93mKID/CQn49whMkvVb
PjPncfG1QlT9gTIoAuQurzRXigNFbo5BYKbSq2+nuEMWli3G+TTjY7ppDRbnHZB8n4bzbC0ncefB
jtvRw+vOtXTEu4kTx5a6BDcStVHpQ4P+H2bvbpvSbRQVBuAUsIGDc4BWDAqR70yoB7UOP3ZIulOR
fkwJRDQCpLUh4Oq3qwU5aDwR00MTqEHFCieVE1vSdotZh6KVXn0q5RHAJcGiYhLulpG5nCthlHxG
v8o6KAxV5yJWcgFWR+RucOon17ZCrWuj1G7o3Y8TFbXz0zFFPz2SQtrEM3GaX5lXpQqC50i8vLpQ
A5/yriw4XAM/6tQf8SUMO57jpxg2HXAY5NxCmbXdj0CGPst738Aspd+MRXna4strezkGbIQiSR38
v8BoZObYleMKSaICqrIgR8mEGj1PuDw7zYuPPSUtDwCeAl60dCTdsxlekr6lo/gs/QMitAvJxiRV
CIfQlnTkwnS5naJDv3f82tKIdgLDkGgbrX8M3pjnba03TEz5QiGVmf6FhhAXKOXHMz2vWiISFS8j
5gCSLn5qFrjLuB4T54PmrlOPtJTZLgtmRlgZsLNV/g8KGyj7KMaZkqMNa1+SZwp93YFHEpQ1hrN+
1iiAYjbtcK5ATQ2k2DlcPOvBU9DhJYtoXuur2INaABxa+JNsSZVRiM+cyraoFOrbr+HKKoMpo3cQ
szmTMxURTienwlWphPl1ylMGYaTnMOd5YL8696jBe3yL8ViM3QoBfuOFcmcs+q5HPSH8PIwC+iYY
CfnUuvTl41WHu/Xdl5YQzL6A5/LnLUcLyOBNMF5hlALxoKg4V6RLmFoJC3rSar30trvdggy3Fci+
pA1D5gLI+J+KFl8ggH+3mCjAR4ZoX26uZUx+H2W/jdzFyW1Vd0ewuFRaRXnBUPGVwR40zpOE3bXw
tcDFH7Z6APxUcGQFXD++KyaiXI3LntFRkkmAv8igDbVYgNLQwdLjmYF/g/cIveaIefvQCfEvddkS
eMDhgYHjYPuTcB3pU1Hgnm5DbFVwvQGH+qMh9CO5c+Z6rrhPOCBGOc0ib00KlpkCARFgvzjl2ZX7
tgruo1pwqVG+NLdzXeceK+cPxApk9rr2v/XnriLStqLNW2OQ/sxHMpYIPCJdszJH4MTbEJWmqvxb
h6ZwUfIQAtxTaYB4DjcKqLWmFjui/zSET241rt0z6hYpWdrj3S1+nZsh1anpCAAmwfjaoLbwyCs8
dRa0ZKNOoaHO7n46W6X1JmKSW9PlTORrhD4KbEVp3SSZshdXspftjzUmJ2X2j7fSWmhlKLngT3YB
nFRSnzPmgRZHW7Kd+GcPhSxhTYVTC/4uJNWwZzyGdAb4gxgS+aectxzBPdmc7UDS2xbVRFj8qM2k
huqLuRePl4QkElIIYhgZj7b/14yddGtg9Gec6dO/kO2XI5O1DAHEy59UpyeLz0f1BIExhiQBru13
aEZ6BpEAgj+X0CTp2X16vzJTz7XBU9rjjVN6M+2gvAdWCX4slW3L78oP7ke2OLS3UqK7NKuilMwd
kZXIXCyubcOUxgN5wSXDxjKq9bw96rMkcIgqCrFSHT+zokWnbdsxXdCXX27Cs5fCLohhRXbhi0G2
f0QqISAdAiekw0Nyt0F7wBfGTkzIle8RikH7UzHpo5LXGnYaFQjUKrL2QMMRnvxnOQCABquSZE9G
Lqll9FwugLklqm2+TIdwNUdSax6XJHf2aMFF4o11FfBi23OkXabv5bygvHjzbpJmtrvnu8Bc/SmJ
efisv86WSbkKlHlCu+Gn7Sm1i1qG/cooNy9OisDS4owmKUWA5DkM9s1+IkZOwbmhmRy6os3Vuuc4
e7AWRjJ3xM2d4H3zONIvAoOa7zFtt4qtNtwMoQQ6raIpRPGu5AxAOuMsMJutJ5HJwKUP324SR84G
duJaAb5JI681d+0YA2XuklI3WpAJF/Fmz1RaR60OhGFybi4dnknbelGcxcsHZmmkwvcNGi0XZLFB
jOoiRBU92d45rqoExujAbAwJjqK0Clvxc5JILJVXSU5GWtrw1wTPCtrMcaY5BbIy5VonYED0s8v+
ESSg4nKjDjmQDjK3+HfteoyN9d863taFUGKOf5aUYBudtabGyH9vVaTXCMMSB6eqMPO+ew5YXjWg
oYwStLUaOWpnjVEK0SDZZGgYAjcU5uZ/OxEFeXEqN7BK5vA8vOy6FW50/lsuyHKvlJIR7XTvHDKJ
ed0b0nUDScwt5jJ4LYMl1dGc8FyDWe1nJMje6EChMLtdxcr+gvr1HpawSHTUZoHV5c6JXXrYeWl4
uQXTABlFnQfvaEccRqURxJCa1CCGEXEQ1fIOj7sUpTz2JZFs+OStTmrvQYPgZvtKQ/BLGR7rJV/R
ezzPlmXudREWX8sCHD8Vv9kR7Mn8qqpalSfSa7Y4IZ25LoSh0bpkObVtJGnQMfmAFM/gRWy0RPUP
cQ5wvCVvooubYvbFWep2ph5wadAUT56Fv+gdDlr8v4eDO+Cxn7+OJuPz4iJAneAX4Zi3AoXziygg
DGbsiQUFMvcsIwwvArwJ1icYZh6li3cC+H6wRTbEMQQFAu+R5rG9oXvsQQ04SFPRWElGgLZ/waJZ
70YJLSzQEEnITAnv+0cunX1TzSwWk0w8vKzo8gMILbpRZLE8l3VdWC40jiwx9se0fOuTAGIMCIn+
/8kAOJHWVToNWxpg1Vv9pweBzymK43JJGxU7UuFwECFB7sremwMK9vceSrNaBEkgLy9fRrxbT4wQ
ePozsU7ZfKbQRXhQjs/AuSdyx5lB+CQ0aHAZl9op4u4ofn4ChK5X5mj+8BXdHr+fPn84ShIFL8fw
Wvqbf76X5ez/yTwY0kqmz9zIaaqb+A+DeZzQdrqFIY16yuMMemZ0r/jvlkz3uRJ+TQMv4IC6Cy6B
emib8Z0LCNfChZN9lybXiOg8PeurNk8jMVyc0Z7BlvyraAqWs5pzR+ThR1qzdYcFNXfnxuaw5USN
lDjmlfeYjhblxT1YR9499TEDHQEbjGWjmp+9xuo7+hsRxC70B2GDJdycICLlk4aTGaAk8sVQdab6
ScoSJaWSXFl0PRWLbTnwqbxK1Nf2mQEM1e4O8n23G+xnafbI7RHpXtBlPlx4M9JCSs3b53/CbZR3
ISxDn1ekr+ej05y8iatIHWXGIuLpCIT8z8g+TQX7jVkK4nXRS+n9yT6zv7egp0MJlXeO/+OEjVBU
e1HSD4XC3FU6aJ9kzAwIgybk02TJU6WXr2BiHYrjtAopTjOp4dbSjeOrvp5qxB2j5fkMguWa/vvD
/OdRSqL7mQ+Oo5b1JWC/d1sWjTkR7/eUXGN3l3gJhX4jSu9QDDencrwdG4T0d1gYUusCYnl5XaF0
4QfajaTfyCTOgK9Fn2jsoN3ur04gQyPYiDaDYnA43x39FVUQQ4jgQ8O103JMZgXS6RdEg9431rGt
vfLOXMk4pIvzpWQhzM35AU/vHeU980eqmFvLyY27lLXxMJxZj99PI+JTKfL8FTF1kKQi9wDdUxRg
lvVajz/noEEsbCPMjkxS7vUmtusA7hAxXpYSItZCMvoD+xWvD0Rn0MPUgoGwliaiqkTH3oAMVTpM
tWbauIuAHsi+kH7lVsUpb4nHsTA9WUF2gM7/Q4NCu8rFwEq7MGKir4czOD6YEbGeYcWVBQJbDY5F
hdjx2fcBiSuDcXy/mfLHFyTpQAUG7c38jfKdbCt8yBASzIf/GN7Rl57v9ny6KkCzlyE6r7AHxDAJ
oTpl8DeC/7oUDKB+OGBcYnf4XnScD8EVtl8EOAwFyZFxZ7OGWeH1oRexHWcObnj2+UtuLnW9AEqK
1iN5xsgx2DV7YDmPlZ+idLi14yVDWTh8ftpCedQCYVxd6v4CDJaoEjAlsw0qDXESvwAn2c/OJn1N
b6RLG/6tTDy95GH1xGL/06r4sO72fTnrLgicd1zI33NoToLpz1vo+8BKl4jnO6aBDz/zycYS4h+N
L4I2xb8dn4HAiH12dtz8lfUlZVOMUCWsR3gy6sFHoChu4nQ7mDxgykSHwjD1NxcbDSHXJjSuPTf5
nCZ2w5EtLHWdj2dERFyHqjb6K7eJMNAzdsU8Oy2dSjA2U/k4WT2TJUaQtWxAGdjnG5afh2JkuTfQ
RYhNhSPflFJR+lq2xsQUjaJ0zlH8IQ3BIwxo+0ihf5iGoxDhIOnovznHvW7e6hKHPhEHy6Ff8Tth
/5Ck3DqwHVN1r7EQ9/Dkv/Q0bP8xRpyNoEjN9C5PtKO7T+jlyngDAHHrjUiLnT6V+Dq+25uFkvoX
KspKtxmDKo5uTndnpv5zQQWt+THTA+4FVBq8iY9956tCUTd2NwWai2e5sbGx+r4H+69qYK8AwWeQ
FXrYOdEqWsYReZ/P13jKXqFKMdzJDNNmrn1ylIok9bHgRH0G57k8Dqn/gEBeObgZQ+ui80sR68Fq
iriMyOxyOwl77gV5eHbzR/GnN4ukhUTuIlTQJeKRgiqdaELLDUsv5dCMlSV17qKKOVrtfIee2krY
+forIHV/ov4fM0cdhJkq4RlESQDOArRY1bsOFsMILiH6YzwGmu2n2iB7AIECf7bPzNa5lL1qzGtV
GvM1OcyZfLkNOxcsvGrn7/aUm5ILfs/roe0ua9XpOsaCqGEzUEQrHoIWbxgkqTyYdwy2WN+eOuhl
Vnm/BZrXcBVgLd+vtBB2GLlE36reQU7PSSnDa53qFcSMDfLqrpaIN3eRI3COsNkNkGW5MjwW+MSL
AU78llRd5JRvudgyCTRQzsw+J7L4CCj8SgKGYLhKWlvj4xJwPWMIRrISl4yqcPtTglZPLXbvdKce
KFVqIarz64VyqDPY32eA+duEtdEEupdiob0zXQf+JblFXIIJirw+lAmUNOh5tlMPhfZuw40fjYAj
cnGIpUOORrvNmLIr6t5wLDTBaiDuhIkv2QJ6FlSBAG2N1w78DSD72nPaMYzW/mTKuptcmh4Lafmx
zo1jxuJzVT1+u1b7X/fYOs31fRp/pK1uK6k5sVzptramdFkMYLHhTKTC1z5ZZkeh/nouZo/JJm==
<?php
namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider;
use Exception;
use PShowSsoScoped\Firebase\JWT\JWT;
use PShowSsoScoped\Firebase\JWT\Key;
use PShowSsoScoped\League\OAuth2\Client\Provider\AbstractProvider;
use PShowSsoScoped\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use PShowSsoScoped\League\OAuth2\Client\Token\AccessToken;
use PShowSsoScoped\League\OAuth2\Client\Tool\BearerAuthorizationTrait;
use PShowSsoScoped\Psr\Http\Message\ResponseInterface;
use PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider\Exception\EncryptionConfigurationException;
use UnexpectedValueException;
class Keycloak extends AbstractProvider
{
use BearerAuthorizationTrait;
/**
* Keycloak URL, eg. http://localhost:8080/auth.
*
* @var string
*/
public $authServerUrl = null;
/**
* Realm name, eg. demo.
*
* @var string
*/
public $realm = null;
/**
* Encryption algorithm.
*
* You must specify supported algorithms for your application. See
* https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
* for a list of spec-compliant algorithms.
*
* @var string
*/
public $encryptionAlgorithm = null;
/**
* Encryption key.
*
* @var string
*/
public $encryptionKey = null;
/**
* Keycloak version.
*
* @var string
*/
public $version = null;
/**
* Constructs an OAuth 2.0 service provider.
*
* @param array $options An array of options to set on this provider.
* Options include `clientId`, `clientSecret`, `redirectUri`, and `state`.
* Individual providers may introduce more options, as needed.
* @param array $collaborators An array of collaborators that may be used to
* override this provider's default behavior. Collaborators include
* `grantFactory`, `requestFactory`, `httpClient`, and `randomFactory`.
* Individual providers may introduce more collaborators, as needed.
*/
public function __construct(array $options = [], array $collaborators = [])
{
if (isset($options['encryptionKeyPath'])) {
$this->setEncryptionKeyPath($options['encryptionKeyPath']);
unset($options['encryptionKeyPath']);
}
if (isset($options['version'])) {
$this->setVersion($options['version']);
}
parent::__construct($options, $collaborators);
}
/**
* Attempts to decrypt the given response.
*
* @param string|array|null $response
*
* @return string|array|null
* @throws EncryptionConfigurationException
*/
public function decryptResponse($response)
{
if (!is_string($response)) {
return $response;
}
if ($this->usesEncryption()) {
return json_decode(
json_encode(
JWT::decode(
$response,
new Key(
$this->encryptionKey,
$this->encryptionAlgorithm
)
)
),
true
);
}
throw EncryptionConfigurationException::undeterminedEncryption();
}
/**
* Get authorization url to begin OAuth flow
*
* @return string
*/
public function getBaseAuthorizationUrl()
{
return $this->getBaseUrlWithRealm().'/protocol/openid-connect/auth';
}
/**
* Get access token url to retrieve token
*
* @param array $params
*
* @return string
*/
public function getBaseAccessTokenUrl(array $params)
{
return $this->getBaseUrlWithRealm().'/protocol/openid-connect/token';
}
/**
* Get provider url to fetch user details
*
* @param AccessToken $token
*
* @return string
*/
public function getResourceOwnerDetailsUrl(AccessToken $token)
{
return $this->getBaseUrlWithRealm().'/protocol/openid-connect/userinfo';
}
/**
* Builds the logout URL.
*
* @param array $options
* @return string Authorization URL
*/
public function getLogoutUrl(array $options = [])
{
$base = $this->getBaseLogoutUrl();
$params = $this->getAuthorizationParameters($options);
// Starting with keycloak 18.0.0, the parameter redirect_uri is no longer supported on logout.
// As of this version the parameter is called post_logout_redirect_uri. In addition to this
// a parameter id_token_hint has to be provided.
if ($this->validateGteVersion('18.0.0')) {
if (isset($options['access_token']) === true) {
$accessToken = $options['access_token'];
$params['id_token_hint'] = $accessToken->getValues()['id_token'];
$params['post_logout_redirect_uri'] = $params['redirect_uri'];
}
unset($params['redirect_uri']);
}
$query = $this->getAuthorizationQuery($params);
return $this->appendQuery($base, $query);
}
/**
* Get logout url to logout of session token
*
* @return string
*/
private function getBaseLogoutUrl()
{
return $this->getBaseUrlWithRealm() . '/protocol/openid-connect/logout';
}
/**
* Creates base url from provider configuration.
*
* @return string
*/
protected function getBaseUrlWithRealm()
{
return $this->authServerUrl.'/realms/'.$this->realm;
}
/**
* Get the default scopes used by this provider.
*
* This should not be a complete list of all scopes, but the minimum
* required for the provider user interface!
*
* @return string[]
*/
protected function getDefaultScopes()
{
$scopes = [
'profile',
'email'
];
if ($this->validateGteVersion('20.0.0')) {
$scopes[] = 'openid';
}
return $scopes;
}
/**
* Returns the string that should be used to separate scopes when building
* the URL for requesting an access token.
*
* @return string Scope separator, defaults to ','
*/
protected function getScopeSeparator()
{
return ' ';
}
/**
* Check a provider response for errors.
*
* @throws IdentityProviderException
* @param ResponseInterface $response
* @param string $data Parsed response data
* @return void
*/
protected function checkResponse(ResponseInterface $response, $data)
{
if (!empty($data['error'])) {
$error = $data['error'];
if (isset($data['error_description'])) {
$error .= ': '.$data['error_description'];
}
throw new IdentityProviderException($error, $response->getStatusCode(), $data);
}
}
/**
* Generate a user object from a successful user details request.
*
* @param array $response
* @param AccessToken $token
* @return KeycloakResourceOwner
*/
protected function createResourceOwner(array $response, AccessToken $token)
{
return new KeycloakResourceOwner($response);
}
/**
* Requests and returns the resource owner of given access token.
*
* @param AccessToken $token
* @return KeycloakResourceOwner
* @throws EncryptionConfigurationException
*/
public function getResourceOwner(AccessToken $token)
{
$response = $this->fetchResourceOwnerDetails($token);
// We are always getting an array. We have to check if it is
// the array we created
if (array_key_exists('jwt', $response)) {
$response = $response['jwt'];
}
$response = $this->decryptResponse($response);
return $this->createResourceOwner($response, $token);
}
/**
* Updates expected encryption algorithm of Keycloak instance.
*
* @param string $encryptionAlgorithm
*
* @return Keycloak
*/
public function setEncryptionAlgorithm($encryptionAlgorithm)
{
$this->encryptionAlgorithm = $encryptionAlgorithm;
return $this;
}
/**
* Updates expected encryption key of Keycloak instance.
*
* @param string $encryptionKey
*
* @return Keycloak
*/
public function setEncryptionKey($encryptionKey)
{
$this->encryptionKey = $encryptionKey;
return $this;
}
/**
* Updates expected encryption key of Keycloak instance to content of given
* file path.
*
* @param string $encryptionKeyPath
*
* @return Keycloak
*/
public function setEncryptionKeyPath($encryptionKeyPath)
{
try {
$this->encryptionKey = file_get_contents($encryptionKeyPath);
} catch (Exception $e) {
// Not sure how to handle this yet.
}
return $this;
}
/**
* Updates the keycloak version.
*
* @param string $version
*
* @return Keycloak
*/
public function setVersion($version)
{
$this->version = $version;
return $this;
}
/**
* Checks if provider is configured to use encryption.
*
* @return bool
*/
public function usesEncryption()
{
return (bool) $this->encryptionAlgorithm && $this->encryptionKey;
}
/**
* Parses the response according to its content-type header.
*
* @throws UnexpectedValueException
* @param ResponseInterface $response
* @return array
*/
protected function parseResponse(ResponseInterface $response)
{
// We have a problem with keycloak when the userinfo responses
// with a jwt token
// Because it just return a jwt as string with the header
// application/jwt
// This can't be parsed to a array
// Dont know why this function only allow an array as return value...
$content = (string) $response->getBody();
$type = $this->getContentType($response);
if (strpos($type, 'jwt') !== false) {
// Here we make the temporary array
return ['jwt' => $content];
}
return parent::parseResponse($response);
}
/**
* Validate if version is greater or equal
*
* @param string $version
* @return bool
*/
private function validateGteVersion($version)
{
return (isset($this->version) && version_compare($this->version, $version, '>='));
}
}

View File

@@ -1,154 +1,95 @@
<?php //ICB0 74:0 81:f39 82:1ddf ?><?php //000ab
// Copyright prestashow.com 2025. All Rights Reserved.
// @authors prestashow.com <contact@prestashow.com>
// @license https://prestashow.com/license
return;
?>
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
kUgUKtlUJDT10mAjkhBIYG===
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
Gxedp/kq
<?php
namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider;
use PShowSsoScoped\League\OAuth2\Client\Provider\ResourceOwnerInterface;
class KeycloakResourceOwner implements ResourceOwnerInterface
{
/**
* Raw response
*
* @var array
*/
protected $response;
/**
* Creates new resource owner.
*
* @param array $response
*/
public function __construct(array $response = array())
{
$this->response = $response;
}
/**
* Get resource owner id
*
* @return string|null
*/
public function getId()
{
return \array_key_exists('sub', $this->response) ? $this->response['sub'] : null;
}
/**
* Get resource owner email
*
* @return string|null
*/
public function getEmail()
{
return \array_key_exists('email', $this->response) ? $this->response['email'] : null;
}
/**
* Get resource owner name
*
* @return string|null
*/
public function getName()
{
return \array_key_exists('name', $this->response) ? $this->response['name'] : null;
}
/**
* Get resource owner username
*
* @return string|null
*/
public function getUsername()
{
return \array_key_exists('preferred_username', $this->response) ? $this->response['preferred_username'] : null;
}
/**
* Get resource owner first name
*
* @return string|null
*/
public function getFirstName()
{
return \array_key_exists('given_name', $this->response) ? $this->response['given_name'] : null;
}
/**
* Get resource owner last name
*
* @return string|null
*/
public function getLastName()
{
return \array_key_exists('family_name', $this->response) ? $this->response['family_name'] : null;
}
/**
* Return all of the owner details available as an array.
*
* @return array
*/
public function toArray()
{
return $this->response;
}
}