Q29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMg0KQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5l
DQoNClJldHVybi1QYXRoOiA8ZGZoQGZvcmVzdGZpZWxkLmNvLnVrPgpSZWNlaXZlZDogZnJvbSBt
dGEwNy5teC5jaXguY28udWsgKG10YTA3Lm14LmNpeC5jby51ayBbMjEyLjI0MS4xNjguMTM3XSkK
CWJ5IHNjYW5kaXVtLnNhYnJlbi5jb20gKDguMTEuNi84LjExLjYpIHdpdGggRVNNVFAgaWQgaDVC
R3dFMTEwODk3Cglmb3IgPHBvYnJpZW5Ab3JidGVjaC5jb20+OyBXZWQsIDExIEp1biAyMDAzIDEy
OjU4OjE1IC0wNDAwClJlY2VpdmVkOiBmcm9tIGRlbGxob21lIChwcHAtMjI1LTktNzAuZnJpYWNv
LmFjY2Vzcy51ay50aXNjYWxpLmNvbQoJWzgwLjIyNS45LjcwXSkKCWJ5IG10YTA3Lm14LmNpeC5j
by51ayAoOC4xMS4zL0NJWC84LjExLjMpIHdpdGggU01UUCBpZCBoNUJHd0JNMTA2MzEKCWZvciA8
cG9icmllbkBvcmJ0ZWNoLmNvbT47IFdlZCwgMTEgSnVuIDIwMDMgMTc6NTg6MTEgKzAxMDAKWC1F
bnZlbG9wZS1Gcm9tOiBkZmhAZm9yZXN0ZmllbGQuY28udWsKWC1LRU5JZDogMDAwMDBCMkNLRU4w
NTBGNERGMgpSZWNlaXZlZDogZnJvbSAxNjkuMjU0LjIzNC4yMDI6NDMxNiBieSBLRU4hICgwLjAu
MC4wOjI1KSB3aXRoIFNNVFAKCTsgV2VkLCAxMSBKdW4gMjAwMyAxNzo1ODowOSArMDEwMApEYXRl
OiBXZWQsIDExIEp1biAyMDAzIDE3OjU5ICswMTAwIChCU1QpCkZyb206IGRmaEBmb3Jlc3RmaWVs
ZC5jby51ayAoRGF2aWQgSHVnaGVzKQpTdWJqZWN0OiB3eCBQYWNrYWdlIG1vZGlmaWNhdGlvbnMg
KDEvMSkKVG86IHBvYnJpZW5Ab3JidGVjaC5jb20KUmVwbHktVG86IGRmaEBmb3Jlc3RmaWVsZC5j
by51awpNZXNzYWdlLUlkOiA8bWVtby4yMDAzMDYxMTE3NTkwMS4xMzA0S0Bmb3Jlc3RmaWVsZC5j
b21wdWxpbmsuY28udWs+ClgtQW1lb2wtVmVyc2lvbjogMi41My4yMDE0LCBXaW5kb3dzIDIwMDAg
YnVpbGQgMjE5NSAoU2VydmljZSBQYWNrIDMpClgtU3BhbS1TdGF0dXM6IE5vLCBoaXRzPS02LjYg
cmVxdWlyZWQ9NS4wCXRlc3RzPUJBWUVTXzAxCXZlcnNpb249Mi41MwpYLVNwYW0tTGV2ZWw6IApY
LVNwYW0tQ2hlY2tlci1WZXJzaW9uOiBTcGFtQXNzYXNzaW4gMi41MyAoMS4xNzQuMi4xNS0yMDAz
LTAzLTMwLWV4cCkKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4
ZWQ7IGJvdW5kYXJ5PSI9PT0tPS09IgoKLS09PT0tPS09CgpIaSwgCgpUaGUgYXR0YWNoZWQgemlw
IGZpbGUgY29udGFpbnMgdGhyZWUgZmlsZXM6IF9faW5pdF9fLnB5LCB3eF9jcmVhdGUucHkgYW5k
IAp3eF9jb252LnB5LgoKX19pbml0X18ucHkgaXMgYSBuZXcgdmVyc2lvbiBvZiB3eC5fX2luaXRf
Xy5weSB0aGF0IGluY2x1ZGVzIGEgZnVuY3Rpb24gCmNhbGxlZCBfcmVuYW1lIGluY29ycG9yYXRp
bmcgeW91ciBvcmlnaW5hbCBwcmVmaXgucHksIHdoaWNoIGlzIG5vdyAKcmVkdW5kYW50LiBJdCBh
bHNvIGNvbnRhaW5zIGEgZGljdGlvbmFyeSBjYWxsZWQgX25ld25hbWVzIHRoYXQgaXMgdXNlZCB0
byAKcHJldmVudCB0aGUgJ3d4JyBlbnRyaWVzIGJlaW5nIGluIGR1cGxpY2F0ZWQgaW4gdGhlIHd4
LnN1Yi1tb2R1bGVzIGFzIApkaXNjdXNzZWQgZWFybGllci4KCnd4X2NyZWF0ZS5weSBnZW5lcmF0
ZXMgYWxsIHRoZSBvdGhlciA8c3VibW9kdWxlPi5weSBlbnRyaWVzIHRoYXQgYXJlIApyZXF1aXJl
ZCwgdXNpbmcgYW4gaW50ZXJuYWwsIGhhcmQtY29kZWQgbGlzdCAoSSBjb3VsZG4ndCBzZWUgYW4g
ZWFzeSB3YXkgCm9mIHNjYW5uaW5nIHd4UHl0aG9uIGFuZCBpZGVudGlmeWluZyB3aGljaCAucHkg
ZmlsZXMgd2VyZSBuZWVkZWQpLgoKSWYgeW91IGNyZWF0ZSBhbiBlbXB0eSBmb2xkZXIgY2FsbGVk
IHd4IGFuZCBjb3B5IGluIF9faW5pdF9fLnB5IGFuZCAKd3hfY3JlYXRlLnB5IGFuZCB0aGVuIHJ1
biB3eF9jcmVhdGUsIHlvdSBzaG91bGQgZW5kIHVwIHdpdGggYWxsIHRoZSAKbmVjZXNzYXJ5IGZp
bGVzLgoKd3hfY29udiBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gSSBzZW50
IGJlZm9yZS4gSXQgbm93IHVzZXMgCnRoZSBfbmV3bmFtZXMgZGljdGlvbmFyeSB0byBjb252ZXJ0
IGEgdHJlZSBvZiBzb3VyY2UgY29kZSB0byB1c2UgdGhlIG5ldyAKd3guIG5vdGF0aW9uLiBJdCBh
bHNvIHRyaWVzIHRvIGNvbnZlcnQgdGhlICdpbXBvcnQnIGFuZCAnZnJvbScgc3RhdGVtZW50cywg
CmJ1dCBJJ20gbm90IHN1cmUgdGhhdCBhbGwgdGhlIHBlcm11dGF0aW9ucyBoYXZlIGJlZW4gY292
ZXJlZC4gd3hfY29udiAKbmVlZHMgdG8gYmUgcnVuIGZyb20gb3V0c2lkZSB0aGUgc291cmNlIHRy
ZWUgYnV0IGZyb20gc29tZXdoZXJlIHRoZSBuZXcgd3ggCmlzIHZpc2libGUuIAoKSSBoYXZlIHRl
c3RlZCBpdCBvbiBteSBvd24gYXBwcyBhbmQgb24gdGhlIHd4UHl0aG9uIGRlbW8uIFRoZSBsYXR0
ZXIgCmNvbnZlcnRzIGJ1dCBhIGxvdCBvZiB0aGUgbWVudSBpdGVtcyBkb24ndCBydW4gYXQgdGhl
IG1vbWVudC4gU29tZSBkbyBidXQgCnRoZXJlIGlzbid0IGEgcGF0dGVybiB0aGF0IEkgY2FuIHNl
ZSwgbm9yIGFyZSB0aGVyZSBhbnkgZXJyb3IgbWVzc2FnZXMuIEkgCnRoaW5rIGl0IG1pZ2h0IGJl
IHNvbWV0aGluZyBzZWxmLXJlZmVyZW50aWFsIGluIHRoZSBjb2RlIHRoYXQgSSBoYXZlIApicm9r
ZW4uIFRoZXJlIGFyZSBhbHNvIHNvbWUgc3ludGF4IGVycm9ycyB0byBiZSB0cmFja2VkIGRvd24g
d2hpY2gsIEkgCnRoaW5rLCBhcmUgZHVlIHRvIHd4X2NvbnYgbm90IGJlaW5nIHZlcnkgY2xldmVy
IHdoZW4gbW9yZSB0aGFuIG9uZSAKc3Vic3RpdHV0aW9uIGlzIG1hZGUgb24gdGhlIHNhbWUgbGlu
ZSBvZiBzb3VyY2UgY29kZS4KCkkgZG9uJ3Qga25vdyBpZiBhbGwgb2YgdGhpcyBpcyBvZiBhbnkg
dXNlLiBJJ3ZlIGVuam95ZWQgZG9pbmcgaXQgYnV0IGRvLCAKcGxlYXNlLCBsZXQgbWUga25vdyBp
ZiBpdCdzIGEgd2FzdGUgb2YgdGltZS4gCgpSZWdhcmRzLAoKRGF2aWQgSHVnaGVzCkZvcmVzdGZp
ZWxkIFNvZnR3YXJlIEx0ZAp3d3cuZm9yZXN0ZmllbGQuY28udWsKLS09PT0tPS09CkNvbnRlbnQt
VHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtOyBuYW1lPXd4Q29udi56aXAKQ29udGVudC1E
aXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9d3hDb252LnppcApDb250ZW50LVRyYW5z
ZmVyLUVuY29kaW5nOiBiYXNlNjQKClVFc0RCQlFBQUFBSUFEeUZ5aTdYL1VnS3pnb0FBTUFoQUFB
UkFBQUFkM2hEYjI1MkwzZDRYMk52Ym5ZdWNIbTFXVzF2M0RZUy9tN0EKLzRId0lwQ1VyTlU0dlUr
TE9rQ1FhKzZBNHU2S05rVS91TWFDa3JpN3JDbFJKYWxvTjRmNzd6ZkRGNG5TYXQzY1M5WEdsc2po
Y0Y2ZgpHZEs4YnFVeVJPbzEwU2Y0WVhqTnJxKzRHOVZHOFdaL2ZXVmVrM3M3aytPUE5MdSt3djg4
VVgrOHZtcUJ6cEJFc0dadkRrQ2JyQW04CnAvMHgzemFzYjJqTnRGMjBrNG84c1JQaERYbElqT29Z
RUNZZi9lOGRGZHErZkxBdmp4dGlueFhwTkNNTk5md1RJOStmekVFMnBKRzQKYi81TklhVjRlMzJG
Wkh3WE9NZTdidHdrUGhVVGs2a0hJSCtjNkpHWEZLU3VxRnJqeDU1L3J0RXMrQ3BLMm55aS9rUHh5
cjRjbUdqZAppNm5GR25iNFpkak1EdzRVblBXOHNXOXlMK3h2YlVyN3UrZWZxWEw4anFxTWhSRzh1
TDVhclNZRE9TM1JETWRlMGJabFRrNDczRkFoCjk2V1E1Vk0wVmg2a0FwbFJydWU1TEM0WlZjR3Bv
ak5HTm5yZ1BqRVZEcndYdkh5aWhXQi9CY1YvNWswbCt5VStwUlN5VTFXeG5nNW8KSmxocGhzR0tv
ejc2ektnNDk2MVNVdjA1RVBoQjlzblUrMUdZSFdoeU11eG9Gam5zdUdDRmtyMW1UcXRoR2JxMmxw
K1kwcE9oUllQdwptdTQ5bDNGZk85Z1pMa1lHdk5uSm5ZS0FXeFFGMHFZMFNnelVncDVrWjNiRGQ5
MEp3elhWaDhYVnJXeTd0alRqY3B1SHdHQVlVS1htCm42Mkx6MWNydmo4WUt2aCtOSUErTURZdTFv
YWFpMFkwQnlXTEl0SWRvV0dpUzMvOFhranozbWZPQW92KzJINmtlektQenBvZmVSUnAKck9KR2p0
dTRlSUU0bFdENDVhVmppa1pqMWpXQ2E2dk51U3llQ2dsUUNjeThad25tN0ZXSHhpaG9VODFsY3ZM
UDFmQ2pWcXE1cnJuTApCaTZiT2ErSjhua0VTdWVURUFqaXdsUjdjdCtGUEM3NlpabmFmLzhPVHkx
NDlReFJDN0FCTVlXdzJ4L1JsbEFzSGg1OVlham02SjF6CncycWRaaDdGM1lvY1FhdXAwcWNxQzB4
eURUWnlaYWtCaHE4ZFAxenNPQ0tONTlHUVYvZmtMcmpYMVMySWY2VDkwakxtcVp4bk5DbGwKM1lK
U3pFcWZyT002ZVd0ZVF6blRyTlFKeWxaUXpiWXRkYXovc3ZtcVA3NlhEYUNOK2VvajArWU9hTml4
RkYzRnRoVlhRSk9TcEQ5aQpRZXlQMjdMRUY4VndUMEVML05DL0NSQTd5Ynp6VnVSdlAvMzRrWGdX
b0RXV1JHNEkxNlJnUXZiRWJnK2MxMFNhQTJBY2tTM0dHQlVvCm14M2E2cTdRc1BFL2lTdk9tMUNj
eHlycUgxK3NONkZZbnhIOEM1bTJYVk9paDEwZmtkdlBqdUttT1dnaWFNblNaSnVzazBHSDZGa04K
bW1oWUt4anBHZ2dzWFVyRlJzYjI5OGdydjhCcnhoaVNsRURkNDdJaUYxbTkvSEpXVkJ0Z3BxSHlV
aUh3bit4ZE1OaUFDVnRnYVJ4TgpVZE1uWmhSdGRHb253WnNrZVlteFpqK3pMTnFpcGkySkxFZktB
MVZRd05HQlJoTGRncmdhNHI2cnNheHBGLzRRMzdmL3h3Y1psb0pxClRkNTlnRTE4S3QwUTNKSEk0
bGNBSzNJTGlTQThiQkc1ZzlTU1lHUERRU1RGQklqZTdGSGVzbE9LUWZvQVpob28wdXpHOGFyWWpt
eTMKdk9GbXUwMEIvcUFDWWl4V0hJd1I5WEE0azRjSnRLWi9CWnhwVDJubUxZWWpHTmpxaElKMERj
ZUtUb1YxRnJSSThJYnJERGNka2xregpvajltMjdqOFJyRVJvc2o4V1JFTFg3QUJaRm90cXc2Tlh6
Q2tkeXRaOVlmNEFTMzFpV3R1MGtaU2hTMlFPWENOcUxJR0R6UUdqSXVDCkJhdmQzTnlRRHhnOTZC
YUFBdEJlUUhRV1lCcE5laXFlQ0VJbEF3dWR3RzRLL0NlVjdhSUhzSXFTbnplWWthamlDR1hjV0d1
UjkrUGUKdUE4ZHpHUEQ4aXZnclpGdEVEWW5aT1Q3OHhGRlJ5K2hsTHR6Y1VjWmYrdWdZOW1kVUFZ
YmZjQVNOeHFVZFM4ZVpNTm1iaEJsUnVUVgpzbVl3MCt3OWF2VUhaSVN6Ry9MY3M0TFVZK1VUd21w
Z1RFQXVDcnU1a05ZQnNxcFJOZWNZdjdYVXVkVmR0NERjS2I1bWtYRjNqZ3cwCmlzcEFGUHlXbmFz
OTMvcDlOc2w2cG1SNEZET2RhcVpqN2lzdWpWSEFiS1l5STNaRkV2OHFlWk9PZ1licnA2SUhRcTdS
TFdsZ2tUbXcKOVY4UHQxOXZIblBFUndYSmVnKytnSllnbWFuWUgxMHNtSkZKaVB1RnFTak1mNFIr
aURCYUhpQWlHb2FoaDgwcnFobW9jL0tEdzNkSApKa3VIUnFVbHBzMXA2UVE1Q2hmQlNzL0I5MUF4
Z3dFQjFxRXVWYTVHd1FRMXlHb1dsSHNoQzhDZWdOUnVrTm9vdm5mQW1vNVYyRnNYClRnOXVIc0Mw
R2JUR1RpRHhGS2lyYjZRY01kUXdXdUdvVGlkTWNqZ2VhaGJHL0dJUXhsVU0vSUtEUTlTUzRRakdp
aldtVFRPM1VlUXUKdTl6MVUySEl5Q2ZXZUM2NElpck8yMjFpNjF5VzI4b0hOWUdsUTJuTWZGSllE
RjhSKzBFQUF5QTVEWE5Wem9YU1dBa2pPV0FqS0JodwpYT213QU5vMDllMVphZzI4OWlTRGRJc05o
OHNacDdEMXNPL3hFc1IzdnVNbGRmVWlRaTZJZkx5TGNGc3Y1K3BQalMzOVdQdGM4TG9OClh0Z1c0
WVZPeUF1U29pSFhKSXIzbUU4QkRuMGFoeGowVzdPZG9tc1ZxKzVRSWhjQkRRcWtkQzBnOWhJTm5E
OEFTbFhBMFBnQjdhd1AKZHh6N2JYYkt5RnNJbHMwNUlUNVdxNW5UWWMxNkpwSzlkc25PNWJldXNS
VWkrR2daalZkZWFDeTdzd1FORHdKMDROWXZYd2JGRDhCRwp4U3VJUnBBK0puK3dUQjZYRjdtS2o4
RVdWajlzaHRkY1dZdEJQNXBkV0E0aWVnNkR6NForNDRLWStDeloyRXE1SHVXSWJPc1RPcHlZCmNK
bWZuUVVSM2prczQweWZaR2RrZWE4Z0tSM0UrQzBpb3FFVG5RS0R6d1ovNG5HbEsreHp2c09BVlE3
NG44bm9lYk5qcThDSVFoaGEKL2RGZkd3N1htbUNtR21BN0orK3FDak56R3FKWUNpSjlzQktHUkxI
UUR1V2VOQXphYm8yMXdBWXZsQUxGWEw5ank0THZjalVlZnBudApWUEtSNDJUVHNjM0VBZ1N4RjZU
MFBlVzQ3QWNIVDVTWURnNmNKSFdnczhZMTdsU1JrZHRKNkRnTHRWSnJYb2lUQnpFOG1tQ3hpNDBC
CnRqaE5Wbm84ZzF5SGtoYmdDMHhRQ2ViUHUwZHVJTFh2TnVRZjN3MjJkeTgwQ2xJM2dqQUNVZVZj
aFdVZjJIcXNUYWtUOG00b1ZSWGEKRFRvRDM1eWhkYUZVKy9vVGhTemYrWEYvb3JLRnd0YUpXZjU0
bGhDTlVIdWVoZEVaMEE3Q1c4RWZYai9hanNXWGhBR2NWbE4va1FlcQpiY2c4a29mNVNKN25FUnpv
Sjk2Q292YjhQSTdhYUxJd2FEZTkyenpPMWRuWmxRc2dzY3dRSDhoVjBNS0tUL1c4MzRxVzRtRi9h
U1hlCkJFTG1ZVTFNOFVvaVcyQVIzRTZuNExRR1Q2UHlXMmVNa0x4d3hBMUFCQnVrRXd2dmxLd1RZ
bS9TNGcyOFFSeE5TT2tGdWtENVp1S3YKN0t5YXJBaHVkQVlPM21tVFFJdWk5eTM1MHpPbmhCVUJI
Mzl4Qk9BVDhpQUJPSHo5ekgzRENqSlF1dHpEUGlRK1lneWxhTW5TemhhMwpkM0hKRGE0YWs4M3Ju
cEJYZ2Rzcmt2elNKUCt0ajJZQjQzMlYvYy9PQ2pYVGlRdld6Q2QrR3BRbDM3d2x5Y3Zrb3Flc255
eXdSODZhCmZwKzc2a0tFZTVVdkJicWZ6cklwczh2Sk9rT0FyODhRQUovTEtJRFBaZWI0L0M0YVJD
ek9FY0Z4T01QT2NZcmhpY0w0ZGg1Ym9HVkMKa0FGcDBWdm44QkxSWVZ1T2Y1UEJmcTlWYk1lUExo
UUVoWEtMSERDRW9leE8rNGo1RTdZQzBjTHJ3NXZOaGVZTW4xblRhbkFsS09NTwp3c2dpRzY3LzJo
YUtLOVRIK1prU2E1T3IvK00yMW5JWHRseU04WmRURWI4ZzErL20zZlYvbXU0THBkbDFZY3NCRHYr
ZlduYWZ2RXNtCmJWaTRZV040b3ArMFlUbDgyOCsxdFIrMDNEc3A4NEtxS1ZVWURFZUNVYWt3Yy84
MlhveVhUa0pMdk5tdHVjSDcrSFFSNEQxOU5zanEKWG14TzJMOUxoenYzUWRva3pzREJBMGdYNGVP
OFNBYk1XMW9hM1RNUGhIYkxKSHVHNHdWZVljVWtKV01wYy9TekdiVDBVM2hzZmZicwpNWnNKaHdp
M1BKdUVpbWNaUFc3YWhVMU5JV1dHMkNEK0JPRHY4OElsWHZqamhFc3BZYTlvdzMwazNpR3pZOGxh
TTdzY3MxZC9OMkV2Ci9CbXVvZkJtTXgydk1OMk42WnI4WFE0bklIOGVnV080TzYyVTRXQmlqK1g1
R3dCWUJtT1ZPNkNIUTgza3p6dmtsaGlvMlgvSU5TL0gKKzNDYmJsdUwxTnN0bW5HN0RYanRqSHA5
OVc5UVN3TUVGQUFBQUFnQWFITERMb1RXaUlpbkF3QUFnUWNBQUJJQUFBQjNlRU52Ym5ZdgpYMTlw
Ym1sMFgxOHVjSGwxVlcyTDR6WVEvbTd3ZnhqY2hTUmN6cmZKSFpTbVRXa0w5K0c0YTI5cGwzNVpG
cU5ZNDFnWFIzSWwyWWtwCi9lK2RrVitTWExlR0VFdWFlZlRNTXk5T2t1UjBobHJrQjdISE9JcWpC
MnRhSmRHQmdKUG93QnVRMXRUZ1N3UTJ0RmlvTXhUV0hHbjUKMFBuU2FEQzdMNWg3bDdMN0IrM1Jh
bEZWM1pMdGM2TzlVTnFCMFFoRm8zT3ZqRjVDVGdZb0liT294UkdYSUxSa2l6aVNLbGdJMjEyTQpO
SjdZeXFYd1dLSkRFQmFoY1hTeTYvZ0s1UjFXQlVQRUVlM1FFbHl6ZTMwMHNxa29qRk9KR2x1MEhF
RVhmTld4TnRhakRIZ2poemdhCjJVRmVDcjBuVHc0NVhBeEtoMFVQQ1R0VWVqK2h4SkhJYzJNbDc1
RlliR2ZEeGI0VUhrclJzZ05xa0ppVHJCSXczYWVFNUh3Y1RYcXkKMmtUTTR0RzB4SXQxRE5UR3lP
RWlDNVNta2owM2h4NU1BV1EwMEp3UGFlbTErUG5UcDJzaEZrczRZTmVyeHQ3R3FyMmlSQVZmbGtL
UgpibWhiWm40eWNWUTN0allPM1JKa1UxY3FGNTU4S25sUlJLcWlRQkxQd3lnMXg0Q1ZPaElzQ2JP
TW84Q3lzYTFxalIxa0cwVmxoQ2w1CjM0Y0M0S09yUUpVTDBxSnpha2VxazdaNDdtc0xYRzVWN1Rt
M3hCQUdwdVRBUm4zMndPUjVZNGtkK2NjUnFjVGdsQ2FMcmpZNkpHc0sKUk5SOWZKejcycHE5RmNj
aGUxUmxSRExrSTBrUy9zc3kwVkROMnl5RExTUVB3bHVWSCtCakNwOW52MWhGYWY2aE5qdCsrY25Z
bmNlOApUSE56L0RGaHg3eDFTdlorZHgva0JySk1hZVd6TEsyN1pRdXJkSld1MHpXczcrL2Z2cmwv
OStidFBhemViVmJmYlZiZndzUEh6L0QrClhNTmR3TEhZS2tkY0I2amZoK1ZtZ3JoTG5sYXJ6ZXYx
TXhPKzdkUythR2tkWXBuS2F3dC8vOE03RW91eEgrYVNqeW41R1NWOU9hU1kKRDdhL1VhTXVObkVF
OUNTa2FkMWRkVXE0THZpRXljRVk4SEovSkQzQ3ZqSTd5dWpFcGQ4ZGVQcXVIbmVHd2JPRkdTVmtO
bGdWVjd3RwpSbGUycjdaWHgvQUtacU5mUWRVWW9xTEJGU3FaK2FiSzQ5SE5GMWM0aE04TTVtUzJD
TlhGZE5KZkErWWp2VU9Qa3pvdnJIY241Y3Y1CkxKdGRJL0R6RGZ4eFVQV2xTYWpTYTZ0YTdxZCty
TjJhODhSVXVzRWJHbC9mY2pyUEZnRkpHLy9DNGZzL0gxL2kwYzhYb0xFSzE2TUgKenpuV1hCVHNC
cmRPbkw4dDMvQzAzanhmanJCeStCOTRJV202MGFTbFV1TmtzdzNRVEEzOUtQOEg5aWJLSVJoT3lW
UVBYOTBTS3VxSgpmcy9zdi90eWV6cDVQUkVNVzR5VkVDNE1UMCt6YU9nREJYODFvbEtGb3BrNHps
Q3UwTXFZUTFOVDczTVE0OFFENFhoOGNwT3dqcjF0Ci8wa01GOUlIRklkaEZscHJhS0srdXFtcStH
T1laaG1QdHl4YmNLZFZReGYrQzFCTEF3UVVBQUFBQ0FDMmpzc3VDUllnNWpJRkFBQjUKRFFBQUV3
QUFBSGQ0UTI5dWRpOTNlRjlqY21WaGRHVXVjSG1WVnV0djJ6WVEveDRnLzhQQmJTQWI5ZFE0ZXdG
R1V4UmJDM1RZaHhWRgpnWDNJQW9PaUtJa0xKV29rNVVmLyt0MlIxTU5PYld4R0VKSEh1OTg5ZWJ6
WmJBYTdQYlNNUDdGU1hGOWRYKzMyRzI0RWN5SnREd0N3Ck05STUwVUIyZ1Bkc0szUDQySldWc0FC
djhxSjZWMmdqckN1a1VIbktkZG85dlNXSUw1VzB3RHFuYStZa1owb2RJRUFpVlNsd2xZQmEKNTUz
Q3ZhdVlBMllFR1BGUEo0M0lRVGFlWVdvVWtsaWVTeWMxbm1uWWJHUWozV2FEQmdadFBSdzByQ1lk
Q01kMTQ1aHNBdDV1SDg0MwpTbG9IbVZCNkI2ekpVUS9hU2JUcksxdnBUdVY0QmdJVm9SanFNYUpR
Z2p2Z0ZXdEt4STJXV1djNjdqcFVvZ3VFN2swZ2phSnhSQlNNClY3MUpjd3BqSVpWWUFDcHo3QWxq
V1JoZGowWTVVYmNLZzRPaGw2NEMxclpHdDBZaUJXeVhXU2RkNXoxSFlGSi9RMDdlb0gySVpFbjUK
YkRhamo2eGJiVkM5WFlJOTJKREpFdzF3RDU1NTlzbG9UQ1dGQ25ic1FMN21xSE9JT3pvdTk3MlZu
dzZ1SXUzWjN4Z0xtM3BkbXcxbQp0OUptc3lISVQ4d1p5Wi9nOXhUK1NINHhFajE4MCtxTUZ1KzB5
WnpnRlJaSC9YWkdnbnhyWlI3a1h2NldyK0hHZGdWcXU4RXdKY3N0CnJOSlZlcGV1NE83Mjl2dlh0
ei9nSDZ4K1h2KzRXdC85QkovZnc0ZDlDeTg5amhGYmFURXNFZXB6M0s0SGhKZXpoOVZxL2QzZEl4
a2MKZllFWUpKU21LQTcwNE9OTmNQeW01K3BOUTNXQmYxNHFuVEZsNTR2bGFQZG1rMHVPMWJpTUdT
ZkcreVJrS1ZsY1grVkNUWkJpc2pDeApzYnBEVGQ3REF5Uktac25TZjlKYTdtVmoreDJWcERiOWpt
dWxPOE1ycmEwd3llTlJwa2V3MHNpY0pFckZXYk5sSHF1VVgydnRWM2dwClJaTXpqMWtKMWZxdnEx
V3l2TDZDWno5LzFMTkpzWk1OTFhTcDZHTWRwODlPZm1YR2E5d2JmZ2FHckdmY3lhM1k3d3pXdVNE
OWtkeWcKUTJid09PdWMweFNBc3poVEQyai9xOElTWkprU0g5SFdQMldUNjkxeHdQTHNFcHBuc1lM
dWV5K1dTNlowT1pqMHdSaHQzdmUwczBoaQo2K3B5c0twQXZ3NU83QWRRNmdTWjBUc3Jnb3NYa0Np
RHRkNktNU3BFR1RheXh1b0pVT1lDaW1mREJxSkd3YWJRaGNIeUhBbU9PM011Cjk4U2gyRUYzcmhp
cXMxTk9XbWFybnREcXRtdTV1d1NCSGExeENOS0xHRzdsVnpFRXlzaXlja3pKOGxKRWJDWEVBR0Fk
YzlQSXVzcm8KTExzWUN5ZHJFVHdOZTd6NFNydGZoL3NSYU8wWFZ1THVMRXE0bTJsL3dTWWtIMnU2
Z2hkc2lLekVOVFVsa2sxSExtVDRPRjBxTWQ4TwpUcnBDSkhvVFRocEhHdXBhWHF5Mm82NlM4cU9Z
SEo5aEhpOGwrcGk1UFlSOXB2ZmZSdXNaK243MmY0R3R3b2ZzMjcwUmVWcnNFbGdsCkNUeCtDeFlm
elFJZnpMUmxya296WmtPVFIwSXBITi9sODhVQzNyekYxclpQMWtIY0Z6RWtmcjZwT3o5TGdPbmln
NDc1UTFQOEkrcVkKUVFpWTdmWXp5SEdxNFppRlF4SXc4SEZPeFY2NitjSS9UTm9Bemhza0RTZVB3
bm8wOUVXY242YWpENUFvVFJvUnRzdFFFL1orUWt1Tgp3QWVmaTNtU0pzdmtOVDFEeElQZU50b05I
cU1WMXRsNWtGeXN4d2doUS8yRXRQNW9rTzRscFoyY1RnUUxDaURhRUkxNUJjbnJpY1hKCnlEakJp
bFo0MFNrVy9XaW1razBuUnFwUVZwd3dGYWhRdDZJSkVQUVU5ZjRPSENsTnNXSStld0Z4bW9seC9x
dVpQV1BsQ210bkhza24KNmtMK1IrK0M3WUN0bklZN2lpMTdsbS82UGMrNUQ5VHBhTnBYR1RwRTU2
a3A4QjJqSEk0WmFPRU4zQjVaNUdlMWUwaW02dnkwRVZITwpPTktMcFFrNlFud1A2L2J4RE1SRCsy
cTFqb2ZoZnovczNqOGZZOGZhaXpQUTBtTXNUZ1hqYXNJZXh5OFVDS3YvSUJMbktoUUpxeWpTCjEy
R0k0dVF1QUYwR3l0eFlqdWZMcHkrYnFIYWdIbFZJS0ltZ0VISGpSYzBUUCtWTjBqN0dqazZ1ci80
RlVFc0RCQW9BQUFBQUFCQ0wKeXk0QUFBQUFBQUFBQUFBQUFBQUhBQUFBZDNoRGIyNTJMMUJMQVFJ
VUFCUUFBQUFJQUR5RnlpN1gvVWdLemdvQUFNQWhBQUFSQUFBQQpBQUFBQUFFQUlBQzJnUUFBQUFC
M2VFTnZibll2ZDNoZlkyOXVkaTV3ZVZCTEFRSVVBQlFBQUFBSUFHaHl3eTZFMW9pSXB3TUFBSUVI
CkFBQVNBQUFBQUFBQUFBRUFJQUMyZ2YwS0FBQjNlRU52Ym5ZdlgxOXBibWwwWDE4dWNIbFFTd0VD
RkFBVUFBQUFDQUMyanNzdUNSWWcKNWpJRkFBQjVEUUFBRXdBQUFBQUFBQUFCQUNBQXRvSFVEZ0FB
ZDNoRGIyNTJMM2Q0WDJOeVpXRjBaUzV3ZVZCTEFRSVVBQW9BQUFBQQpBQkNMeXk0QUFBQUFBQUFB
QUFBQUFBQUhBQUFBQUFBQUFBQUFFQUQvUVRjVUFBQjNlRU52Ym5ZdlVFc0ZCZ0FBQUFBRUFBUUE5
UUFBCkFGd1VBQUFBQUE9PQotLT09PS09LT0tLQoKCgoKLS0gClBhdHJpY2sgSy4gTydCcmllbgpP
cmJ0ZWNoICAgICAgaHR0cDovL3d3dy5vcmJ0ZWNoLmNvbS93ZWIvcG9icmllbgotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoiWW91ciBzb3VyY2UgZm9yIFB5
dGhvbiBwcm9ncmFtbWluZyBleHBlcnRpc2UuIgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQo=
David, if you are not already on wxPython-dev please join for further discussion on this subject. wxPython-dev-subscribe@lists.wxwindows.org
Patrick K. O'Brien wrote:
From: dfh@forestfield.co.uk (David Hughes)
The attached zip file contains three files: __init__.py, wx_create.py and wx_conv.py.
__init__.py is a new version of wx.__init__.py that includes a function called _rename incorporating your original prefix.py, which is now redundant. It also contains a dictionary called _newnames that is used to prevent the 'wx' entries being in duplicated in the wx.sub-modules as discussed earlier.
wx_create.py generates all the other <submodule>.py entries that are required, using an internal, hard-coded list (I couldn't see an easy way of scanning wxPython and identifying which .py files were needed).
Cool! I have been thinking of doing a script like this, but hadn't gotten to it yet. BTW, I think it wouldn't hurt to just generate a stub for each .py file. They are all probably going to be there when phase 2 of the rename happens, and then there is much less possibility for forgetting something. For example there are already several packages/modules missing for the current CVS.
So I think I'll change it to just scan the filesystem for the wxPython pacakge. Thoughts?
If you create an empty folder called wx and copy in __init__.py and wx_create.py and then run wx_create, you should end up with all the necessary files.
wx_conv is a modified version of the program I sent before. It now uses the _newnames dictionary to convert a tree of source code to use the new wx. notation.
Good idea.
It also tries to convert the 'import' and 'from' statements, but I'm not sure that all the permutations have been covered. wx_conv needs to be run from outside the source tree but from somewhere the new wx is visible.
I have tested it on my own apps and on the wxPython demo. The latter converts but a lot of the menu items don't run at the moment. Some do but there isn't a pattern that I can see, nor are there any error messages. I think it might be something self-referential in the code that I have broken. There are also some syntax errors to be tracked down which, I think, are due to wx_conv not being very clever when more than one substitution is made on the same line of source code.
I won't look at this real hard yet (but will include it in tools) as I've decided to not convert the whole demo until we have the new reference docs ready to go. (I have converted a few modules but have added a comment that "this module uses the new wx namespace" so people will know that something is different...)
I don't know if all of this is of any use. I've enjoyed doing it but do, please, let me know if it's a waste of time.
Definitly not a waste.
···
--
Robin Dunn
Software Craftsman
http://wxPython.org Java give you jitters? Relax with wxPython!
Robin Dunn wrote:
wx_create.py generates all the other <submodule>.py entries that are required, using an internal, hard-coded list (I couldn't see an easy way of scanning wxPython and identifying which .py files were needed).
Cool! I have been thinking of doing a script like this, but hadn't gotten to it yet. BTW, I think it wouldn't hurt to just generate a stub for each .py file. They are all probably going to be there when phase 2 of the rename happens, and then there is much less possibility for forgetting something. For example there are already several packages/modules missing for the current CVS.
So I think I'll change it to just scan the filesystem for the wxPython pacakge. Thoughts?
Okay, I compromisd a bit and changed it to have a list of module names to exclude, and then scan for everything else. I'm checking wx_create.py into the wxPython/distrib dir, and a new set of files under wxPython/wx as generated by wx_create. Please take a look if you can.
···
--
Robin Dunn
Software Craftsman
http://wxPython.org Java give you jitters? Relax with wxPython!