1.MVC的执行过程
用户 ----》控制器---》ViewData进行传值---》视图(进行显示)
2.Controller中的Action 主要进行的作用:
1.处理用户的请求Request和Response
2.调用业务逻辑层
3.把数据传给View进行展示
3.ViewModel的作用:
1.页面需要的字段实例化
2.跟页面的表单和展示的内容相关
4.Asp。Net MVC 的应用周期
1.生命周期就是Http发出请求开始,到得到相应结束
执行过程中每个控件的角色:
1. UrlRoutingModule: 应用程序的入口(发起一给请求,会被UrlRoutingModule拦截)
1. 1UrlRoutingModule实现了接口IHttpModule UrlRouting module会从路由表中选择一个相匹配的路由规则。
1.2 UrlRouting module选择匹配规则
1.2.1.在App_Start文件夹下面有一个RouteConfig.cs类 主要是给路由表添加路由规则 里面有RoutCollection属性(路由规则的匹配有顺序,多个进行匹配,只匹配第一个)
2.RouteHandler 生成MvcHander
2.1 MvcRouteHandler实现了IRouteHandler 接口
2.2 主要是用来获取对MvcHandler的引用
2.3 MvcHandler实现了IhttpHandler接口。
2.4 MvcRouteHandler 被创建的时候,就会调用PostResolveRequestCache()方法。
PostResolveRequestCache()方法主要做的工作如下:
1、PostResolveRequestCache()是在UrlRoutingModule类里面,UrlRoutingModule类里面有一个RoutCollection属性,而这个属性有一个GetRouteData()方法,
我们看到PostResolveRequestCache()方法中恰好调用了GetRouteData()这个方法,然后返回了一个RouteData对象。
2、RouteData里面有一个IRouteHandler类型的属性RouteHandler ,而调用GetRouteData()返回的RouteData对象里的RouteHandler就是MvcRouteHandler。
3、MvcRouteHandler类有一个GetHttpHandler方法,返回的是一个IHttpHandler类型的对象,返回的就是对MvcHandler对象的引用,绑定到一个MvcHandler的实例。
3.MvcHandler
MvcHandler就是最终对request进行处理。
我们可以看到MvcHandler就是一个普通的Http Handler.我们知道一个http handler需要实现一个ProcessRequest()的方法,这个方法就是处理request的核心。所以MvcHandler实现了ProcessRequest()方法。
调用了一个ProcessRequestInit()方法,
在ProcessRequestInit()方法中首先创建了ControllerFactory()的对象 factory.然后ControllerFactory创建了相关Controller的实例.最终调用了Controller的Excute()方法。
4.ControllerFactory ControllerFactory实现了接口IControllerFactory.
controller对象实际上使用ActionInvoker来调用Action方法的,当Controller对象被 创建后,会执行Controller对象的基类ControllerBase类里面的Excute方法。Excute方法又调用了ExcuteCore()方法。Controller类里面实现了ExcuteCore()方法。ExcuteCore调用了ActionInvoker的InvokerAction方法来调用Action方法。
5.ActionInvoker 方法有很重要的责任来查找Controller中的Action方法并且调用。
ActionInvoker是一个实现了IActionInvoker接口的对象:
Controller类里面暴露了一个ActionInvoker 属性,会返回一个ControllerActionInvoker 。ActionInvoker通过CreateActionInvoker()方法来创建ControllerActionInvoker对象。
ActionInvoker类需要匹配Controller中详细的Action来执行,而这些详细的信息是由ControllerDescriptor 提供的。ControllerDescriptor 和ActionDescriptor在ActionInvoker中扮演重要的角色。这两个分别是对Controler和Action的详细描述。ControllerDescriptor 描述了Controller的相关信息比如name,action,type等。
ActionDescriptor 描述了Action相关的详情,比如name,controller,parameters,attributes和fiflters等。
ActionDescriptor 中一个中要的方法就是FindAction(),这个方法返回一个ActionDescriptor 对象,所以ActionInvoker知道该调用哪个Action。
6. ActionResult
所有的Action方法有一个特性,就是返回一个ActionResult类型的数据。
ExecuteResult()是一个抽象方法,所以不同的子类可以提供不同的ExecuteResult()实现。
ActionResult执行后响应输出到客户端。
7. ViewEngine
ViewResult几乎是大部分应用程序的返回类型,主要通过ViewEngine引擎来展示view的。ViewEngine可能主要就是生成Html元素的引擎。Framwork提供了2种引擎,Razor View Engine 和Web Form View Engine.如果你想自定义引擎,你可以创建一个引擎只要实现IViewEngine接口即可。
IViewEngine 有下面几个方法:
1、FindPartialView :当controller需要返回一个PartialView的时候,FindPartialView方法 就会被调用。
2、FindView
3、ReleaseView :主要用来有ViewEngine释放资源
当ViewResult的方法ExecuteResult被调用后,ViewResultBase 的ExecuteResult 方法被调用,然后ViewResultBase 调用ViewResult的FindView 。紧接着ViewResult 返回ViewEngineResult,之后ViewEngineResult调用Render()方法来绘制html输出响应。
另一种解释:
当一个asp.net mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在asp.net mvc应用程序Http request
和Http response 过程中,主要包含8个步骤:
1)RouteTable(路由表)的创建
2)UrlRoutingModule 请求拦截
3)Routing engine 确定route
4)route handler 创建相关的IHttpHandler实例
5)IHttpHandler实例确定Controller(控制器)
6)Controller执行
7)一个视图引擎创建
8) 视图呈现
主要流程图如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlAAAAHsCAIAAACSYASBAAAgAElEQVR4nOydeVxTV/qHmVa72ekyv+ky2tZpO+04ta12uteudlfb2k61Vq21al1w17pvKCAoi+yyC7Irsglhh8u+ExIgJIEQSICwhyUEspD39wdggywGSLiX5H0+3786Mp+jZ3nOPe+5FyNAEARBEAPAiOwGIAiCIMh0gMJDEARBDAIUHoIgCGIQoPAQBEEQgwCFhyAIghgEKDwEQRDEIEDhIQiCIAYBCg9BEAQxCFB4CIIgiEGAwkMQBEEMAhQegiAIYhCg8BAEQRCDAIWHIAiCGAQoPARBEMQgQOEhCIIgBgEKD0EQBDEIUHgIgiCIQYDCQxAEQQwCFB6CIAhiEKDwEARBEIMAhYcgCIIYBCg8BEEQxCBA4SEIgiAGAQoPQRAEMQhQeAiCIIhBgMJDEARBDAIUHoIgCGIQoPAQBEEQgwCFhyAIghgEKDwEQRDEIEDhIQiCIAYBCg9BEAQxCFB4CIIgiEGAwkOQ8VD0q3rk/bdFqVKR3S4EQSYMCg9BxiOK0/pft8LbUlDfRXa7EASZMCg8BBkFiVxpnl67J7ZyVRBjoS0xkH9ZE/MuEPMuED9fL9sTW+lSUE92MxEEmQAoPAQZBqelO5rd7F0ses05Z64l8col4hs3YpUn8Z078ZkL8Z4j8Z4jMe8C8Yg5scSjMJTVIu5VkN1kBEE0AoWHIMOwSef904r4qxnxmQvxnTvxnTvxPw9ihx+xxov4zp341p1Y4Ua860i8Zkc8b0389XxGQlW7RKYku9UIgtwZFB6CDONYEu8flsTnl4mNPsTvV4nfrxI7/AiTa8TeAOL3q8RGH+IbN+JrV+J9J2KBDfGYBTH/Us5VRiPZrUYQ5M6g8BBkEJUKzhI1n3sXfORM/OZDHAkiToQQJ0IIk2uESyRhHkqcCCEOBRG/+hAbrhAr3Yn3HIkXbYi/WxDvexU552M9D0GoDgoPQQbpV8F7XsX/sSFWeRI7/Ymz1wmbMMIhgnCOJAJiCdcowiGCsA4jDgURu/yJtd7EZy7EIjviqQvEA6bEz6EsspuPIMgdQOEhCABAj1xZ2iR5z6Nw0aU/hecaRfjTiMBY4kY8ERRL+NMIr2jCIpTYF0Cs9SY+v0y8YU88a0U8ZE6sCGRyWqVyJb6fhyDUBYWHIAAA2cLORywzlzilLXMdJrwB20UnEeEJRHDcMOGtcCO+dh103t8t0xY6Fwg7+8j+eyAIMiYoPAQBAEiv7fiLCbHEkfjJa/CWiksk4UcbtF1SCkFLIsITiMBYwuMmYR5K7A0g1nkTy92INx2I56yIR8yJp21zajtQeAhCXVB4CAKgJrwfPYktvsSJYMI+gvCNIa7HEzcTiYQUIiaJuBFP+NMIl0jC5Bph7Ef85IXCQ5CZBAoPQQCGhPeWA/H1iCPNAecNlPHUjzSXuQ7eW/knCg9BZgIoPAQBAEiv7TAyIV6wJj5yHiY8PxrhTyOuxxOBsYTf8Esrt25pPmmJwkOQGQAKD0EAxhDexRuETRhhF0H40QjnSMImbNB2O/1ReAgy80DhIQgAgLCzzzKjdrFz7kJb4ovLxHpv4kAgcTiIOBxEnAgh7CMIk2vE4aDBZ7ufvYnlbsRbDsTz1sTcC8Sj54m33QtdCuo7+/AbYwhCXVB4CDLIwIvncy8QbzkMOm+jD7HRZ/AOi7EfsdGHWH+FWOFGfHGZeM+R+I8t8aQl8aQlvniOIDMDFB6CQG8vtLdDaxt8eoX5T+v0Vy4Ri+2ILy4Ty1yJ5W7ESnfid19ilSex3I1Y5koscyXedCBevUQssCGetCSesCT+zzJ9SxSH7L8EgiB3AIWHIODhAQsXwssvQ1hK79Yo9kPmxDMXidfsiDcdiA+ciG/ciJUexLfuxFIX4k2HwfcQnrpAzLtAPGFJ3GdKnErh4yvnCEJ9UHiI4VJfD/v2wbZtcPo0uLqCmxs0NkKusHNXDHeOGfHMReI5K2KhLbHEaTCL7YjnrIjnrIi5F4gnLYm/WxCPWKSfTuGXNUvI/qsgCHJnUHiIgcLlgosL/PYb/PILhIQM+5+KGrp/ul7+lHXmw+bEk5bEv20G80+rwaLdo+eJh82JF+yzt0Rxajt6SfobIAgyMVB4iGGhVEJtLfB44OAAX30FnZ2j/zFxr+JzP8Zz9rlP22Q9ZkHclvm22c/Z526MYE9v2xEEmRIoPMSwaGyEt9+GuXNh1y5obob+/tH/WL8KmiTy+i6ZXa7wrrPEbQktb67vkrVK5dPbdgRBpgQKDzEUrlyB1athwwa4cgVCQqCwUKOf4ot7Q8qab0uTBFWHIDMPFB6i/ygUEBQEp07Bnj1w8iS0tpLdIARByACFh+gzDQ1QVAS5ufD99xAYSHZrEAQhFRQeos+YmcEDD8Df/gbZ2aBQkN0aBEFIBYWH6CFcLqxYAV98ASYmEB8PSUlj3sZEEMRwQOEh+kZuLpiYwJkzcOYMpKaS3RoEQSgDCg/RE6RSyMiApCSwtITt26EPP/WFIMhwUHiIPqBUAocD8+fDvffCwYNktwZBEEqCwkP0ARoNvvoKEhMhPx9qa8luDYIglASFh8xgpFK4cAH274cTJ8DLCyT4DWcEQcYGhYfMSEpLITQUgoJg0yb43//A3p7sBiEIQnlQeMjMo60Njh+HJ5+EF1+EigqyW4MgyAwBhYfMPNasAXNzqKwEHg9kMrJbgyDIDAGFh8wYaDTYuBE2bgQ7O2AyyW4NgiAzDRQeQnXEYvDzAw8POHcOtmyBLVuAyyW7TQiCzEBQeAilEYshMRHefBMWLAArK7JbgyDITAaFh1AaPz946y2orISWFnzrAEGQKYHCQ6iIWAzbt8N338GhQ5CcjDdTEATRAig8hFqkpMDFi2BpCUePwqFDcP062Q1CEERfQOEhVEGlAiYTjh6Fd9+F5ctBICC7QQiC6BcoPIQqyGTwzjtgYwNKJSiVZLcGQRC9A4WHkI+vL3z0ESxdCgEBIBSS3RoEQfQUFB5CGg0NcPYsnDgBZ86AmRlYWEB9PdltQhBEf0HhIeRQUwO+vvDdd7BsGVy9SnZrEAQxAFB4yLTS3w/d3dDZCQ4OsGQJvlqHIMj0gcJDppWGBvjiC3j1VThwALhc6O8nu0EIghgMKDxkmggKAmNj2LsX7OzA2RnS08luEIIgBgYKD9E5cjnQaHDsGKxdC7t3Q2sr2Q1CEMQgQeEhOqSjA2proaICli7FmykIgpAMCg/RIRcvwtNPw7//DSkp0N1NdmsQBDFsUHiIrjh3Ds6ehcBAuH4dxGKyW4MgiMGDwkO0DJ0OTk7g5ASHDkFsLNmtQRAEGQKFh2iHvj4oK4OSErC0hEWLYNEiKCggu00IgiBqoPAQ7VBVBc89B3/9K/zxB3R1QVcXfgAaQRBqgcJDtEBCAvz8M9y4ATQaVFSQ3RoEQZDRQOEhk6enB1xdwcwMzp4FW1v8ThiCIJQGhYdMhqoqSE2FmBj48Uf4+GOwtCS7QQiCIHcChYdMGKUSDh2CWbPgySeBzSa7NQiCIJqBwkMmRn8/bNkC589DTg4UFoJUSnaDEARBNAOFh2hKcjL88Qf88QecPw/5+WS3BkEQZIKg8JA70NkJ0dEQHg7nzsHKlfD993iMiSDIjASFh4xHby9kZcGzz8Lf/w5mZmS3BkEQZAqg8JDxCAqCL76A4mJgs6GlhezWIAiCTAEUHjIKYjEcOQKbN8Px4xAWBjIZ2Q1CEASZMig8ZBi5ueDtDa6usGMH/PYb+PqS3SAEQRAtgcJDBlGpoLYWDh6EF16A998HoZDsBiEIgmgVFB4yiFQKn30GtrbQ2AgtLfjpZwRB9A0UHgLBwfC//8Hq1eDhAZWVZLcGQRBEN6DwDJfGRrC3BxsbOHMGDhyAI0fwGBNBEH0GhWegNDbC9evw3nvw1lvg4UF2axAEQXQPCs9AcXSEt9+Gzk6QybBchyCIQYDCMywaGuDHH2HpUjhyBAoKoL+f7AYhCIJMFyg8A4JOh9On4exZOHsW4uLIbg2CIMj0gsLTf+RyyMqC+Hi4dAk2bIC2NrIbhCAIQgYoPH1GJgOJBOrr4b//hTlz4PffyW4QgiAIeaDw9Bl7e3jtNViyBKKjobgYamrIbhCCIAh5oPD0lkuX4OxZcHAAd3c8xkQQBEHh6R0VFRAcDMHBYGwMERFktwZBEIQyoPD0BIUCGhqgrg4sLGDePJg3D/LzyW4TgiAIlUDh6QmVlbB4MTz7LBw7BtXVUF0Nvb1ktwlBEIRKoPD0gdRU2LYNvL3Bzw+Ki8luDYIgCCVB4c0MoqNHOaLs6YHAQLh8GczNwcQEJBIyWoYgCDJDQOFRnd5eKC+HJUtg+3aorh78jyIRlJZCRgZ8+im8/DKcOUNmCxEEQWYEKDyqw2DA3Lkwaxbcdx98++3gfzx2DB55BF54AUpKQCyGnh5Sm4ggCDITQOFRmps34YMP4O67wcgIjIxg6VJQKGD/fjh/Hm7ehIQEPMZEEATRFBQedYmMhG+/HVTdQJ5/Hiws4MQJyMggu3EIgiAzDRQeFenrg/x8+PTTYbYbyD334At2CIIgkwGFR0X4fHjqqVFsNyC8vDyy24cgCDIDQeFRjvh4eOMNuOee0YX3l7/AokUQHEx2KxEEQWYaKDxqER4OK1aMrrqBGp6lJVhaQkEB2Q1FEASZaaDwqIJCAQQBy5aNrrq334ZvvoETJ8huJYIgyIwFhUcJ5HKorYWFC4dJbs4cePTRwSQnk91EBEGQGQ4KjxKkp8OCBXDffcOEZ2UFZWWD6e4mu4kIgiAzHBQe+YSHw9dfD0pu7VpwcxtMVRXZLUMQBNEjqCu8VL7Yt6TREPLtqUajRYP51VajH2E1G9DHxDr6FMFlzaR3EzXjz2xqlcrJ7iJNKRZ1k/4vRtlkCzvJ7h/9h3LC6+pT8tp7ee2968MqnrPPHZlndZZ/Ti3ztZFnNMuFLAGvvbemo1feryK7x3RIs0TOa+9N5YsXuxZO52CY4kiYzsHwL6d8WmUbr723USIju7vGpE/RX93ey2vvPZnCH7Uf9bsrNZzUO2iVA0tfj1xJdo/pLZQTXmBp01yb7Lk22QHMprou2a0I1SIYkdqh1KiFr5ZqtfDUUqWWSrVwh8IZHvZQKobCGkp5l6y8S1Y2PKVdstIuGXMojKGUqIWuluKhFHXJirpkhUMpGEp+lyy/S7Y9gTfXJnuRayFfrM+/5nVfXNVcm+z3vIrLW3o0HAm6GwwcjQdD+WiDoXSyg6Fo3MGQJe790Jcx1yZ7600O2d01JkUN3U/b5sy1yTZNq5nmST2hrhxrUo/flROd1EVjTGrz/PqBpS++qp3sHtNbqCU8l4L6w4m8kLLmkLJmYVefCqBfLUq1KNQiB5ADyNTSp5ZetUjV0qMWiVq6AboBugC6ADqHp2MoYgAxQPtQ2gDaAFrV0jKUZoBmgKahNA5FBCACaFBL/VDqAOoAhEMRDKUWoBagBqAGIEbU7VjWbFvSuCGSTdSIye437dPRq9gTW3kxSxBS1kyrbOtT9qs0HglTGQwjR8L4g0E8fDC0TXwwiCY+GGrVBkO1SuXHa3csaz6TLdx6k9NEvee8KE7r9mhucFlzSFlzeXPPhCa1nOxJ3TZ2PzaPMalFY/dj3biTOr2917Gs2bGseXtspT+zkex+00+oJbxNkexNkWwVwEBIsd2os4I6tuMPpRogr1s23yHPp0QP50ajRPaCQ94VukjzwTB12/WMNhLGGQyk244/NBKqAZzKm/9hnc1rp9wTv1WW4B3PYoVKNdFJPVZXTtuknjbb8Yd35WdBpYcTeSR3m55CFeEp+lVlTZLdsZVn02pIWd1u7QEpu7rVqE2JgRT1yD8PLrPPq6vpoNwyNxXEvYoUvvhrf2YUp3Xq6+NYg+GOTwN3XB81GQyar48Nmq2PYw0GP177+74lsVVtlLrDUtUutcio/TWCrVCpSDyt0XBSk3Jawx/ej9UAm+KqDidXs1sN6GLatEEV4TVL5K9cLnAvauhTqrS1umllSlBzdRtIFQBL0b8qgm0cwyW7A7VJeEXLM5dymE0Seb9Gg2Ha1sdJPN+PNRjGWR/HP/iqGW0k8AC4KlWauPdfTvkBzCayO/BPVl8v/yOBJ1X2k3IWPbIfJ7F/bZ74/rVuUvvXW13JVvYfyRQs9S3R5wtpJEEV4TVJ5C865nkWi2Z0rU4Xqxt/xMTgDaUKoArgh/CK36Ooe2FhEoSyWp6wyma3Sft1tj6O9XyvYa1uEo8CWnm+54+2Pt4aDDndsqftc32pdMS9MrjsYAIPa3Wad+XApD6SKVjiRUfhaR3KCW/UWaEYsbqNdaY/1pnVyAVunGN9sQYbwJbhE6Np+AInGndW1A9f3YTDp8Sox/q3rW4DE6MSoBLge/0V3qgjYRKDoWeMwdCtQa3utsHQRt5gGEt1twZDNiWFdyCBp/mklulsUo/zVNemWT+O2pXj9+NtXcnXYFIPdOVhFJ5uoJbwPIaER+K1FNL38vyxzzpumxX6LbyKNqmuD740vMtA4sEXf9zBUDV8MGRRW3h41+yOk/pWV6LwdATlhKfTmwijHutTZ3Ub51h/5JSoBOACcPVaeLo++JqGa3vardWNNRgGRgJlhafrs2it1Oqm7a7Z+PvXga5E4ekIKgoPV7fxd3/coXAAOHotPO2ujzP32t4d18eBwZBJYeFp/U2DmXvXbPz968CkPoTC0w2UE950XkuhyOrGv9O1lFFXNw4AG4ANsFIfhfe4VTarTar15/uRg4Fqz/f8CaqOozYYMigpvP0JPLxrpvn+daArUXg6glrCcy8WzaBa3fQc649vO/0WnrYOvsa6lkId2/EnNRg4wwfDjBAeKbU6sl4hn5zt2AB/oPB0A0WFR5FjfVJqdRqubmyACoAK/RVe+ZDwyD3NnsTB1ySeBiZUqxs5GAZGQjpVhTcjzqJJqdWN3L8OdCUKT0dQS3huxaIZUaubyis4E72JMNbqVgHAAmABfKenwitrk1J5fZyeWt1Yg4E92mBI65Y9RT3h7Uvgjao6zftRL++ajbV/HZjUB1F4uoGKwqPCsT4ptboJrW4DKdd34U30TQMt1uom8SgwPbW6kesji/LCm7ZJPc13zfhTq9WNOqlReLqDcsLDV3A0t53eC09btbrpuaQ+bbW6UW1XDkBQVXiGU6ub4mnNra5E4ekIagnPdUh4mtfqqLy6abdWd9uUGEiZ/gqvdEh4eEn9juvjQFKpLTyDOovWsFZXMcakPoDC0w2UEx6ubhqubmUAZQClAN/qr/B0V7jV7iX18dfHqbxkecfn+1sjoQwgharC0/wseubW6rS1fx2Y1Cg8HUFF4VH8FRyyanW3rW6lAKUATP0VHnNIeHr/NKCt8UBN4e0dEh4pW1hK3UzRcAuLwtMdlBOedo/1BY2c7JiLVvYXTS5eNLnofNHjZmyjrEquE9vxp/YKzoT28rdsp/fCm87a7UwfDzNReNqtvFL5LUkNn+0Gsh+FpxuoJbzLQ8KbSq1OfWmrZMcHn/7Pf19d/PLit9546+OPl20/RLTmivun4xUcWWtRuzivXTbRY/1x5sNtqmMCMAC+0V/hjV27ldU38kpKS1JYIkFvWyWvIq+AmcZpqlMo27T0SlaDUsEV0NPo2Tezs29m597MZmaLOtmKKb6SpWB1tuSwKrK7ZGVK7Y+HZB0Lj8uF7GwoKQGlUtMfGRCedo+jR+1KQVttCSublp0dk50dk12cyhaW9UGDikJvSWqyZbnVlSg8HUE54Wn3WL8FRDXdcXZeZRllHY1iBqPIY5sTK5UnmcTWb4K1OhVPGOwcFX/uZoMWDzpK1Tw3kBK9Ft7YZZ66+Ms7fl3y8sNfOoTyImy2L//oibee+tE7vkVSp6VHgVpJa7jJwk9euuuuu+66664H7rrrzTXOqTdapli7bUkmgk9+tfxEpjC2U/vjQdfCW78e7roLFi2Czk5Nf+SW8HRdec0OO3ro67uG+NfiH0wv1QBPOQMqryO3sAwUns6govC0+gq5iNcUcvSTL79+Y8m7yzesOOwTWCmu6FXq/HPPqv6qokumAdd2RTVod+unrroSALr+Co8xJLzRxkOfMM/rhuvx/3nXFbW1VsTbel4yWx8gYvUoW9pyUgsyLic2NSlVg+Ohr7FREOpCYydzuzU/vaxXStk1XraXPU5ZR9xIjr0RfPakX5pXQYem40Eurq4Pc04oCyntVFsf5WUdzZnM0ozOPoZS++MhScfCW7cOjIxgzhx47z348EP48EPYvfsOPzIgvDtuYad+s7qmhYiOd9h2IPjqzeTwSBcnf9/DYSKuVKnpaU17XmxhunV8E1fez5/e08vbVDcwr/eh8HQDtYTnUizS9ueeRdVt4Wc3nzy8ZsV6430r7JhFUoUQoIKbFnH1+J7jx/cc9/NI4xaBTNBXFx9sbWl+fPdx88MX/EJq68JvXvG6HurGaOT3c254BvtHFyZ2Al8py0xxtLU7bnzc+qBlXFR7DxO688qSrzgc333i+I7jlywj82iiFm7FjXMHV7z/zXeLN5jv88lLEEtLtXF6eWs+DKiOrtfCK2mTjndNiROWRXPcnggVXSAu9U+gee9PBX4ftHEDA8P9dwQIRArV4HjoqGrIPrXdPde/WDyRaynyekj3sLHYvWbv7hOndpvbmEfTY2p7xnqLnH/b+tjTwMs32XuFsM1q1d1p9m3jIXFahKeeZ56B48f/jJkZtLQM+5GVwWV7EnjdY9fqtHezmp2Rc2XPV8Z79h/Zc/b8yStR3owOnrxf09OaqhCfiKu/+tWy+vqn51rKWFvYga5E4ekIyglP25fuRHxJgp03Kz0mMDr+2vHwunJZf11HTdSV/T+/Y2RkZGRk9M6KU9cCRA1lrIDzB9au/n7Zhx9+tXTp+qP5LAfbbQeOHfk1kF2lLHT8bcdxM39XfnelMP/8tgWL5xsZGf3j4bnrjxU1Er2NtJsO+75c9N6yrz5Ytm2HMy2IX8fJs/9tw8cvvf7mCx9v+vo0Lay5u2SylzDHt10xwAo9FR69TTreXQZOWHLg6WXmMa6hMSEuf9g6We1PllXXV6T6H9l7aPdHx0L80quYHdIGSROnOOyqyfIPd1rt8UyP5zRVK/oq2KlEPhGWmhoQE+cfk5UiaK+Qj3zQl9dB+uVTe9a8+vr7773+zM9XHQrqy0Fe2S3KyokNiY/xSckPZ9WXK7uyS9JiyrjJzZ3c3oaklPyU6paijjZGRbyPxcrPd5ttcEq6ViZiAnCgPYtVFJqY4VNQm9srLwdgtAvSGHHXcjK9EhLcYjL8snmZKmCCOJ1dHBITc3kgOeU3hJ0ajofEbtk8+9yDVxtjYkAX+fjj24V3Wx5+GNzdB/9wWhrIZIPC090v2lXbtbCJVIctL33w1evPv/TNofVuRQxQCUHK4OTHpsZcjU+5msUr6BCXCMqJopzIGglb1lpQXp5cwMnplle1sGlBx3cd3vnOkaDLRGVWu5QDwJG0FTBjgpJivGKyrhfWFgBwpst2dIC9KDzdQC3hOReLtH0pWVQtSbjkzUpjVaVmJNuevZLc3VtZ4HRq6wf3znnowYceevChh94zvnTmRmaSw9d7IvlhQqgoz453O2Fe1plWGR2YEHE4UFClVOWG2nrRoi8zysvDN726cP79Dz704EMPPfbsglX+tRENTbEZyRfNfKKaW3M7u5m9sgoVcEHFFQY5RMabRDVo8aCjRM1zAymivPAUCujsHIxUqtGPDAivuE063vrICbtmuuKeBx568K8P/fXB+xd+tXF/bGt1wqk1X7z0wAMP3Pv3f/91qZ1rkZBbFRtu/b8HH7zv3vvn3P/S2hWm8dkdDWFnFmz4ZuG//vPyXx96/K8PLlnvkRnerBpRu5ULIT0wscj/ShQ9/uz2qNaYhn6+siWfGXLqs/9bMO+hB/+z8oND/rQOhvWWRT/uNd1LK6ELQ3e/sGy/fYJ/UQbNff0Tj/313vvn3PfCt+8cjEgCVSnkuRxfu/Tptx5f4XZFKC4ESMu+YvX7o+98tOSJp56ZM+et/3xo6aJQZUOuw/Gf3h/YjN19zz2fHvjhaqmG4yGhWzbPPvf+dxofegh0kdmz7yA89bzwAvB4sNyvbHcCT4u1urHPotk5vDQLh7Lym2ecYtJsixVClUwgq7hy6tsVLz304JMLHvzYyjYvx8dr/56fli5x5KY2ES779+9YedqyQsxMMVmz/JX7H3jgnr/968GPbazzaor7FQXlCY6/Gj37mJGR0ZuLv3XwUgBDpf1aHWO0LWwxCk9nUFR42vuAkIgnSbD1ZqWx2svoaZEu5pcqe/IznLyCXH/3YyQyGIkMRoawObeMnuy0wzyvPq4dWOXZcW4nzMo6icrogISIQ4GCSqUqZ0h47JidWz2TLeIYMQxGbDkrvV1WJleUNxbdvH565Vuvv/bqdz+ZXb/SBBxQcYRBDpHxZ6IatFWrG6m6IoBCgOXUFl5mJrz66mCOHNHoR0YKb5TxwAlLDT2/yo0RlsNIv3Hey9dhX4qiurWBnud+yc1uy8XUJHYTVyoX9XVW12YnRh7ZfC7IJrw0X9RVK+usKrLYZ2ZnbB2dXJiRHGN+yi/Tp0A84uBLLhgQXnQpsybtrEngDWZtNis64uq+TT7FPlkMWk64L81/nz8rId7S3C/iHE1YIa6NNN9rHZvtVycpa6DTYk9stbh6Iqg4sa6jDIANPYUNJX6hwTt3ud1oFBcCMJvyb9JOvr/V0/JGun+Qj52N5alaVWrfkPDuvtfo37+tcU+91tar4XiI75bNs881u9nIYIAusmzZBIR3773w0kvw0NbbhaetVyRHXDdj5/DSLFy45YI8/8DIy0FZeV2NuaHbTH1DLGMY8UWZ8Sn2Z6/leEcG34i0X+NYldnUlh7h5enqbMFTMsWizHyvC+6X1lskh5c3FvfIuIKMG66bnvqb0T2zjIyMHpcEd7QAACAASURBVJj/wfrduZAr1dVZtHpXDsxrFJ6OoJbwnIpF2n1lmCvIjPJY+dWyQ2eu0ZNqyrOTXQ9s9g+IC3G/br1rl/EGY+MNxqbnw/JoAn5RrsOJPfs3bTH+ec2G1d9vOVbYntqU4e9rvvbzDeu37/jhyyWfGJ/ddD2PUxVsanp4807j9caHNh91ded25DSXR4Vb/r78tX/Mvvseo/+8t8PVvg7YoGILg8zNDny17MBvh28ENHbmTXA+jLW0FamprhCggPLCi40dtus3Nv4z589DX98oP6IuvDHHAycsg+a4LRHKuqC11D+O5r0vFXh90CKKuZEQcSxAUKdQDY6Hnloh2+God+H1YrEIoEEhaajxMvWhXYiqqZe11vNczAIzPTNbR9xlkAsgPSCxyC9eyG7lX7t4zjOnNCQtKOTy5nUx8qRWqG7Ljsv2/9WxIrPIyy488TytkdPVTngetSfyrjYDt6+Zy3M+6Z/tktWqtj62xBdnnD7oFt4kLgBgdZalFrp+b54TXCHOKYwP8rE8wlUlN9DML5mtXH3kxGW3EyHZQdWteRqPh7hu2bzpreGNmvXrwdl5MIssBoWn+1fIB4RXVdbWlhoZdDUwxIdXl+K64mRIijMLavsaa6scTvnleMXEJGb7b3CsymrqK0wNCg5xt+ADUw7VjbFBSWH7/GrL+/qrAKqqaFF+B97Y6bzX2tnE2dnqBi1ICAy5Tk4vR25hCwH2oPB0AxWFp8UPZLD5eZEuGzZuOX4+uiSls5VVl+Ow1ed6MSM8M9DuyLqV69atXHfkZGBmjLizsjvX9fCebf/79N3XXp375EfLfUsjGiriYr1Orlu3ct2679at++6ky6FYFlcuuOZ6eJ/xum/XbVttbOPAEmc2ltwIs9+2bt1369Z9s+7QAe/ka+3ABhW7LcfTw+y3dXt/3O7v09CRoyXbFaqprmBIeJ/Ycvz9gcTk5IzZs+rCuy3z54OX15//J4GB0NoKoCa8sXc/PZw0Z++Le760Z2e2CPNumFqfOvq9W1Vxt6JBFBPob7t+p5vT1Zx0UWcVQGNPraDi0q5DtofNw4MzKhkKibDGy+yi7Y5jLk4+3k6XTE9fywvhdN92c69G0VPEsDKxsDvmlJXa3JaXZGvjEWXjc/XqjVPbrPzMvf0v+bldDAo2ia8r4F+/dNnJ+JCzlafbid+/+cUx1JLZMSC8Aya2O85cc0tkpYOqFFpSimKszU99v+z3/S7x/rxmopa45r/jk83XnQrLr8e4m+7a/I0v61qGj/kV57WmXhb+/hb+/q4F3Oh2TcdD7PQK7+WXYd26UUIQf/7IyuCy3Qm8afhgClsQExxsunZrcBi3I7c4OjTY84RjcvjNE2ddnY45+9v7+9j72p2LZITR0xPT3db9amvu4mN6YteuY8d+TWgs7FHyGmN9g2xX73C96JMVUy+mN+Unpzpvuehv6u1v4x/unkxP6IbSft3aTn1e70bh6QZqCc+xWDS5S8la+4BQa2aQ656PF745f1+Ed2kzWZeSx9n9FYzI8vCKB9dy5s8HErN9O9TUjB5fX00PwWbPhshIqKmBy2ktj1tlF7VJx14fRYl+x3d//9m/118Jr413Pvbr96998/q2kIS2Hn5zir/11o/nv/bM/EMWGZX5AKLe+lqO6/bP31k0/4cVxoGR8q6KUttdy/77zzmPPjrv1XnzD5okVWSNGA+8nvYI20+/X/rBZ9scnOqkLGXWpe2XzEwDr3BjLVc9/9bL8+e9++vX5+LSQVkBBa6nNq2YP3/uQH622BHB4cjaOLVX96xaunj+svd/cvcFVQEUuZpt+2b+/Lnz/z13/q5d1wq9C4Iv7nzlXy8eOBQfYup2+H8vLZn7vae9r4Odx8Fvfv7IyMjIyOieN/a6nyvVdDzoWnh79w7rdCurO//ILeFNuTZxh1fIs2Itzmx49fmXfzlGCFK72LQbAQc/tLjaVO50ccPPS+bP+88781a6uTDqS4Cfku64df78l+bPnzd//rwPVi22yM5q761qIbztdnw4f9HT8w+eTGEnQ0dWWYTZyvn/fWn+3PnvLVlnYSWAArluaxPqXYnC0xGUE54WP/c80V/Nygeo7u+t6GrNr6vPauthyZRavJSs4XyYkOpuCe/nII5AACTm8mV4+unR89hjmgrvL3+BJ56Ap5+Gv3/Q8phVdlGbdOz1UVnf3V7ZJGI2dwsUUn57M6uukdkiEfarRMpefkcLU1BXJGir7JULARpUynp5F0tUXyxoYrR2sztFEeaLPnnpxde+PWaSW5dZ08aSyqtHfk1K1c/uEBWKGvJbOsuVKh70lrV0MsWScrmU2STMqRNk1DfniaVsAC70MdtbcgWCNIEgTSAgmsX5PXK2qp+t6M5vEqUJGjOauugA5SArFrdkCgTJAmGyoDVH0lfUJ8lvrUsWtuVIJbldbel1DQlNXXmVQaf3Lntxzn1GRncbGb30qUmoQ72m40HXwmttHdbpHR13/pGVwWW7EnhaOa0Z/xVyvrSD1VyXV9dc1qvg9csrJd2lDWK2Us7qaC5uEGQJ67Mau8plyipQcHs76QJBtkCQKRBkNjRld/Rx+lWVyt7SztYcQV26oK24V86Cfpasp7hRkFEnIAQNmc0dRQooV2m/VjfWvEbh6QhqCc+hWGQIn3ueXK1u1ORTo4bH40Fg4Og5elRT4c2aBaamEBgI+9xbHrPKLmyT6uIDmAK5lM6ICrl5MzCLld0DNSqKjQdp7c2CFMfAQIvAYIvA2CtlwoReTceDroU3CQaER8oHMHX3i3a1dVozzrxG4ekIKgpv2mzHJ+lzz5Or1VFZeOMwTg3v73+HrVth587B7NkDNTUAAKGslsessgvapHr/uWftjgfKCs8QPvesue00mdcoPB1BOeFNvVY3tc/7Tua3OE59Pmh40KHuuVuZQcJ75BFYtOjPrF4NPT2j/Mgt4Wmldms444FGSeHtTOBNT22C3M89T65WN1ZXovB0BBWFp62tH+m/mlW7tbqRqssHyJtRwlu1Crq7/0xPD6hGm9MDwssfEh6OBw3HA2WFp8VaHUV+9eAkahMTmtcoPB1BLeHZF4umclqlydaPP6n5MImtn4bzQcMz/fzRVJc3E4TX0gKxsYMpKdHoRwaEl9cmneLppaGNB8oKb9JP53pfqxt1C5uHwtMZlBOeLlY3/p3O9Ek86NC8Vjeq7fIAllFbeJNAXXg6sh2fquNBwxrPqOMhhpLCMx4Snu5sR81a3eQObAayC4WnG6glPLti0dQPOqZeu9biQcc4tZlJrGu3qS4XIFevhaeLMg9/2m03obOvqex+qCw8vJkyoV0sCk9HUFF4M3rrp7ta3W2ey9V34eW2SbW7+5m2mymTeyVromWekUMimqrC02TLYrCV11G7EoWnI6glvEvFIq1c05p07Zo617Q0UV0OQI6+Cw93P5oPCcoKT4s3U3T0i8hJuZkyTlei8HQE5YSnr6+Q37FWN85kyB1DdfotvJw2qbYuqfMpWaub9I2GsXY/0d2yudQT3o4EnrbeG+HfaXaT9XQ+0dl9x10sCk9HUEt4tsWiqbwyTM2tnybXUjTf+t1mOz0WXnabdGbV6qbnZso4Q4Kywpui7fgUPoueYiV+rL3sThSebqCo8Kh/WqXra1p39FwOQDZANsDX+is8fCVrQqPiJoWFh7W6Cc1uFJ6OoJbwbIpF1JkMuvvc8xQnQ/bw6KvwsoaEh7sfDXc/1BTe9gSe/lXix+/Hqc9uFJ6OoJzwZnqtbiqvkI9fqxupuiyALP0VXmabdKK7Hz7Zu5/pqdWNNSQoKzys1U10dqPwdAS1hGddLNLvz/tq8cEuyzCEd0fb8SdYq5vmZ/3pHBJR1BYevjWreVei8HQEVYTXKpV/4cc4n19f3C3T48/7Tn3rp6669H7VdXHv6mjuyRQ+yf2nVUJZLX+3ys5ok5J1SV0rr5BPw8HXbUOCmsLblsDDs+g7VuJv60pjFJ5uoIrw+lXQKpX/fpOzOa4KC9ejzgR11WUCZALclMhf8ih2K2ro6lOS3YHaZEB46W1S0l8hJ333o+H6OJBIqgpvoluWsWa3Hrw1q0k/ZqLwdAZVhDfApkj2T5FsPf68r1Ymw61EdcuecsjzodICpxXqu/r8mU0/hVeE8MXTXKub+u5nGmp1ow4JV0HnshusKyWNtR19ZHfgn+QIO03Sa42TqmtVKj2uxGvlwOZWV27LqD2QwidqxCR3nj5CLeEFlzUdTuGfyhaezBYSbVL+NF7Ton6tTt12jnzx7mzh7izB/kReQX0X2f2mfRolshcc8mzoIs1rPOTabjqHxKijwrS8+R/W2bz2XrK77nassgSveRbzVSp8a1bD2f1+UOnhRB7Z/aafUEt4ABDJbn3Lo+gtj6ILRQ3hdV3qCVPLjaGEDuX6UK6pJWR4gocSVNcVVNcVODwBQ/Efip9arg7F5065Mka8R8RreDxHxGOMbErkveVR9LU/U9hJoe28FmmTKv4XUmaaVxdZ1xXXKKnqV016fdT1555JPPjKBMhQgV+zxKOu61hhw9cBzLouyo0Hf2bj99fLI4SdkXVdeV0yvmHU6ibRldES+cDsXhXJdsyrI7vf9BPKCa9fpZIpVTKl6vuQstmmaZhRY5MjlClVcqVKX0/5VQBypeq3CPZs07QFlwuKpXKd1uomfUmdxPVxICmK/oWexbNN01ZfL6fmeFCqVJmCjvvM0mebph3OqKXgTVpyK/G3crRYNDC7wytalP0U7El9gHLCuwWzSZLCF2NGjUBPH+xuo6KlJ4UvDilvXhrAfMen5I55e9y8pUHeHDdvTDCvTzb/1ThvXWVcZTal8MVlTRKyu2tMOvsUqXxxCl98LIU/9X7UpCvH78eJduWk+3FCXbkjvmpgdrf0yMnuMb2FusJDkAFaeuTW2cJzaTWYkTmfUdvQJSO7izQlhS8m5V9pe2DNrKU1G6+Q31/jJJrTSnb/6D8oPARB9JyCArj3XkhKIrsdCNmg8BAE0XOKiuBvf4PYWJDjYaFhg8JDEETP6emBkhJYuxbc3MhuCkIqKDwEQQyCTz8FExOyG4GQCgoPQRCDAIWHoPAQBDEIUHgICg9BEIMAhYeg8BAEMQhQeAgKD0EQgwCFh6DwEAQxCFB4CAoPQRCDAIWHoPAQBDEIUHgICg9BEIMAhYeg8BAEMQhQeAgKD0EQgwCFh6DwEAQxCFB4CAoPQRCDICgIzpwBT0+y24GQBwoPQRBD4cwZ+OILshuBkAcKD0EQQwGFZ+Cg8BAEMRRQeAYOCg9BEEMBhWfgoPAQBDEUUHgGDgoPQRBDAYVn4KDwEAQxFFB4Bg4KD0EQQwGFZ+Cg8BAEMRRQeAYOCg9BEEMBhWfgoPAQBDEUUHgGDgoPQRBDAYVn4KDwEAQxFFB4Bg4KD0EQPaezE5KTITERfvkFXn8dEhMHw2SS3TJkekHhIQii5xQUwL33gpHR7fnpJ7JbhkwvKDwEQfQcFB4yAAoPQRA9p7ERHBzgxRdReIYOCg9BEIPg009ReIYOCg9BEIMAhYeg8BAEMQhQeAgKD0EQgyA+HlauROEZNCg8BEEMhTNnUHgGDQoPQRBDQV14TzwBBw6Q3SBkekHhIQhiKKgLz9ISurvJbhAyvaDwEAQxFNSF5+BAdmuQaQeFhyCIoZCQAKtWofAMFxQegiAGRHw8Cs9wQeEhCGJAoPAMGRQegiAGBArPkEHhIQhiQFRXg4kJzJ2LwjNEUHgIgkwfzRJ5DLeN3ISVtj3/Vdt2G5KbMTJpNR1ypYrsLtJnUHgIgkwHEpmyo08RXtHysEWmFvMQhfPXCea/bkV8cW9Hn6JX0U92d+knKDwEQaaD3yLYr7gUrA+rYDRJRqZELXS1FA+lSC2Fo6VALfnDk6eW3CZJbpMkZ0Syh5I1lMyhZAxP+lDShkIMJXUoKcOTPJSkoSQOJWEo8U0Sv8q2tz2LX3EpsM0Rkt1d+gkKD0EQ3VIt7jWO4VplCVwK6qO5bSoAFUD/UJRqUahFPhSZWvrU0qsWqVp6hiJRS/dQugC6ADrV0jEU8VDaAdoB2obSqpYWgBaA5qE0DaURoBFANJQGtdQD1APUDUU4FAGAAKB2KDUAjF7FRbrItKD+CFFjlSXAw02tg8JDEES35Ag77z6bllojHlCduu3GEt7Ubdcz3HZdo6lOXXik244PwAeoBqgGOJopWOJFR+FpHUoIr0feX9PRixk1Dd0yFQ58gGaJnPS+oGy6+pRk98+YdPYpaZVtz9rn5tR13tFzE1LdHT0nUXuqG8tzHcM9NyHVNU5cdYLRVFejprqBmBXWfxVYyhf39mExT6tQQnixlW1P2+ZgRs1X/sweOQ562BzJJr0vKBuvYhHZ/TMmboUNX/kzq8W9UkW/JqrTyiPdVFQ30nMtYzzSNY7tufoxHukE43puIDwAZp/Si9v2zKWcvLousjtQryBTeEqV6mQKf00oa39cVVBp00AChydgtPgPxW+MXFWL72jxGZ4rpU1XSpu8R4vX8HiqxWN43IfHbSiuark8PC7D4zwUJ7VYFjasvcFaE8q6Vt5MYmeRRUq1eE0oa00oyzZHOOogGXWE3HGQXNXZIPHUeJCMOkLGHySjjhCn0qYDydVrQlnbo7lNEjnZPXY7VlmCtz2L5SpVP9m1ukmcXo6lunEe6cZS3chHOv5oqhtIFcA1QcdfTIj02g6yO1CvIE14dV19jnl1fyTwdtIq3YsaND/c18VOcPzDfU0OPVo0O/QYZ3qMdeiR29m3Ob5qA63yaCo/vKKFrP4ihaTqdrP02p20yp20SkajZPxBot01dGZVgFzKmzfQKjfHVVnnCCtaesjut2HcEt6Mq9XpyHb8sR/sbtmuCiAEhacDSBNeKl8861xaTl0nuaob/9BDPOVDD63sBAfmw36iZqlvCVn9RQobI9iboziTGCEGUgGqGT5IcrtlT9vn+pY0kt1vwxgQnkyl0sqmZPye6tagpyaxKdFdrU5ddVVDqQSoBAhG4ekA8oWn3VWM9LmhrStbI+eGIQuPgpshKlSAaoaPECoLr0+lmkE9pcUTmlF7atRHuluq4wJwUXi6gRzhBZY2bY7ixFa1t/cqJqo6rcyNsQ73yT29rBn7fJ8HkNomtSxqWBFYymmVktJr04m4V7Epkm2TLWQ2SXR9eqk3FaAKZX9QTcf2uCr73DqyO/BPbglP66eXE+0psk5o+HdSXeVw1XEBOABBKDwdQI7wTNNqPvIpmcSD3Uyp1YkmZTv+nc73/avF95im5dfr/8WtRonsBYc8b7po5r6tRVYF6Pvwiq03OWR34J/cJjxtPdhNtKem33Z8zWp1o9oOhacjSBYeRa6lTH1uTPF4iq/Z3PAzPOFN2ym3hpshEitAfM0qQNQUXq9Kpa1HcN31lC5eIb9jra5yuOc4AGwANkAgCk8HkCm8aTueGjk3KHK57o517Nu2gYYmPK8h4c2sWh25FaCV1BPeW57FUpWKrJ6athOasXpqLNVxx1BdBUAFQAAKTweQKbxpqNVRc27UTnZuXDU84enu9HJm3dHV/EyMmsLrUamofJtad6+Qa3J6yR6uugoAFgpPN5AvPB1t2Cd6LWWa5wZ/tGspd9wG+hqk8HRxR3fUChB1zsTGv+ww/pkYlYWnf597nty1FM4YqmOpxR+FpwNIFh5FXiGnWq1urEMPAxSe1k+59b4CRFnh6dnL/pO+lqKJ7cpReLqBNOF96FOi9eMprdTqKHU8ddvc8DEw4XnSRQZyyq3FCtB3lBSeRKXSj5f9J/EK+fi1upGqKwcoA/BD4ekAMoU3ciHT3So2Uz6vMJbqBiaGAQpvGlSnZxUgagqvW6XSj5f9+VM4oRm1VqfuuQHVDeQqCk8HkCk8qtXqtH65jj/ZWt1Yc+OKgQnPgy6aYq3OACtAFBce7ks0sV0pCk83UEJ4VH6FfHK242u2kE10J2jIwsMKkIYVoG8pLDw9rr6zOjvpLS0lAJwJ2o41mu1QeDqCZOFR8HiKlFrdWBPjtlnhbZDCm/5a3SROuSfx9TgdVYCoKbwulWpkf3X0dtU3cJiVnGIOp4jDY/BFNX2qNpVOq+9KQW8nS8DNETSXdXVxu1qKuZWZta1lElnNBGZ0fzX0lNSLChvFDEV/FUiKhDU3kzODUnKSAMomcjNFXXWlQ2ECMAF8UXg6gEzhTXQVm3Gfe550rW6sieFlYMJzp4umQXVUOxObYgWIssIb2VlVRaHe2x5/8Z+PP/b44489/vLL7+++WN7Lkuq0+t5eWBxktmzewmVnjkfdCIww2/DUv575zNI8hcuYwIzu4UH6xY17DuzzcKnv5KqSz678+J1XV39yLHJAeJrP6FFVxwBgoPB0A5nC02mtjgqfe9bila2BGKDwNHnTQIu1Okp9RHhyTwkUFN6bnsWdQ8JT76ym9pIC4syO3Q5WjgH+fs5urhf2BgkKRH2a7kskVWWVqRdvikrbZBrPaFllTWaq7fI1timX6YIiZkTI6dUrrHN9WF2VE5jRyipojnA0t3b1uySUc1SNienXTM467LMITwQonfjpJXO46hgAJQA+KDwdQJrwPlAT3oy+Ss7X/QXlW3PDkIU36fIPRWyno1PukQ8K31BYeCM6q17QFGa62cTkqIW5na2Fp69dqqi8Xa7pjBalZyU7LLtUmVHfO4H9a0t5NW3XIVptSA0IGgpKaUd20loj6idcfc+KcvGOvH5JCGwVcKEuOCLayiE8EYCpDduh8HQE+cKbKbbj9/ZWSiSVADW36tj9/dzOTrZMxp0W25UCeBqq8MZ//3Jm2Y6nUrG7uipkMo62n+2oLLwOlWq0nqqvEQYcefvDz/81/8X3fnz3UFxhn0IEMmFzTQkjNyEvL4FZy2ztqOlsLGMV5dR18qRd/Kb64pLKUolS2NXITPd0sfx9wb5Q52ROUYtECNDQr6isY2QwcmNyS+JLhGVyZc3Inmop50Ub/345xiwiNzLmSpDj5t8jm8JrOkrquHG5ueG5uWG57BRBe0lvV0l1bkoF82ZxcVguPaKwNq9XXgHyMnF9emluWF6uu/VpC58AWyFUqIADdUFDwmMAVAAwu1uzKnNDC3KDcyti+K25sp7cmoKIYjatsjqlnh2Yl3ejpi1DolRXXclQ6AB0gCsoPB1ApvBm1gVlZmVlekFBBgB3aBWr7O3NIIjUhoYCne3Zb9sGGprw3Ogi/Xv/kiuTZaSnp9TV5U25pjtqBYiawmtXqUbrqXphZ4KdW2lOgFXYzYBj6f0iJbRBfcKVA1tenT373vtnv/bHH9cSo1OdT3/+j6XnU4JZWTc9LLYu+OVsUWdBusuZLe/Ouvvuv9w9a9aifbsCCksABD3tEede/fyV2bNmvzT336ecRR30kdO5pZwTvunVF5+8e9bsWbNmPfTEM9/68MOK413N1rw8e/a9s2fPmr3i25MRV7hpXtvvWfHl4rnPPDNr9r8e+ceh85zGDGiKjblg/Obshx+YPevu/7yzxcFGCBUqYA8JLwGAAcACSMsPsvxl9mOPzJ41+4tP9wS7Cktc9z7yyrPfrFi/Y/+F72bf98CCP8Iu0sWjqq4YoBiFpxtIFt5EizHtcik3wfzk7h8++OSTpd+u+tWHmSKU6vhmiqQW8i8f3LL6mz1rzsekA3AA+FCTlOJ+8NNl7622tc6sLNBNMWbkiYeHQQpvjJpuJ7c02mPnl9/udHPLTE5IuHzyi28/2+brVySs1c77l/0N0BgXcPbwzh0rz0akdmW7nt698cd9P19MzlX28yZQ063Pokee+GzPpTR+cndtcrrXwU+/WrLK2oJg52rp/vptZ2LUF57apqRe0Jlo71GRX5iTnESzdkoskSlK0228fS+d8E2JSEkOj3azD0twCaNlhh/a4lQYWd7AyIwKPHXYrLQ7T1RXmB/g5HL0851+jrSynMauGjGPk2z69dtPPPqAkZHRAw/Pe3dzTFNy24ieaimvjN7xm/2Nk0EpQaGXvWw2bo5oCuO3xUWc3/mR0X2zjIyMvl5+PDxEzM1P2vnjfpt99qGe/n5WfxwwYzbGld68HuNu7JnimZjiYH78nJe/jRBYKqiAusCI6Iu3hMdPcrVa99wTRrPuNjIyenThqhNHCrqJirTLF7b+dODAZ9YhnqlEQGVzSpdC3XO3VFcMUATgjcLTAWQKb9SbKePdO5A0NpaHO3g6nLQ8f+zcycNmJzbapiRxWjXdsPc1VjUUBuQ2M9plE6nV9dVCVYSf9Z4dJptMwggANkA1tOSW0RxPHVy+2so+raJAB6eXpaOd7Bug8Ma+viStraBFH/vg62Ph7nllhZlX3H/78oPD8f7Mtvrehpr6oqCcFm6HfFB1qv7WDkZGRVUSp1vj00tVA3Tk3Dh17tiuL60Lsrq5UQ7Ge4wPf+9cVqJU8ce9mcIf9kjXnseMt17xvzNJnEhxS25FvOPpgyt+srJKLs/R0nP/bWdiVBbeiIfv+trORDuPijy2qCQnKcjeMbBRRoTsdb7qbpoHLSpliyDQIyLBKji9qsxlnxsjpryrkpme5HHGnCXJk4CovSAnz3f9pcrs+t4GgPomBidi+ze7Tv/8x7k/zp07fsnJs7S7qHvEpqSlvJK26yCtNrAG+A0FdNoRY1qrP5FyPdzumM25A6bn1i7fc8g5PFQq5HLtttoluWQ0lFTRY5wPmNIbozN9g2i+xmlQJIOMKBfPyOs2QihXAWtIePEAJQDlZQFul/e9vunc76fP7Tp37lRwrI8ASvohKczurO+VPbn1tz3S0dU8VwRQCFAI4IXC0wHkC0/zd06bhKWlvrt3hdLDqiVtIBX2CIJji5jCNk2Pp9qKi7Md1jmWx/MkE3+LvO5GZLStXVjqoPCgGrpL20stj7kG5lXkT4vtSgDcJyK8vDyIi4O4OEhOhu5u3Xao1hkQnuuQ8EYfbkYSVAAAIABJREFUJE3MRtq+Y7R6mgDEdTlVtON7aOKUBmhvyadnOv9sz86s7RncDPUrWrmeztdjzGNEE6vVlV6NpF3ZmwYVfVBX7BpEu3YkC2r6J/YWebmQk2S340JBdYQYKqGb2VVmedL9alZ59hQ+wzGW7UoAVlBVeCOPmkUdpQU5F3YfDAnJFDIqctKv25y6wrhxzczZ1/aYV9y1uNiQCNdLYalXiMIqjvu+Y97W7uHertYWh7ZsjOEnN8sa2gsyCceV27wdAnJTqlvY4sqqnIvHPSOsrsX5x6WEpJVkiuUc5W3TWc4WZKc6rlzrmOHCaCgsjw41X/udfZH95VMX7Q+ttIlzj4k7Y2y8/7y9eVZ6asL29ceDLyaUJ5bEue1etckvzzc1JCDGfbtb3OWYOJuzu/db2OxLFRSqWuLzI03PnNu8w/R8YkFkc09eVdy1WNffXeMcouNc4zICmfwEcVcaK9Hx/Okjly6dyioIa4FcxSi2G1BdAUABgCcKTweQKbyJ1uq4paUhe/eG1NWVDDueUjUpZPVSSY1EUiOV1Sn6Rf3Khj5Jba+U39NTLemp7pEJ+1X1/QoBL4kI/uN9q/xgVjtfrhT2K2v7JFU9vby+vmp5L0fSw5Up+f39NUp5lVTClkgqpH1cuXJo5aoLVRMeD4AH3cz2UotjrgF5FXlDqmPLe8ukkhJJT4lEVt6vYilkpb099J6+UkVfSa+0WNpXolCVT+rK1sDEGEd4/f3Q0wMSyZ95910wMgIjI3j0USgrm/Y+nhq3hDfe+5dNTBFt76GIqhtsSV1lamn44V0x4uQ6RRM3lgg6+s7F4psccYOiv0XV3yLrFqaYnHLz3RXGr+1ViFQqkaKvrq+nRiqtlkh4EmlNn0KoGu2Uu/Rq+E0P4zhJcbuEk2XvGxV8JEvFV8qrpFK2RFIh6anokVX1q6oUMm5fD0sqLZdIyiS9FTJFFQAPVFxZL6tHUsApib64zSKvOlxNeL5Z5VlDqmPJe5lSSbGkp1jSx1T2lypljN6eIkkfQ95X3CstlPYWK1Slqjtshm4NEgoK7w3P4jaVamRVlVUQ7Lrxb089/v56p5SollpmyTXjx/ZdTkpxu3po6+tzHnjw4QfeOnI4tKQUGisbQw69/PzCOXMemDPngXkLHth6w7+0uUFclBL6x3tz5jw2Z/Uvtolx0FPdRXf87ZX3np3zwJz5cxesO5Lbmi657RG8PbPA7+TSR55deuxAWIh36OlVj879+xLT07YnDh34/P45cwbzwooXVxw4tfPB55/9aa2dy4Wbpqsffvzxd88cphFXadY7353zf4/MuX/OnPuf/2qRsSdNGX/gq7dfmzPn/jnzHn58+dZYXlhnS3SS464lcx5/dM79cxa9s9n+TC7DZf9ji1+cc/+cOU+/s2xdItA6hh1gFqmpDoWnO0gT3vs+JRO9ccApLQ3euzd4SHhDlZjW7ASXs6sWL/7v4pe/NzsZxsiuzos499r2ras+/OyzhYuXv/PZJW9hO5MT4Wm6+sVnn3hw3oJnl505FFKcISgOM1389af79p8xPX/Z+JV33l9hnxVSKcjI8Dm3ZvEbbyx+6bvTewIK8wF4w4VXMVir62a0l54/5uqfV5E79EhHC9plvG7xfxZ/9tJ/zS4y6wISbU/vWPb6+6YON0zXbF/59vo/Nkc15Pf137FWN1Yd221s4VVXw4cfwuLFf2bOnBkvvMt00XiDpIlZe2PzO++/+9xLi19Z+MLrb/53bZAoOTXU7fQPLz77xJx5C55fYXo6nFEhrhamnPlh6X/+8cw/H3vth/f33Ihv7k6KOGHzx9JvV69+9fXXFy5eud7sWlDTaKfcpVedzvzw2L8WL1i0eOG/n/p4y8kjqa3VtYGHf/nmw8WLX1r85eL3LjiwG6/Fnrc6/PE3P//86ptvvrR464bztJsg54LQ32rTL18tXrDwjRfmf74tihUuBi50M7rKLIaEN/BIF3Nt/65fFi9YvHTB4nPni2r9UxzPGH+16B1Tm2uma3d9/+bafRsiGrJ6lGOp7rYHBWoKr1WlGnmburGnvbKGkcHg0Ju7ahSyBmk7gyHkdnVx2+roFfRkekkyu44pltaBol7RzmCVpdPpiXR6IrM8sVbMlirqlT08cV0GnZ5Ir85r6qqEfkG/tLSGlVZKj6WXJpTzCyUKbv9tv4ZCyelpK+CWxHPrc8XtDHFDegkzhiPKb6rPEXKj6PQoOj2STo8sq4qtEuYI6DGl1URTS16HKKWEEcluyOzsLuxsSmPTI0roYXR6WFlltKCVrupMq2RH0+mhdOYNRlVKZ1+BUlHY1ZzCoYeW0K/RWTdrmwmJNEvIiCijB9Ppoeyq2C7IU46pOhSe7qCK8DR500BdeLcOpnhlISH+FgfMHc0dHc+72FleS/KIz8gJ+vGH34/+dsTqzGnzQ78dsipvzq5jpcY7HTmy9r3VJ3fZx4YwG5gdDTkpjma71q/Ze/AnKyczV3fH7Nq4rOvBwed3mjmednA0cbE7FxzrUthe1a9SFx5r8PTyT+HlAHD6xJyK67vXL37ucSMjozl/uevVtYEMj7xMP69T23764UuTC79fcjK9Hute0UVXqDQ5vSwZrY7tqiY8Oh127foza9fCffcNGu626I3wbt8MNTGFkTtWH7befs7xgtlB04M/bg5rSWKWpdHsjh5e9+6Ppw44JUSVi2p62xt4ie4O23/euuv7/e6XosvpEhkjz97W4vdPNpiZXHIwNz9yzCXIMl08yh3d0qu+bkc+2ut4ws7x3JE1+6wcDqf38NoZNjvefPtpIyOjp+99cLcJXRBd5GFnvfm9taZHrO3/2HH4mH2Aa0NrBcvLws35wEXHY6amu1atPpzCDRMDB7pL1IRX0dfJYt/Yu/GN558wMjJ6wMho4WrfQte8nKtXTm9dvfLL05abLjmdDYlxYXUVyPvH2gzdVgFarrHwcnOHDaGLF0Gh0H5XqgtvBv2yZa2cM4+1KSkaXq4baTsUno6ghPA0vErOryxNtNhjlcdNFcubQSFSdpc3dRfcOOruY3M0EwRKaKwPuxoTY+KXI2Dbbb4Q551eX8ktSnE5dIHRTHRBXSeziO6xxYmVwJPcmh55IaeOOF82jucNzJDCJEs3r3M7CWD2QbUo2j8h4o9AAVep4kHd9choG7uwFADW4PToLmkvPX/M1S+vIhuA01XHSdjz42/rX1++ZtmaNct+Xns4hhvRBIVV+TfsNn7llnyZ03bHjwmNb7tCANdq8ayzaeZXuoKCYN++0fU2MnPmgJUVBAXNpLj6y548P0x4o4yQJmY9bd8RWn20AFrrcri047to4qQGaBEX0wu9NzuwM2t7BtdQlaJJEOAWkWAVIxpcQxvj/KP8f7EuqpQqGhoi/GNvnrxWN8oaWno1nHZldxqU90Ftsas/7drB5E4GO9nddf+OXWu++Hr9kld2X2QJMppTAmN9V5rl54v7cmmevmEB1mVCVtyek7QyFw4whZw4ux0WBdVhYmBDN72r7PxJd5+s8kyAComIlXTgpy3rX1u25us1a75es+ZgFCu0EQqqi2/YbVjmluDAah3/0X9kBeg24bFYY/4j79gxbJy8+Sb09Wl/sg8Ir0Wlotrnnidtu8nVI0b21FiqQ+HpDpKFN7GPHLayaxNPbHCiOaeySoTc/OrCoFRecuApL1/rw9HCvFphcUmgR1SsRUh2ZeG5vZdSfHPqGeWZURbGJ1Or41rktZ3MwkLXjeZEUFYto0Naqejjtgtpbi6eMTFXm1qYfVClgqIMR08f050RwqRqYTbzukdM1MmIOq5SymhmeHn7njLxDK5rzpUqWP3y8p76tLKko7ss7W9mxrR10TsaKtKOnw7PsMoSpgrrU4XNeVJ5saQjrTDTx9LSqqwsTCwpkE9+JzgwBy5Xi/9yOu3x17qeegr+7/80Fd5dd8ETT8BTT82k/OMF2awDeZfporE3Q/1N9QWc4C27gjmhVT11vJQCvz2bgoU0gaJRXFyU57bBNC0iT8jp7BUCNKoUjYIAl6DQM75MekMHT9EvbIy7QfPfaZ+XxastLApwj4g6d1M0YgFVVua7+Qc7bYnpLuntLSdsLgd4b/MvSnRautM73jpDSEtOttm0yZrOiuFG+N/02GBbmtXRlRzq4OTtbpJTyUg9djos0zpLmJCf5n92w9F4ZqCohyFtSKtIPrr3gm142s3WrqKupvKM0ybhhEWGMFlYlyxsyumRF0g6iOJsH3Pzi0zmNbEkT37nzZD6sdjy8Iq1QRyhEAZy7Jim4+TNN0Em0/5kHxBes0qllZf9p/5VW12/O6R5T42VfIB8AA8Ung4gU3gTfoVcKatvrwk0+/i7j555+p+LX3p78/H0xoxGdmyIyY5P/vnss/98+pP9xt6ZMSUpQQcee/nF336/fMU50nzjk/Oe+vzC/7d33uFRVXkfj/pa9l1X3RdERVR2VVZFrOiqqKiAgEgUpah0KdI00nsLhBAILUACCQHCpE16L6SRNum9t7mZ9N77lN/7xzBxkim5M3Nn7p2Z3+f5/rU+Yc/znDPnc+/5nXPuieiynM5czt1DX7308iuTVq48Hepemea2f/LHbzw94bnn3vp+3Y4ESOuF8v6K4ECrrbMmv/LK5Emfb115NTq8p60MYk/98vWMCc/83/+9POm1n7dHcEO6SgMCLFe9OHHik+PGPzdj9h/XL1f35fVmXTz4w/wPJj8/+c1J/168LaTExt1i18/PTxg3btyLL84x97hQPPZvQ3aDsvQvwY7b/rB5rH9aF0GArS3ZiezJJ+HuXSAIfUpa0eDk8ym2WfWKV7nbclKcTs+f8PL8k0dD/D09j6x74aUJs89bx3FL2jM5gfs+f+6lVyat2XghMgqgXsSvr3I5udn07WdmTP2vpX1VW3ZD2K0za94fP+nFlya/8MKSZcd8PXsEI18UhDyo9bq4+pf5s6asuxPQHmn569wvpi18d/XFu76/fvz5O+Ofn/zcxInjnxo/fo75so3frvhh+qRph22qQw5sWPDlG/Pe3uYa1Jpqtf/7+R9Mnjjp+WfGPfXPL46Y+fo5hZ1d/eLzk54aN/65T77ccvVidX9WT/alo0u/+XDy85OnPj950Wb/goseZ3YvnzRh3LhxL7ww64jz2UL5I0TRIFngW/SPX0omTwZx/vlPRgivUSI8Wg77U3iBu9orNORVh8LTHnQKT42LMBoEQwW5gd4BrCssT3vv2KjG/lJ+XxEvJyyIddWZdTkgJaSsubCzPi3J+aZnbEBRcTwvy9fF/WpwdlRtR9lQe1Ftpivb7SoryiOzKqWrKSmZ5eDFOs9iXQuNCaiHQj5woT+7tiAomHXJhXXOn+NR1JAHQ2VQGxYR5MBinWWxz7lF+FR3pg52JBOZrizWeRbrDMvfIaHgbo8wX9QdnX73lg/rNMvdyjmczWsPL8vwjmJZsliWLNb19PKQdtV+G7I/DzupGh6PByzWX7Gy+muXisHU8Gyz6hU/DA3wmsriw9xuhWXGVhHZ3IxAV4/rIbmJ9Z1Vg21lVRlsV5frrOiAnJpC8aG6XiIu8e4tlt9170xO90Bs2OE9S6e98OwnC086HHGM8s6qyhm9JiaqhJ7U/DiPsNBrcSXpgzV3Y8Nve929EZufXZN8K8j7HIt1jsU65+xqHZThGhvOjvCz8UmL6uEFJtx19Aq3SyxP5XdGpoff9mGdYbHOODtbBab7ENx7VdkuLNY5Fus0y+96XF5YjzBX1B2ZGXnTh2XJcrdkhbkRbSHlWV5RrFMslgWLZZdaGtimWgVogW/Rl+dLTp9WOB4UZdw4+PlnWLHiftatg8pKCrrybGLV+zcyG0UiMqozwlrdKM+Jk4LC0w40C08Hn/KR+yRIMPhJUMlvw07xLs36eti5EzZv/ivPPaf3wruaVa+l2+PSOLdsz+3ZcvQmq2ogZ1CnFSDN51DlFSBxDa+u7q/x8P33Y9vurbdGDJ7Nm2HrVjh/HmxtySY0VH5XioXXIBJpYjvmXOBOvqfG/DkrEl4KCk9r0Ca8Gbezafm4QaW8H4b2fhskt5JnkFv0UCI8WVatgmnTYNo0mDEDysu13aUUMyw8aq97NoYK0DcyuzQzM++PBHHeeAMefXS08LZvH90FfX2wZMmIP1SetWshN1dOdnrfF56W3u3k/qKZsDNFjWXMYduh8LQEncLT9pYtWj7RMuZFGMq3pSj/VdiqIryeHujogI4O6OwEgUDLPUo1YuFdyapnwnXPTHjvJz91ygqPz78/EsQhCJgyZWzhiUTQ3T3iD5WHzYYnn5STx76qev9GZr1IpKcfXVLvF62251IAkgGSAexReFqATuFp7bpn2r69qd4Du/LfhvSvQiXh6TXDwlPpvR8rQHKFN4qhIbh3D4KCICgIHBzu72qRFZ6q1Nff/zdHZZ3jX8Kj8LmEYPBzCflftFzVofC0B/3C06rtCAYvT6mxuG9swrucVa9t2xGkP/jJzNNaaghPmpYWsLCA/fshKEhbXSmu4dWJRMZcfVfVdig8LUGn8PR6eYpkrY6SDcrDP4yrxic8o13lVnWEDA8SlYSnA8TCqxWJNK++E3pbfVdJdUkASQDXUXhagGbhGdXOFM3X941TeKq++huh7aRnT2YKr0YkMsieIll9l9tZyQpUh8LTHnQKj5JndtlijDa2bFFVjNHwGdDYhGeTVU/5iRTD2JmiZJAwUHjvSQnPeLbLqvpKNxwOAAeFpx1oE94nt7ONbWcK+X0Hin4bV4xPeBSe1pI7SEg+DOnmvZ+SzQ7zGSm8apFIS9tS9LenFKlOnGsoPC1As/BwZ4pKPw9jE96lrHpKVrkJnZ9NJl8BUm9nipJBwkzhVYlEet1T2vg5K7EdCk9L0Ck85i9P0bIzRclvwziFx5xanSYfItdZBYiZwuOJREZVj9BEdYkAiSg87UCn8LBWp+pvw9iEdzGr3mgvTFF79mSm8CpFIuypJHKqE8cOhacF6BSe2g/sxFiVGM23bJH8bchurqOkVqfot3HZ+IRHVa2OIWtiOqgAMU14OQ091knVvwSUxLb06fgIueYrNDqo1Y3yXAJAAsD58tbVYeX2GXX13Vr4gIURQ5vwPpYIj7ztCF1tUFbDdtQu7iv6hRin8AygVqfLChDThAcASdWdDx2P9ahsH/45E9o/Qq6J7XRZq5MrvC0JVTMcs0Q095sBQqfwmFOro30rOcnfhrEJ70JWPa5yqzpIGCi8rPruVy+nOBQ1x7X1pXYPMvy6Z+U9pdUXu3sCkWd7P7utb2s8b6lnAQqPcugUntpHyLW3lVylD3/o/rdhY3zCw1qdqhWgecwT3pBAVNc9ON81b4I153ufIgau0NBYq0uQintr3+SrqeOsObsiuS29Q3T3mwFCp/CYUKtT+yIMrdbqFP02jE1457PqabxEWE8rQAwUnpgYot2joOl8cs03HgXSma8g8xRkruJ8rSBzFGT2yMxSN1+pmC8V5Af/YlZuo0dBU05DD93dZZjQI7zw8radERXmKTWZ3YPartVRu5VcjcV9MlvJycxl9jVdZglVO8LLeR0DtPSaLukaFJyIrTwQx3OraJO1HYEVIHmDJHJIcCCr3iyK657fRHP/KaagqdcstAwjN6fieT1D+vYpL72CHuEBQAzR/j/msf41nUxYnqK9Vkdm0WP9vcqvnLLp6i9aWONX/FNAiZF88FPzCpB/9+DES8lO2Q109xuCMBT6hWfY1z1rPoslGL3wdHyJsP5WgFB4CKIc2oTX1s8PL29b5lv06Z0csxiCrs11Y16EQVWtTm3Vubf2feKaN/1Ozt4YIqOum67+ooWCpl4rTvWnd3I+vZPjVdXJ2D26uqnVcRQ/DO1IrZ1+J+dL93x2QVMdntxCEAXQJjwAEIrAIaPuWAxxIIYwk8kfI/P7yGwbma3ysmVkNo/MppH5TSYbY4iNMcQGFbNecdYpza8KsimGOBJDHIshool2GjuLLjLquo/FEMdiiF0qjhAyg0T5CBlzkGxUa5AoGSFqD5KdMcSxGMKaU93Wz6e7xxCEudApvGESeB2z7+QYTN6/lPPA6pwPLlPzr20KKu3nC+nuIvo5EkPQ3rOMjU9RM939gyB6ACOEZ2DExcHf/w7x8cDHp20EQRDGgMKjnq4uSEmBJUuAxaK7KQiCIIgEFJ5WEImAzYYjR+DGDbqbgiAIggAACk+r3LkDZmbg7w9dhn81CoIgCNNB4WkXX194+mkoLqa7HQiCIEYPCk+7oPAQBEEYAgpPu/B44OAAmzdDXBzdTUEQBDFuUHhap6sLDh2CU6cgNpbupiAIghgxKDwdcfAgbN0KZWUgwMvQEQRB6ACFpyN6euD6dfjgA2hpobspCIIgRgkKT3fweMBiwdKlkJREd1MQBEGMDxSeTmluhuPH4cQJiI6muykIgiBGBgqPBvbtg337IDcXRCK6m4IgCGI0oPBoQCQCa2v4+GO8XRpBEER3oPDooaYGXFxg5kzIyqK7KQiCIMYBCo82amvh9Gk4dAjreQiCILoAhUcze/eCuTmkptLdDgRBEEMHhUc/5ubw3XfQ2fnXmXShELq6YGiI1mYhCIIYFig8+mloABYLPvoISkru/y91dTB7NoSG0tosBEEQwwKFxwh4PLhyBbZvh9hYSE2FFSvg73+HOXPA3Z3uliEIghgKKDym0NkJb70Fa9bA5s1gYnI/27bR3SwEQRBDAYXHCPr6IC8PXnvtL9WJs2oV1Nbi+XQEQRAKQOExguhomDgRHn54tPAefxzmzoXeXrrbhyAIov+g8OjH3R1mzhytuuH885+weDHk5NDdSgRBED0HhUc/AQGwcKFC4YkTFkZ3KxEEQfQcFB4jSEiAd96Bd96B8ePlC8/WFurr6W4lgiCIPoPCYwQCAfT0QE8PbNggX3iPPQYnTtDdSgRBEH0GhccsCgshLAzu3JHzqnfkCN2NQxAE0WdQeEykvR3OnoXDh2HevL+E98UXwGLR3TIEQRC9BYXHaHx9Yfp0eOih+8579124dw+6uuhuFoIgiB6CwmM6WVnw1FPw8MP3tffII/hpBQRBEHVA4TGd3l5IS4PkZNi4EYWHIAiiPig8rSAUwaXkmp3h5RTmk+PlJl+XPzS/fLkTlf8sLcms76a7ixAEMTpQeBRT3NzrXdjsVdi8IbBkETtfeb4fK9+RiKniLCSRbxVngYJ8ozjzFWTeyJzhVHsXNkdx2/lCvCcUQRAdgcKjkvZ+/sk43oSzic9Zc9LqukQA4gilIpAKXypDAEMAg1IZkEq/VPqk0iuVHql0A3QDdAF0yqQDoAOgXZI2SVoBWgFapNIsSRNAE0CjJA2S1APUA9RJpVaSGoAagGpJqiThAfAAlgeWjDubOONWFtHePygQ0t1vhkYfX9jYM4SRm/Z+Pt39g9AGCo9KNgSUHIomilv6Slr6+vhCEWnPaaI6Wc91K/acrOpaVVddvWLV1ShQHU+SSoBKgJTuwaiWPqey1ml2aXG8Drr7zdBwz2+acjkFIzdr/Yrp7h+ENlB4VPKNS+6BKK5Kr3RDVL/Sdcm82I1SXZti1Y3yXJOCV7p6xa90NQpe6YZVRwAQAFwALkBQfff/nooPLWulu98MhI5+/t6Iil/9i/dHch0z68W5oSAOUrGXl+tSuaYgdvJiK8lVmVwZmcuS2MjkklQujswFqZwfmXMjYy3JWakc41T/6l/8q39xJLeN7h5DdA0Kjxra+visnIYd4eVehc3q2U6R8EjaTtZzqtquRXXbKXqxk7UdMVJ14iR0DCwPKrXiVGfU4R4WTSHa+6+l1W4OLl3rX3w7u4He5XT1RqOSNQZFo1GN5fS7TT1L/IuX+BcfjePFEO109xuiU1B41JDb2POEZXxQaSvTanX0Ti6VknBlUiHJ5865h6MJmvtP//EoaHrOmlPe1k9edZovp/fKW04nXzmmdjld0WiUXWMQj8DVIWXLPAvo7jdEp6DwqEFaeFqq1cmdXGRnFmZOLnJVVw5QjsKjiGHh0bLAQPKpi8xobNK4cqxkOV16HKLwjBAUHjWIhRdY2qrq5KK9Wh3tkwuhQHXlkpQBlKHwqOBGZr1ZWHlwWWv3kICWBQZZ2+lygUHRaKxUPBorAIIbeo4mVa8PKGnsGaK7AxEdgcKjBmnhaf5ip3l1hEbbEUpf7EbZrgzgMxSexpiFli32KND9PinNK8datR0x1mi0yW+adD6JaO+nuf8QXYHCowax8AJKW7W9CVMHk4samzArFa9hVihQXakkKDzNGRYeQyrHtJzyVGM5/RIKz8hA4VGDtPBwcpE7uZTJqK4EoASFRwVi4VFVOVY+FKk65an5AoPmoxGFZ2yg8KhhWHjUbgSQu2rEtMmFUFF1JZIUAxSj8KjALLTsR48C3ZzyZPgCA6HKAsNFFJ6RgcKjBrHw/EtbDf4IuZLJRVGhrlSB6ooAilB4VCAtPB1vS6H3jrpKxbW6MdfSS1B4xgcKjxoUCY/JGwHUsx2h4rYU5bYrAvgUhacxw8LT8RFy2m1HkFvAVDQaL6DwjAwUHjWIhedX2mpgtTrZR2m1a3XFMqorBChE4VGBWHjMPOXJhFqdouV0FJ6xgcKjBmnhGflGAEWTS/FIz4lTgMKjArHwDH4zMJnRKHvuRckCw3kUnpGBwqOGYeEZTK1OjSPkyicXWdUVAOSj8KjALLTsB48Cph0hZ06tTtECAwrP2EDhUYNYeL6lrYZ93TPltkPhUcIo4THhumdG1eoULaefQ+EZGSg8ahgWnjFc96ze5CKrunyAPIAZKDyNGRaeerU6fbnuWfPK8aihiMIzNlB41DBKeAa/M0UN2xXIsx0KjxLEwtNGrY72G1m1t8BQAGCNwjMyUHjUIBaeT2mrqqfImfYoTWjnUVpadXmS5ALkovCoQCw8ump1OrvuWb1zL0oWGFB4xgYKjxqUCE8S5oyfAAAgAElEQVTezpTeirLkcPbtC3b34mo7yuoLUu4FXrqRwGnpqYI+blVJXEhYXGMfd0gj2+Vk+bp52Fra3o9jfMG9FoW2I0bPL0IudCWkcYJTsiK7oVSkLduh8ChhlPCYsAlTbdsRlJ7yVL6cfhaFZ2Sg8KhhWHjkjhw0pwRaHpz31riJ+89xuInptx33/zT5zdPXixoKoS0zMcB225+2ea2ZvRrtTImw/+6XuZOfeWnKf96c8tykf5kedb1RQn7hSFABtR621tY2N+3roUio0cKRXNXlSILC0xxp4THBdprc4KP2crqqtkPhGSEoPGoYJbyxJhdRa3NySuy1FafzOLye5qa49FS2uV9/QYewGURN/KG63t46gahRpNGjNI/LsvP0PuSamdWYbnnNPzCdWyFQaXIRFg/0F/YPFAqpmVxyZVSXDZCNwqMCs9CyRR4F+lU51tnOFCWjEYVnbKDwqEEsPO/SVrK1uqHaguLoQ7tcYsobq4jErERfqzwo6ae0VlfNPnt4w8z3Z37x7dw3tt6xTarSca1OkeqyJckCyAL4BIWnMcPCU++gp4o7U4YaoT7Ifs/O1b+v2eMdJhKmxV4y33ty04ngCBAS0BjuftPxprt7I3CFmlaOSe5MUWMtXTwUz6DwjAwUHjWIhedV2kr67sH+Um7etU2H/UuIhKzE2DBfdquQEFQlhLGvXbhp6ZWd3TtYA9AEUN3ZkBp+9uJliwMWjudd7iUJSr1u2Vk7OVm6ut45ffqyo+Pxixet3IN9qqBy1PxSzb5w9sD3izdtOvDH7APsW6lVBTW5dwOtbFg3D50/v8vC4cTNxCi+sBBqo+P8L1tY7LKw2GVhsdMp1C6rvKArz/nqJXM7f9skIgOgBCAhjc3ysjlhb7/d4tR2C89rSdx4gPzBvujYa9bXLP60uHbALta/dzBNRduh8ChBLDy5R+vG3Jyi+j5MQSO0xrJ3bd9otmhHSIJImJNw8vgx69+skzkgrIT2hJgwv7CYsHYghGPYjqBiH6batkPhGSEoPGoQC8+ztJX85MKr4t49uOlWTrpDJMfHNzIPBHWQ63V+x6ovlkxf7hjS3F0B0DjQnp/lZ774by8/bWJiMmXKZ7/bNCaYL/5s9rLF7yxd8euEp+cvWTjt469mr7c4lwPl/JGTSzXbPjDU3I9bPljlFJYeV9GYkePjeOCNz775YfoXX7/33nezTC0udwylClPsj/7yhYmJyQMPmPx90sQlxzcFJGc3h51YNu+zr8xWXoyMASgCCHVbZ7bh03e/WjT988/fen3lOttw1+7uTF7KiY3/nvaiiYnJC+P+/dvBko6IQYWTyyjVZUqCwtMcaeHpqFbXHOkeEnSCVcgVCWvK3XySM27nafqtYC3tTFEyGq1QeEYGCo8aZIU39uTSzm0J23w8+M52pxQn31rJ5NKUmHLvzH7He23dFQANldGRl3/8+98eeeDBBx988MHn3p21JpSfGnrqWojbb+dcjs2bcyze+ZhnhltEo5zJpZp9PTD0uF/d/VqdCLidhUlpV77aEeCSXp+dGeV/0+JIyVB8b8r1o8u/fODBB//nsQff3rXVMysRoBT4JVDp4Ohx2TkyGqAQoKjO7zTrzk9nkwtFohj301fDwq9mZSW4r/r3i/8nbtsTk/5j6tbo2aBwcsmSUV0GQAYKjwrEwtNtra42ODjkkrVHokjI5bh5p2bcrocaEFULhVVCUZVI9NcrnUhUKRISQiFXKCJEIkIkqhAKy0WiCqFQnHKhsFwkKtfg/nG1l9NReMYGCo8apIVHdnLhNze3uxw/uHn7CfbthEHJ5NKUIBFeOUB9ZXSKzz7TC7FXQhIDEhNDs/OT2oREW+g1r4u/me06vGL5byuXrrsYcTVjSM5zdDX7WmDocb86Lgi50OCXlusTEZCWfW3l+XSfoo6szCi/mxaHS4bieIFnrtksM7vB5nDY2cS9lp58gBLgF0sJrwCgqM7vaoDvH6yKQpEoyv30lbDwK1lZKYG//3w55IhvIisx0TUtM6h5KGVI2eqltOfSAdIA0gA+RuFpjFlo2fceBbo9RT4YFxxyy/qyp1Do5+MWmJ4RP9ha1h5xZtl3pkuO/H47NQOAAOABpKa4Xt77yfQZn7z/ye4dt9mOnJs7P/985oEDy3/5Zdv8+T+uWfPhzJmrbSPuEFpZvVQ0GsVD8TQKz8hA4VHDsPBUmVy6myDtwhazk+e9vOuhEYSNQET5XDm44qeZH3330x9Ot7KrcztLslNu7N67b9vuPVv2WBy64ufXIirh13h7nDt+cMsRB8ft81YeuB3j1ixnI0Bi4B9/bFsyY9GWjXt2bdyzadMlb0snZ/eLpv9dcPnMvQRn7wt7vls4wzyaFex40enc8gMW6/fsWb9nz1HvBI/arpzOdAfLXT/N+272t79vPB/h1z8UHL5/x/bfv/nTI0hUeG7bkp83Hl13OzyywGn3icPrdu1Zu+f4Fktne15f3KCy1cth1aWj8BRgZwd79iiMv7/8v5IVnlZvZBUvXRamBgfdMT9UVHT2VkxwBlECPRW9Bd4OFpt/s9h15S4HgAtQWcO5cXbVx6+aPPCAiYnJyzP/PHMyxNt+w2ezrS79aLp0w9wvlp4+NGfx3qNe2eEtGt3IOubqpdwFBhSesYHCowax8DxKW1V5lB5qgrpAO7ZPVHoSQCMIGqDA1878T1PTr02Xfm167lJcaRr0FNem3Dm4eNXPpnNM167Yff12PRQMQWpCgI+vvWMZ19Hitld6MUfeRoBIn717zUxnm5rOMjWdZWq6yT7MJiz6ztllC5ect0646xBwdefSX2fv8rnjfe2yzdb586ebmDxgYvLEf/+4blXYltkSY7Vh1TJT0y9Nty7+3c2ld9AzyHzfTrNf9t9hi9JO7d6yfN3JTbfj7vaUXj+7Yc1K0y9MVy5Yb3WmpDuyX5ntpD2XJiW8ZdcIf3/A+PvD1KlgYqIw334r/68WXh0hPB3dP14fGxd1YsXFS3uv5YXk9lQBVIGgCiqdnbzsnO4mAlQAEBm2pw4vf+VT01kLTWebmq6/4HEjvbQw9fifrt6/b9m9b8vaP90d/rxREVLRp3vbpQNYovCMDBQeNQwLTxuP0trdCFAXcGbfknfGjXtq3NNPjfvsO0s/x0bqJ5cMeaobFt7fFhDjxgFm3Dh4+GFlwpPNAw/Ak0/CY4vuC0+3HzeoiMu0XzVj5oFb+aE8qAJhpbCvuD3X/uqts1d9w9p7C4WiipwbrGC33REt6c0tmS3tub0DxcLmwv7QXcd3mG3dYrZi5S/zl6zwbvJt0Oj+cSWnPOUup2dIxt4pFJ6RgcKjBrHw2KWt+nfdM78rraEqorAwuLAouLAipqkzna/aRgCSk4uifOycu9mDKCwETGEhTJ+umvAefRQ8PWGlS9n3HgU6v5G1OTkz7MCnay+nlccNAQ9ailqDj82f8d+Jk56dOHP6fBvH1p6M/hJf92Pr57z+6uuvv/L6wp9P+95pFBT3N908vubk7Yv7rrL2fb/zHNF6j6/dWp2ipy4UnrGBwqOGYeEx/7pnbW8EUFSrk00qQCrW8EYSGAjffDO257ZvB3t7sLeHmzehuRnMQsu+8yhQb1uKBl9PHChuqY0ISEho6yoAqIS+0v5yf7bLFXv7U/YeFz3S7/UPFUJvenmql5f9KQd7C3vPm0kl93qhVMDnZMTc5RYFlVYGR6TG9A1kU3FHHZnRmIbCM25QeNQgFp57aavObEeodRuTbmyn3HPStkPhyXLgwGi9Pf44LFkCq1f/lfz8EX8yLDxavhVM1RFyLdlOyWhE4RkbKDxqGCU8rU4uOvhOmIaP0iRVh8KTi1h4Dz4IL7wAL78ML78MM2dCQ4OyPxELj5aPG+j4umdVl9OVj0YUnrGBwqMGsfDcSlsZO7nobCMASc+lAqQApKDwZBAL7x//gOhoqKuDujpobASBQNmfiIVnMB8iV+MIuaJTnspHowUKz8hA4VGDtPCYuDNF4ysqlNtuzDVMRbZD4cmSlweenuDnBx0dZP/ELLTM1KNA3SPkChcYtHfds45rdYqGIgrP2EDhUcOw8LTxbkeQ25xCy7vdmDtT5AovRSofofA0Rlp4WrUdQfd1z1RVjlF4xgkKjxrEwnMtbWXywpHmdw+qt3AkV3XJkqDwNEcsPFUrxyQfudSoHGvvumdVT3kqf+RC4RkbKDxqkBYehQtHBrMzJUWe6lB4VDEsPF0Wj/Xddig8IwSFRw1i4bmUtlIyuRAyttPetjc1Jpcxj9aRVF0SQBIKjwrEwtNS5Zhg8AKDSqNRdiieROEZGSg8ahgWnuaTC2EQk4vc1ctRqkPhUYVYeDrbmaIvdxqM+dSFwjM2UHjUIBaec2mrerYjGFyrU2MvAJkXOxQehZiFli30KNDNzhQ9utNgzKGIwjM2UHjUIBYeSyI8qmp1THiUpmpySZIJB4CDwqMCsfAo2ZlikLU6RaPxBArPyEDhUcOw8HByGVN1nJFB4WmOWHiGespT7TsNxlxOR+EZGyg8ahAL705pK1W1OhonFy3V6mRVlwiQiMKjArHwsFan6gIDCs/YQOFRg7TwNK/V6ekRcjVslwjwXxSexpiFln0rER7W6sg/e6HwjA0UHjUUNfe+ejnlekFT0aAAa3UkVRcrFAV0D85m51slVNHdgfqNWHhGe/+42k9dKDxjA4VHDYMCEdHev8Sr8BCnGicX5Z5LBEgASABwbur9t22aa35TWx+f7g7Ub8TCI7OcbpD3j6s9Gs1ReEYGCo9KvnHJ3RbFNfhaneaqE+dWffffTsWHlrXS3G36j1lo2QKPAjK1OoKKcy/a+LiBVmt1ikYjCs/YQOFRiU1KzZ4YwjK97nRGXXrPEMHIR2m6anXStrvEbd+TXrczuXpjUGl+Uw/d/ab3uOc3bY+ouJTTUDQgoKpWpxvb6aZWJ3c02lV1/plQtSeioqV3iO4ORHQECo9irqfXvXE19U3bNPui5rtNvcMJlyRMktCm3tCm3hBJgqUSJEmgVAIk8ZfETyq+kvhI4i2JlySeTb2eTb0eSsOWibtU3EbGVWlcpOI8MosDSt64mvoDO793SEh3jxkIHgVNE6w5CW39uJxO8sHrx5CyZZ4FdPcbolNQeBTTxxe29vGbeoe+cMp+yipBNk/qPE8wL7eyG1r7+B0DfBHd/WUwiIUX39ZPy4fIVT3lqdxz2l5gQOEZLSg8rSACiON1+Be3YOSmpmuA7i4yNGq7Bt3yGn/0LpztlmeeWkswb/WS2lqdJpXjT93yPnXLOxrPS6/torvfEJ2CwkMQA6FrQGCVULU3omJvDLE3oUo6e0Zm98jsGpmdMtkhle0j8+fImI3MHyPz+1jZpjhbZbJFaTYryO9xvL0RFXsjKhKrOunuMUTXoPAQxNDwL26Z4Zilg7x5Icvk1yyTX7Mmn9DF/x0l+TOsnO7+QWgDhYcgBohIJ4m5ByYmYGIC1tY6+n+kJIjRgsJDEERldu2Czz6DVasgLg7i4qCmhu4GIQgJUHgIgpAlKQn274f9+8HcHE6dAmdnuhuEIKqAwkMQZAz6+yEqCoKCwMoKFiyABQsgPZ3uNiGI6qDwEARRxtAQFBXB1Knw1FOwcyfdrUEQDUDhIQiijJAQ+PxziImBvDyoraW7NQiiASg8BEHkMDAAFhawaRPs2wcsFnThEW1E/0HhIQgyguxsYLHg9m3YvBlWrIArV+huEIJQBAoPQRAAgIEBqKwEgoAjR2DyZHj9dcjPp7tNCEIpKDwEQQAAsrPhX/+CSZPg+HGoroaaGhjCz+YghgUKD0GMnQsX4KefYNMmcHEBNzd8sUMMFhQeghgpRUVgYwM2NrB/P/z+O5w9CwIB3W1CEG2CwkMQY4THgytX4N134d13ISKC7tYgiE5A4SGIMbJ1K6xdCz090NMDfD7drUEQnYDCQxAjIikJ5s6FuXPh7FnIy6O7NQiiW1B4CGIU3LoF5uZw/DgcPgyHD+NlmIgxgsJDEEOGx4PoaIiOhlWr4Msv4eBBuhuEIPSBwkMQA0QkgsFBGBwES0t45BF49FHgcOhuE4LQDQoPQQyQigqYNQs+/BAOHoSUFEhJge5uutuEIHSDwkMQg8LFBXbsgD17wNoazp2D+Hi6G4QgjAGFhyCGQE0NeHuDtzfs3Ak//ABmZvhKhyCjQeEhiN7T3Q0sFkyYABMmAJtNd2sQhKmg8BBE7zl5EtauhZISKCmBzk66W4MgTAWFhyD6SmEhrF0La9fCyZMQHU13axCE8aDwEET/CA2FGzfg3DlYtw7WrcPLMBGEFCg8BNEb2tqguBiKi2HZMvjPf2D1arobhCB6BQoPQfQGe3t4+ml4+mnw94emJujooLtBCKJXoPAQhOk0NsK6dbBoEezfDz4+4OMDjY10twlB9BAUHoIwl4gIsLYGKyvYvRt27gRfX7obhCD6DAoPQWijrw/S06GtTc5/EgggJwd27ICPPoJFi6CpSeeNQxCDA4WHILRRXAzPPgv+/nL+U0cHvPMO2NkBnw8Cgc5bhiCGCAoPQeghOBg+/BAefnj0QqWDA3zxBcydC2w21NbS1DgEMURQeAhCA97e8O23YGICJiawZAmEhUFVFRw+DIcOwbFjcOIEnD2LO1MQhGJQeAiiUwYHIS4O5sy5bztxFi+Gmzdh/nyYNw/c3eluIoIYKCg8BNERAwPQ3Q1cLrz88gjbifPxxyAU0t1EBDFoUHgIoiOsreHtt2HqVHj0URQegtAACg9BtI5AAGfOwDvvyPEcCg9BdAYKD0G0S2MjsFjwyivKbGdiAq++Ci4ueN4OQbQICg9BtEhnJ3h4jKG68ePhhRfuJzmZ7hYjiOGCwkMQLWJjA888M4bw7O2hsvJ+BgbobjGCGC4oPATRFlZW8Pbbo/X2xBNw7hw4O/+V6mq6G4ogxgEKD2EuUdz2q6m1+ps3VteafDA6//iq9lgwBf94ak0X3f2DIHoGCg9hHB0D/JyGnpyGnq3BpW/ZpQ1nmmZ5U91MVT1vqJjXVclrdmmv2aUdiiFyGnryGnv6hnBzJ4KQAoWHMA7/4pYnLOOfsIx3yKzvGBCI0y6VNqm0SqVFkmapNEmlUV4apFIvlboBQd2AoHZAUCOTakmqBgRVAwKeJJWSEFLhDgi4A4IKScolKRsQlA0ISiUpkUqxVIokKRwQFA4ICiTZca/yCcv4p88mZtZ3091jCKIfoPAQZmGfUbctpCy4tDW4tLWqc0AEIJSKQCp8qQwBDAEMSmVAKv1S6ZNKr1R6pNIN0A3QBdAF0DkyHZK0A7QDtEnSCtAK0CKVZkmaAJoAGiVpkKQeoB6gTiq1ktQA1ABUS1IlCQ+AB1AJUAkQ09p3s7TVoaRluV+xX3EL3f2GIHoACg9hFjvCy39g54sAxKHFdnJVxxzbEZJwAYr4wmn2GReTa2juNgTRB1B4CFMQiSCzvntfJPdQNEFGdUOUqq5b6sVOkeraR6quVXXV1auuOt7IFzsCgCuVYoHop4ASi4SqwqZeujsQQZgOCg9hCoMC0YcOGdacapKvdGRUR34Bs5vEKx0Z1TWprrqakaqrIqc6cSoAKgDWhJYt8SiguwMRhOmg8BCmIC08HdfqKFy9bFJ99VKR6iolUeS5CoBygHKA1Sg8BCEBCg9hCsPC0/bqJZltKe10FOpkX+kImRe7UaorAyhD4SEIOVB4CFMYJTwat6XQbjtC6QLmKNuh8BCEJCg8hCmIhXeWU03hix2Ta3Ukt6VIq65cRnWlAKUAq1B4CEICFB7CFKSFJ6s6Wmp1rarX6uq1WasrH+m5UoASgBIUHoKQA4WHMIVh4Rl8ra5K3VqdrOqKAYpReAhCDhQewhTEwjvDqTbsWp3sEXLytTq5tisGWInCQxASoPAQpjBKeJofIZf1nBpHyGmp1SlSXYmM6ooAilB4CEIOFB7CFIaFR2+tTpHqNK/V8RTX6hRtSylVoLoiSQoBClF4CEIOFB7CFKSFZ5DXPRMkanWKVFesQHWFAAUAK1B4CEICFB7CFMTCs+JUG/Z1z9TaDoWHIORB4SFMYZTwDPW6Z01qdaM8J04+Cg9ByIHCQ5iCWHinOdUU1urU2JaipFZH4XXPio6QK6/VyaouHyAPYDkKD0FIgMJDmMIo4en7zhSC6p0p0rbLl7IdCg9BSILCQ5jCsPB0uTNFGx83INTdmaKG6nIBclF4CEIOFB7CFGSFp/bOlKb+zvKiqPC4u95373rfjfaJTE9p6qnka/d6MEKznSlq2w6FhyAkQeEhTEFaeCqtYcpemFJZleGz/cl3Jz/6yKOPPfa3Z/7x5KzNvkVRbSJG7UxRtAlTSblOVnU5ADkoPAQhBwoPYQpi4VlyqjXfmdI42EhU2Z6+6Hb5VnRkYmi47/E9dzL9CroY8nEDVTdhDnsub6TncgCyAbIBfkHhIQgJUHgIUxgWnnStrkvNbSkdzRB+YfvuzUs3btix57fjNhdiypOaBvS3VqdIdVkAWSg8BCEHCg9hCmLhneJUq3eKfOSnfDqaIdz6t40r/vvhV3PnT9kU6lvZQQDw2qrSk9lOPmx7doxfemU+CGuhJzM7xjeQfZ3tc80jKryqI4WbE5fk6xYRYe/lZccOdk0sSOwVEqKetNxY7yD2Ve/Aq5HFCW29mbV50Um+rMhIO2/vy+wo16SKVBCVQk9yfrxnMNuG7W3DjvTltqQOQkFXU0Ia+4Y/+yI70imxnANQQKntUHgIQhIUHsIUhoVHxccNOpog/KZ3TrCra2L4lQ3+Pantwjp+X1r8rZM/mIx73MTE5JOZ6x3Zg4M8qLi5d8HCaeOfnjjl2edN/wwosnc+fPLXye/M+Or5yf965tn3Pl1paVXcU9CZZX/kx4XvTXzmlfefmWdtnVzp5W9+ct2L73w6+/l//fvpcV9/tdbBScDPB8LRfOn3b48bN/HlCRMXbHDL8G7u5+QEWf1i8uJ4ExOT997+7uL1AcgQybkejEytLltGdZkAmQA/o/AQhAQoPIQpyApPg1PkHY0Q7uidExyXl5Ybc3SPU0R1S1lZkNPJReMfN3noQRMTk7+9vtDsYNpgBb/i5oVrlx08/CqIxIra3J7BYl6Yq4fVZ5s9vFLy41PdHP1cf7dPi3BccZTleya6IrY4I5Zz6bB72q1gbzfv0x9tdHfh5Pm6XLO75XCmmp/NJ25cczxzxdm1goisqEnuGsjjxrhfXjH+Hyb/85CJicmjL362fHMiJPaRrdUpUl2mJBkAGSg8BCEHCg9hCtLC0/hD5B0NEO7onROUVFdckeN18oBjXk1iurv37QOz9jmdcnC65OR0MzLpbqOQJ+xOTfK6arVv3aqNi1efsEmpTuTFB8bcWWqVk9zcX9kY4RPtuelCQsiFeQfYMVeKgNtfzy23OXAn+UZIUFCs06JT2bH1fSnRri5sBwtCmMXvjk8PuHL+4OpV6xetOmYZWx6eHeznsvujXU577ZxOOznZhMZ41kEWX/3Vy1GqSwdIB/gJhYcgJEDhIUxBLDwLTrXmF6ZUd1dlJuw023nhFCsjvprIunva4kKIs7+7Z7jtH6eun7K7fua6+82o7PjOfl5nQYDzwbVzpj1j8sQDD874lZ0bWBYfEGBtutzi8AVbS2urY9fdjkeWxEeetLS9sPv89VP2dqfsL5gH5rKCbjpc+ePTVb7uRLGbo/mBP7b/5JwbVZ/L9jBfv/C9Z03+9wGTD5c5JrkVpUXE2K63uH7w6vXj110vBqcEdkG2kALbiVWXBpCGwkMQcqDwEKYgLTwNP25QUVfgf/K9BV+arjjl7d7YXjVw78ySc1dYoc7JzqeWTJ3+7tQpU+cv2uV4k9fO5bkfXGv66dSpU6Z+OOXNFXvDSoPyQm6fWfKfhx5/9qUpL722etkBXz/gl0CN28WNq+ZMffWD2a/+fMu+oD4o2ubEpllTPzhxvijE4uSWxTMWf7jljlfOnV1bl3w6deorU6e/MvWnbT45Ph0d8YWBp36e+vEHU1+ZOmfWhgvnaiCVP0atTpHqMiRJGxkUHoKQAYWHMIVh4Wn+cYM6oaCqt720o7Osd4AnFNWKhridfdyBQYI/UN7ZVtDelt/WUdTTXyEUVQkHSro689vactvac9q6igcFkX4Ht3/7zONPzvrVK9uL15XXM1gKUAHCkr7u3I62jPaOjK7+QoGweKgvv7sjvb03XzCY19ud2d6Z3j1QwB/I7u5Ma2tLaWtPaevKHOTniUT5gsHsrraU9rakto6U7r5M4V/vc6rW6tJlVIfCQxDyoPAQpiAW3klONY3XPRMA+XWFkclhN0OTI5p6c/la+biBktVLJapTZDsUHoKQBIWHMIVh4en4Uz6EgjswtfQpH1Vtp1x1KDwEIQ8KD2EKYuGd4FST2IRJzYfIxRnzDky1P0Q+5rm6MWt1Y6ouFSAVhYcg5EDhIUxhWHiM/RA5hdc9KzpCrpLnUlF4CKIKKDyEKYiFZ86plvtKx6jrnrVaq1NJdSkAKQDLUHgIQgIUHsIUpIWnue00/xC5vtgOhYcgJEHhIUxhWHhaercjGGw7MjtTFNkOhYcgJEHhIUxBWngUfohc0c4URarT9qd8KHyxSwFIBkhG4SEIOVB4CFMQC+84p5rCTZiEAe1MkfVcMgoPQVQBhYcwhWHhUbUzhVBRdZp/iJz8hSnKbUdedUkASQBLUXgIQgIUHsIUxMI7xqnWaq2OXttpWKuTazsUHoKQBIWHMAVp4aldqyMMulYnqzoUHoKQB4WHMIVh4WmpVqfGhSkka3WqftxAuedSFXtOVnUcAA4KD0HIgcJDmIJYeEc51QZWq1PyYqf2K92w6lB4CEIeFB7CFKSFh7U68rZD4SEISVB4CFMQC+8Ip5r2C1NI1uoovzBlTNVxZJIIkAiwBIWHICRA4SFMYVh4+vtxA7VrdaqqLlEqCSg8BPxu86IAAAHgSURBVCEHCg9hCkIRJNd07o7k7oytpKRWp8YRcpKrl7JHyKk9V0dedfcEoh+Dy47F87IbuunuQARhOig8hFnsCC+fz87XvFanG9tRW6tT9cUuASCaL3zNPuNicg3d/YYgegAKD2EWtmm164JL3bjtrtz21O5BwkCve9bwxS4BwLO9/xK3/UJ52w/ehd6FzXT3G4LoASg8hHH4FDU/ciL2kROxZ7LqSwSi4RRLUiRJoUBUKBAVSJIvEOULRHmS5EqSI5VsgShbIMqSJFOSDIEoQyBKlyRNklSBKFUgSpEkWSBKFoiSBCKO0iSOTIJU4kcmTiaxI3NPKjFSWXev8pETsU9YxqfX4WImgpAChYcwjrY+fkpNV0pN1+aQsrcdMmTzFrlMI503x8pUzfIGFXl9ZPbHECk1XWm1XT1DArp7DEH0AxQewlzCylvPcappzH//rP7gDzoboCScqk66+wdB9AwUHoIoZP16WLOG7kYgCEIRKDwEUQgKD0EMCRQegigEhYcghgQKD0EUgsJDEEMChYcgCkHhIYghgcJDEIWg8BDEkEDhIYhCUHgIYkig8BBEISg8BDEkUHgIohAPDzh8GG7cgN5eupuCIIjGoPAQRBm3bsGrr0JDA93tQBBEY/4fe1zmXQHOQcgAAAAASUVORK5CYII=" alt="" />
1)RouteTable的创建
RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的asp.net程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx
对应到服务器磁盘上的文件index.aspx)index.aspx实际上是一个类,由IHttpHandler创建实例化。IHttpHandler包含一个
ProcessRequest方法,负责响应页面输出!
但是mvc application 是不同的,每一个请求映射到route,route 定义在route table上,在应用程序启动时创建!
RouteTable的在应用程序的具体使用如下
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"Account", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Account", action = "LogOn", id = "" } // Parameter defaults
); } protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
2)UrlRoutingModule 请求拦截
每一个Http 请求 都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContext的routing engine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routing engine,提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口,在web.config 文件进行了注册!
UrlRoutingModule 具体的数据结构如下:
public class UrlRoutingModule : IHttpModule
{
// 主要的 Methods
protected virtual void Init(HttpApplication application);
private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);
private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
public virtual void PostMapRequestHandler(HttpContextBase context);
public virtual void PostResolveRequestCache(HttpContextBase context);
void IHttpModule.Init(HttpApplication application); // Properties
public RouteCollection RouteCollection { get; set; } }
UrlRoutingModule 在WebConfig的注册
<httpModules>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
3)Routing engine 确定route
routing engine基于当前HttpContext确定Route的处理。routing engine 指出route table里面匹配的route ,并在IRouteHandler实例创建route处理!
4)route handler 创建相关的IHttpHandler实例
在
route table里,每一个route
都与一个IHttpHandler对应。IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制
器)!IHttpHandler是由当前活动的IRouteHandler的GetHttpHandler所创建!
具体的细节如下
public interface IRouteHandler
{
// Methods
IHttpHandler GetHttpHandler(RequestContext requestContext);
}
5)IHttpHandler实例确定Controller(控制器)
在MVC应用程序中,MvcHandler实现了IHttpHandler,Controller实例,是基于所输入的 HttpContext 和Url参数与route 对应的,ControllerFactory 创建一个controller,ControllerContext包含上下文数据,传入到controller的Excute方法,触发 controller的逻辑处理!
MvcHandler主要有一个ControllerBuilder _controllerBuilder字段;
具体细节如下
public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
{
// 主要的Fields
private ControllerBuilder _controllerBuilder;
}
ControllerBuilder类主要有一个方法GetControllerFactory
public class ControllerBuilder
{
public IControllerFactory GetControllerFactory();
} 通过实现IControllerFactory 工厂 创建一个Controller
6)Controller执行
所
有的controller
逻辑调用执行时,actions请求被执行!当controller的逻辑被执行时,会返回一个ActionResult。一个ActionResult
实例,会触发呈现一个View(视图),当触发发生时,一个视图引擎被创建,进行进一步的处理
7)一个视图引擎创建
视图引擎实例会创建一个IView接口实例,返回一个ViewEngineResult实例,
8) 视图呈现
IView实例编译请求视图,提供Render方法调用的数据!
Asp.NetWebForm的执行过程:
1.发送一个请求:到达http.sys 内核模块(存放发送过来的请求---内存队列)
2.通w3vc服务---》初始化应用程序池(工作进程)
2.1静态文件:读取出来直接封装成响应报文,然后返回给客户端
2.2 a.aspx(启动asp.net运行时)
通过一个插件:asp.net-isapi.dll(动态连接库)作用:
1.负责启动Asp。Net运行时
2.托管环境和非托管环境的分界线
3.到达IsAPIRutime。PR(ecb)---》连接非托管与托管的入口
内部把ecb--》HttpWorkerRequest(包括:请求报文和响应)
通过HTTPRutime 。PR执行(WR)方法
此时--》WR包含---》HttpContext 1.Request 2.Response
4.通过HttpApplicationFactory获取一个HttpApplication对象
内部执行的方法:1.如果是第一次请求就把gloable文件变异成一个类型
2.调用application-Start()方法
3.通过HttpApplication的池获取一个HttpApplication对象(如果有空闲的HttpApplication就用没有就反射出来)负责管道的运作
5.在第七个和第八个事件之间: 根据请求地址创建页面对象或一般处理程序
6.整个管道流动是HttpContext在管道中的任何一个位置都可以获取请求报文的信息 最后一个步骤结束的时候HttpContext上下文中的Response就是给客户端的响应内容
7.第九个事件和第十个事件
1.根据cookie中的SessionId加载会话状态
8。11和12个事件:
页面的生命周期1.创建页面控件树 2.确定IsPostBack 3.初始化 4.加载ViewState (隐藏的拿出)处理回发数据找到对应改变的控件和被点击的控件 5.加载 6.触发改变的事件和点击事件 7.预渲染(最后的机会改变当前页面的控件状态) 8.保存页面状态 9.渲染 10.卸载
Asp.netWebForm和MVC的区别:
1.Aspx页面(HTML、Aspx控件)页面展示逻辑 ====View层
2.代码后置类的控制逻辑 Controller层(调用业务逻辑,处理用户的请求数据,把数据交给View展示)
3.Model====业务逻辑层、数据库访问层、数据模型层