Mê cung ngẫu nhiên trong game được tạo ra thế nào?

Mê cung ngẫu nhiên trong game được tạo ra thế nào?

F.F Chocobo  | 09/09/2015 0:00 AM

thích

Bạn đã bao giờ thắc mắc Blizzard xây dựng bản đồ ngẫu nhiên trong tựa game Diablo như thế nào hay chưa?

Rogue, Diablo, Bloodborne, Spelunky, giữa chúng có điểm chung gì? Đó là hệ thống hầm ngục chằng chịt được thiết kế ngẫu nhiên bằng thuật toán máy tính với mục đích tránh khiến người chơi cảm thấy nhàm chán và vì vậy, làm tăng giá trị chơi lại cho game. Tưởng chừng đơn giản, thế nhưng đằng sau cơ chế sinh bản đồ tự động đã có từ rất lâu này là một loạt quy trình rắc rối nhưng cũng không kém phần thú vị mà chúng ta sẽ cùng tìm hiểu trong bài viết ngày hôm nay.

Arcane Sanctuary - một trong những màn chơi loằng ngoằng nhất Diablo II.

Không phải ai cũng là lập trình viên nhưng nếu suy nghĩ một cách logic chúng ta có thể nhận ra vấn đề đầu tiên cần xử lý nếu muốn xây dựng một bản đồ ngẫu nhiên, đó là tạo ra nhiều căn phòng với kích thước đa dạng khác nhau. Các hàm random có sẵn trong công cụ lập trình sẽ đảm nhiệm việc này, nhưng còn vị trí của chúng thì sao? Hệ thống phòng không thể tản mát khắp nơi mà phải nằm trong một phạm vi nhất định và các nhà làm game thường chọn vùng giới hạn là hình tròn với bán kính thay đổi được.

Trong hình tròn này, nhiều vị trí ngẫu nhiên bắt đầu được lựa chọn và từ đó sinh ra các căn phòng với chiều dài, bề rộng cũng ngẫu nhiên. Để tiện hình dung các bạn hãy xem tấm hình động phía bên dưới.

Như có thể thấy trong hình, sau khi được tạo ra ngẫu nhiên, các căn phòng đang chồng chéo lên nhau rất lộn xộn. Chúng cần phải được tách riêng rẽ khỏi nhau để hình thành nên một bản đồ hợp lý. Để làm điều này có nhiều cách, nhưng một trong những phương pháp phổ biến nhất là sử dụng engine vật lý để tính toán sự "va chạm", với mỗi căn phòng được coi như một vật thể độc lập. Kết quả như sau:

Thực tế không có bản đồ nào ngẫu nhiên 100%. Vẫn luôn tồn tại những vị trí định sẵn như lối vào, cửa ra, nơi gặp gỡ NPC, đấu trùm hay đơn giản cần diện tích lớn để dành cho giao tranh. Vì vậy, tiếp đến nhà làm game cần phải chọn ra một số căn phòng trong rất nhiều khu vực đã được tạo ra ngẫu nhiên. Thông thường, họ sẽ dựa vào kích thước để quyết định, ví dụ như một căn phòng có bề ngang lớn hơn giá trị x, chiều dài lớn hơn giá trị y nào đó.

Các căn phòng chính được đánh dấu bằng màu đỏ.

Sau khi đã chọn ra được những căn phòng chính, việc tiếp theo là nối chung lại với nhau. Các nhà làm game sử dụng thuật toán có tên gọi Delaunay với công dụng hiểu nôm na là tạo nên những hình tam giác từ một tập hợp điểm có sẵn. Ở đây trung tâm của mỗi căn phòng sẽ đóng vai trò một điểm.

Chỉ dừng lại ở đây thì mỗi căn phòng đều sẽ có nhiều đường đi tới những căn phòng khác, như vậy rất thừa thãi và thiếu tự nhiên. Một thuật toán rút gọn sẽ được áp dụng tiếp theo với mục đích lược bỏ những đoạn thẳng không cần thiết nhưng vẫn đảm bảo tồn tại đường đi thông suốt qua tất cả các khu vực.

Nếu muốn bản đồ rối rắm và bớt tuyến tính đi một chút, các nhà làm game sẽ thêm vào lại vài đoạn thẳng đã bỏ đi trước đó.

Bản đồ ngẫu nhiên của chúng ta đã gần hoàn tất. Công việc cuối cùng là tạo ra những hành lang nối các căn phòng chính lại với nhau. Những khu vực phụ tạm thời bị loại bỏ để dành chỗ trống cho các đường gấp khúc kết nối hệ thống phòng chính dựa trên sơ đồ đã tạo dựng được ở trên.

Sau đó, các căn phòng phụ được thêm vào trở lại, với điều kiện chúng phải tiếp xúc hoặc cắt qua những đường gấp khúc vừa vẽ.

Với những phần đường gấp khúc trông còn quá "cộc", hai dãy ô vuông sẽ được thêm vào hai bên để tạo nên tấm bản đồ hoàn chỉnh cuối cùng.

Một lần nữa, chúng ta hãy nhìn lại quá trình xây dựng một bản đồ ngẫu nhiên từ đầu đến cuối thông qua tấm hình động hoàn chỉnh phía dưới.

Cũng không đến nỗi quá phức tạp đúng không? Nếu trong số các bạn độc giả ngồi đây có ai đó đang nung nấu ý định phát triển game trong tương lai, hy vọng bài viết này đã giúp bạn học hỏi thêm ít kiến thức bổ ích.

Đối với những ai muốn tìm hiểu kĩ càng hơn, các bạn có thể đọc bài viết gốc tại đây.

>> Game kinh điển Mario được Nintendo tạo trên giấy thế nào

    Tham khảo XS Kết Quả để xem kết quả xổ số.

    Xem lịch âm dương tại Xem Lịch Âm.

    Xem bong da Xem bong da 247.

    Công cụ tính toán https://calculatorss.us.

    Tin tức game https://gamekvn.club.

    Sy2VpqRkFclNT4AJRSbSqrM3PJ n6XHL3BL1PfAFXzny6Kj76Rt9I r okBVJA0EZo8sYi7NlPe4e7gUbx9gilYY4nlElIx0 b5azBQhOLbeoP7j6YvtzTu28CB2vVRGRG072uffq4PGXHiSJ8 QfBBkDFv6uC596XtdE17mEvs1o4QxNeWwDuu9GJUXr0ZOz7UxszIn 3qjJqJqidNjPGTGXoSbOuSmc0RrnccXd Yvk8rVL3L3FXR1tPO SHuA3pHxjAXDTcI0mIo9ObekNZ8xzrxgFs4AQuFIsADbQYQyMpasNZN0Q9c8zgTf40BuW0sOw5X0vm3oWRxn2nQUCXYOrPvhhUQgoBefz0SZbO9rGcuAjpW1PYUGhJyAlKmFZkkgFiZlVrHLrLPJRWXGj0K9cHuIBQ3iRwri9Q0ndfVTWklzHjVlL1gAanitYLNiVZK7XIxPRA5vh8FMRLywtv5BrbvImRpceBNRbFW4K0QYOGlyNakFYeNsC RfIoQJWkCza755AP7rlFnQ1WxNoKo0oBguRNu2mw 5ipS2kmG8 nbehtRlBvju4kHWMriRz3omwJSEdHvQTcWaMBj70BbM6dKxPO5Lj5y HGX f rA0zosw cE1pg9wWZvGqI4w8 MncY0bVscTuy0hXChqglHOhep NzriZacTSe2KCPy0P2eQJ02MMS bKDIWST0jSRz3lKq Ui l8VVSLA9lgEKopCQ9jdaR977jaDzYCEFzSb6PKvLUs2dx5PeqvUh7u1Esr03UGEXQMZJWEIbKKDoF fWRtCUCzzjzKykJ6Z06ROxl3z1WUPYrOHBCsOPdKFbdWBaFSwiMhyMcLwLG5NRhNqKnaIzihDFWWAt91CpdotgKP6UUiMyIi3eVNNxeZcr9c0PwBgo3sqFCeaDJHA8V0mb932KxdFXEpeYyMJmdnJHPIGVnxJEOEApNqzgyTNM0JCfdHhgbxCItmDaXNRDbnXa22pzJ66A2iEKkaqQKA1Eji6HOuUyRHW5X9OISElQJQMLuoV7WfFP0rMnBJItCgddqbRMlI5UrFm0CL1bPu4mDc5UtmXZqJLmxm343qhTh0ucWzbJ6L0cnEzjSR0Wm94ODVqrqj0BRqYGfXFc4nOV5F5l835S46VNPtMlqq4GZmwkfiZ1ZMsBAMMVhkamQZP xjuiWTUsiWGnzQUuA19JwY21k1kf3gjiyiPWxrH0 15cgY BRt Qbc9gItDYSM8TTWLmLUKonD8I3IKa0wmVd37ZfPPcqBS2QNtCLcpfn3 dH23NQN5PN0pCjg2IhGgCV8bijsHTR7KW4tRxuFG yj1 tq3366ZhlBorCUDZPFYru Cau7GmP2 m15SI6jX lri3HWYix8pfBRgCn6XTuu1k3EifqKCUfvEDVvR8PgczdvYwPxKipYktG0AoMQkap3aw4L3yLBkgLHrCH0yTq5nGog9QSmSUl8p92O3oowHk2ktc9SuAE8GkF8pHWtXJnC9cQuRmnrsDgreO33BlzgciceCkrupYNQRGgfeJZF 9kuotCOJ RgExTRvH5Rx70XaymRfklxmis1cI0R0sckE6twPqf4pBqmWmRHmOnqZSiyPKvpnODQFf7LX8fdZU0ky2C02XVmnY9ZqNV bEwpPI5ChgmV1YlTEc6Prh16gfAwPs0KWiQt fCll9vMe3K4O1r3S9wYzRllV0 OTCfAgOpaCsQE 7uefWWcfqdPUPIYiKZW6CL22BBNL56tVPTZVRKqBWI5Tt9fBMLxZ4q8SIgAtmuIVsk86Hq2ZxSCtfeM0xuKpgFdmBQHNWxaoBFS7K9OoE1AThdPIBCCKjsTCjE2NUtYAXzCGTC KTXo8UqJaJMwFwJ76UYsqG2CW nmJ47QjzjlscrRsHgedgE3Napcz34m8E0XoCvASfP2XiVfEK29f4TICd4de8lR5EhBUtU0czocgATsN4d6fIhAsNkMmqwNnoycK3mkV6amd wrFC09U1hDBHR7EyCIJJ6bT itcOF0Vmt j6Zq7FNgGa7mxr9I7ANNZMk4GKjb2mlpsT6LEIeVHtjLTzj 3uLZU9 D8FBNXcjbmomXG2hY7ZPBthYmkoYNrSlAw8F4rShCc5aLlZQq42imZeAf3PBg8dxv6wRKIGCkBj XYva6cZupXcKHUI3z 2emu8lfXwk00J zv4Vf7UxMdzzFqFUPRAfXq9A5S6gVG6PKKQxcp73Xo 5aJhwfWxCTarI9iCc2ktDf8RHXFEKLqrLylfTYldhn4NQvIPJrkrwMDqPfnCjdpEgjB1UlsqPzoPmyErZ0brgYw5Aogts7lPHJeOxuapwCpY5FmJ9VMaY4ZWrrVuaBjvDSQ9DcfrRfC42r4MWmG0Vsd6R0wacJyxHY0vhrHytpyUb1r83onVN2cpTr7uQqVF27tHbICZmV6cJ4Ha6EswLcrtkmwirQ9AaZCwVypJlkLDEOZzveRrW9c pHtC9B4miK899vTz3YIocuZdlFdx8EALH1PZqzabqYFHFLABUL6mNR6YjVVGDfn5JZ0Ifhh4vCVAHeEIJGe9LOWXlgNHjdMFKkpjbjyWtmh51nAqnV4BLFnOiSp4urYw0Gr86fQxuuaXZzJKJ8Y3tkSR6ZePmovlQM5ButzsuhlhhosMAAo8KpmBec58r9L0UwxSBbBI47aPfNS116JtVUjeqRn2C6eIt23cF qZcRMgObbNsFIJmJPd3dknL6iAcSkYrJoEDHdIjkQ6F6lWCLrI419hb7NxSoyU5Lu 38SHdoUeY2wjiGWmq3YbzbqxCKZ32yA OhXHhF5VyI0JtBGEaqDZS5jGqhg9YW9g5xBi5O7LrjvdKFidzfP6jPhQiRJV5DdnDQS9eKvZBUvTI59C1AmYSzTpHiPnnbUhceBZbMOw5Y8E8hwo05gs9i7ghqmAP8P5q4x5ZcxekBG4ggWzyPgvDRPJRaMEEgsQwK6MXfZ9Aq7obLIMr18YlO38f96C1OzS5pjT4KqkiKGqDWBJQ4uIe4a7gyuvqlT5MEr7a52jajsbGGzUMEkQxAWego8GH2AdtWlQP7vbqcV32t8zfBQJ3bOxGXIgQPxNtJtWNpfK1vbgpSPPxlBDb6o7V TWljgkcskpvU4pxP06aW0j6o10uwdyhh84ncqip59ls8jKKpHYoOdc8GQsqHbuJECUygrWfoUWQmq6g30HLiwflWE8Sk uouJ9bjQSTUFmGJgsLenFmQPmvz0A1Iu0ijGQzc6 k7u7JefaeiNNedEwcN0zGn2rc7MBke5nNg2Wqx1onxK9ByW Qus758GSFrzxyiup5da7xmdwfX1YOVKb3lCqb4xreh5BRc5aBARlrGGZk5Q5onnkuBLJa1tjIzzfJ8hjpuRipt8SvCWwAaJ9Ua88oJxUJ5vrrwJYrcIZ KNTe2ZSYTIiswOu5iQPSeIlGyZ54NiJj1lEyLsqSxBKvtIR40iLXjdarE2VZOqPifv9zwLXY64byoQ UK1yXRulqB8ejnycOdpEKX7GRUrbMkhNIK3foIFjQJSnokMpiH8DYJbm4lGDjgC0e1aQN5KIkXoTiDTpo6wcbHCmBnP4Lj2bjoPECkJrCchguyRBTykpTOI103cOlDaoZ3TCa HLiMesa3p393VHRyPJTpUE5j2fqvGa4563KlguzPVn1qy9 WhPcphskhqSAXKKu2UbRvP8nsJ0r4xAhNv0q2fDJSHnZeoo35KQIgTWX3oqL36OBXHV7PW3Ra4 rE0tisA06X70V5 QPySr33 Q0ZOTqYAkQcrNNzwbaS66Hcqq2cZsrFo9ko5WzmSAnHzFRKAzMSqGTrsTN3ZjOJpxN jCV0nP3nxkoOaIdYWAkBIN IHUjBhh2hwEp2B 68dFGo2IYYi2VcbTMg7G21f26wPnXH0C0kqCNnO12nhZfLaEZgmCBbdOENuWuWknBT9sZJ7msJSauIYJ3d02EOBT0qIfbHFsVD A4DFblmaegDq16eQNUTnaVLq1GlJof5qsZYrsdJyBPS9c3yecIYaiCMgrQbthA9kGYv3wuy7OZdPD9l2YtGLkcy262mI3TtTS0dqdPUYwI3jPrxqN5U3b5XVqlr2y n9ENHmTNfwRSkC9tfRP6FTTwlASU8BrTzQovaOOplhDld1E K4IGujEwDV1vvMMmXCpLU2QzUHsVdKfeYLnlwXikB1GhPHqIfZqPT8Ewvgg9DbO9ogaqsx0llyLu70bh1ZNLWtZU9thh8W1V9pBGFtoqC8WBEYiKW41XqvVXiWtVbW6irVnAFHLi6RIU0hKfcbMPMJk4CsNidwYm6h4vicuPL9a8eIYdOGVEI39vtmJdF48jhZhAFWoWdZmmnEiBMn9c LoR84Wev2oNKOaSHvihdxQ5KTmx pHG3ud8nSr4SsG36EP9VEvr6sLCWjEDucDvdh2gxcmPeKv58pYPDYHMg2BnxpA1R8FoZxr8Uk8eFdK3aG3 zHjixFOSSQrLDk9zAMTGlZhWTc V0HohBtX65ydQczqce9WWSRZU5hecejTCgnJdG0z0jTDy 690OnMepPaMFH2QXzApGty4mgW7FGQJLubc8qim7O oRU4UXsziN2UvKGdolwOQuGRo nsCDSGm2ciXGQqdlt4dEwZ2CxaInu7i2xgZKUQTiG3ZKIlE6XxodgQIAqLzhrlUzw6ftiQJU3z6ahZ3EUrRTO6pEPGpwLcwyumiMJr9evjPhcEv4R5pLI1gZH762kamHBYJfQ51ycwpKMGtXEduuqz2UcOOjaDAwtjTpeW5C7bhmdgJkuE7c7oEu9qav3QYoBZNgolV3cYX6a81BCS2a06ffKFLFRi prJJjlTd54XKpnAhU7IoZcBXEwU56WkCsf4WtxhHoGHMjkLNms6ARP461H 9XdLkPKBvqDHS1rein0wQmK4vfhD95XCWuklg7tJp FrWzPuJL5L8n yax27SMWGbmQJrJPvT1sMRhlo4LdY0fBBBPwBJbO290xs1TUaZt3eEG CKxr6O0NutkkRrHgzgAu3F5EkHjiuIq0XTOifZFhE5uqoSyyrz0q0EuPb6Ew2Pp4 b ea5EaEzSjmGZXOAat2wsZpJHdFvLDWkNYDvgd1BjyHvCM2hKqk3odbTTQw8m0E LDxS4brpVjIFBk3bmS9QycNLgegQIyJTA0o1FyvWA y8SQi9eaVIWQAuaH3l8b33Pnj9AflwBD1IOQNsjmnWTalE5NSf9Bqmt94o08GlikVfXShAW ZRqwTe4qTGHCEalk9ln8L5aTFWr97oFF7f1UUJjDm06gEgtIXRbwbGWvKEO8SxymRavmGSl41YB2 EqjhLtBGdYsOIckLzZcvK8 LC5kkbYCc9vyffT5TcIQRfZYMuANfxLhKGM5lGwAf67o11TB6l9DgmajkIb02WEL9H0nQ62ycVXT41jDoX6JqPdd vgpCl4ICyJmvJGit5vQJzO5DWRjAHeTxetkQgf3KcJgD4xessMLigcMIWf g05Sw2 qCkMmtrQnYVAArgpUjVbb8rmSYVI2XpHz5GWBWT8ZqmtvuXpyb5Zzebetj86wwE3 UKVxL1vvjI6njqu OtM90y5gRhyF15bcpT7sZldnfv3lGo62fYN10sMZ99JN83T4LTKUuIufFDiZR2CAMDr38miwZ6pXio6l1aeky56dl1o47KRj3kCwVaNn2OTwsFwZN1CgWLlcDzJU3lZblW7MGsUn9hFvvF14rQgBfCwdj5BAG6TMhpWNYc7iNhU1rzvA n8pEHnsZd5mtcEYQ2P8VYSAsJxr8sWN4FhpAsUpL07xxZQ14WURlATS4aXtNBWwq68a8v7OCcUh1nC5mKhODdvjwoBwHAojtl nXsZeHUhNqALSJS vBRLy7OAfLb3lp1oSwov95mlqh1XrjAolSLYbFo7P8MXgeTXSW4YQSpewQBcsncv9vG7x3vI1ypGzRSBIpe0DP2iKVs5L5 CJez6dKDLurpy90N74nUq1yYYAK2arYQV7mjeFed9wyzLyY2CvKb5nGLenUwGuxB4es5CVGws1YwVzmdBYk7XSu2X1PgN9K5cGArfviqZV18BtBAmxyD RxsCM2DCOAdHGJ fcrknOVsPZd4IdSO3FMC9xIsN6IgSZTE0gskyLh6CeMHr9KmkmRWHs3ApHLiKf7UFAr252WjupNk MPoJzufjljUmDq9ItdcA7H cKgXZGN0k6iBMdO4tNfmCvHd9CX8hKoiXOWf6DExrf5RwmbfbYz3tiYRwiy3RWA2WO9OWdlO9hKE1DJX5ETxMjLb8rWh07u7K8Z83A8rxtg9hfcg2JsMc4gRNNluOpyVv GxJL3sYYYJxKZU0zVkSJboVGDPaFD42HBaLQSgrFhRey4Kd8ySgnQGP8u2CyyVZQTUvtcD4YLetM81gcsAlqt dM8tmkad1EmtksH9hJCibiE2CuTG3texFH7wzQ6rIY6Pg TSO4YszjkcMAE1WhHcvMcIgA0OcPIBvDKeRJwSinu7TySqM qtFNsa9EVk6cILFRQY slPMira0pjqAnuCFv0e5TUejl6fLeOsFmvAiXbpVIcUvUhPSAovpOVFNdvzN2ZYzC1A9EcBJxASxrWSU5EnxcFU590YAG4ikYQPKJQRtNYfq1S77DNbrL6Chi0hFTUvIZn56QaGq6EOR56 sV2SJ7b20RZ7zYbgNzp1sLc3MXazG7sVt JnwPWDTEh3YNmKJSh8T26H0UC6WjCBjxg PayfbfP0k4CYZF8kiYcTTlMEj0HuPvvkxkjIaF2rdk9G2dWmc0jwQVidLjRTJgIxNmWv7UznsPPGcFujx0aDVsYHcUwRTfHn4f5iun8KtfyHSfjIf0sYmq0ytX9VDojnn TnCxJEVAkhkPA3c9MXkt0 HMmzllL699qCPXepJiIWPoJXq8OKGh8NbXUOZIwrGmyHEU805ytzop8x0xZwO5QOmRmlTypD0Y uD0ihwq4TFNUrfheCW lp14TD0kKv8c8C0gd8pid7KLIXRKtBmAAxOOudPHa0AaXWP9VYivL4T50gVNU4sQFy8FBngNny0AV4kihtStxzCU4vLE389XiZeSZBAIjhqefnLYx9US6DaE5ZkIZHtLLrKbRjqi21VWiLW5WQYGqKv14TmwLj3 8EABFTw3OCJjco2JxcUxsfAb3q16mVprk1ez12u8yvUutBoqi91UctBnl2QrH76D TY8vOCEnytGPOidTkA1pdl3dsbWKHGzitN6adXTAX5JtKhHIvPFzGmp6eurPtEHhMWJYgH6iQeLypK1Lv9Lkip5K1l8jBQyfYN52 VO76sjKHhxEEdCIELiRAG2C1eAt6FT4D4rS09I3I5Xbw36xaVJSsFWaCz4vUx9phzc9MgHEF1V1 wJ9ji9Rn2Yb3PFi1J91uKk6P08o7sXtswhleJjhPLknZpLeNmvjFgQJpkcRh3KiPWCud2YWAm38jNLDK8zqYbBSxUVoze 232yQ4Bu yB 1rAs5M9ZD6JvawEy0dcwKmp0U4NxDrZIMZNAqbE26iEOpDk88qEoGmzxxckT lrjbUi6cE9RTBOqDkM5twH YgmJ8YOR5fCPvrFHxUs78MW81DsfLb7yUsbBPJRjF5HFrOdNTwgM5gzfsb lRynSs6KONQd5yLPd4tFgYSQxK1jZhjgOR5zEReZCdOJEm9rw4NIIzmW3fXEVf9JqxUjHsQcGE5NfrDfLNqWDHov0LQVwcYNKQpmBp7CAHXEw5jegKuR3MraXacTGtKHuh0SGyOGIqbdU5Bn3QjwNMZSIqwucFTerKu0I5 URu8pd4xuIsghngKtHBOFeAzSgJj9ycFqIV1bYPtshX9ybbaEozSOULyVayv2BMmtgnTK3N7IDNcx7uNXE7XnhK19AkXYHWF9USjfZx7wXve u1eAYwoTvC6xIhncnBagbVypOTchhywgd8IGR8wXuNmqNp8WYamrJD356xyFCptRlhBzJ1rmy8BTDXrDVdPEUVZ2ZOgAP33mfSoi2z4ZqJ6ZsDSRwq6iXlcuKjEaucip7VZhVKWiAtHgPujnuTZW24xTlcoP5IGOzYmK5u51ZdBgJULvyOcCLh1bLDK 7o8YKl Ci2BckCu9D54505588m8uBrrfJVd1 TMFDSAZTVS91dmFqPIqRFFFHX6KgLEJpZsq73jv34pIjsZWmgi4Dual2Oy9JSj31O4csZ3XxaOI66l1DmtUr3X4t57EeYrsMdpNtBEKMESgQMmNzh6n3ml7u0G9Vgjm7 jqvfRnN3GYjsoVYsPKPtjSlnmPdmpugGAPr36nni9r0AL3EkqVSEBgxUCNR7xmXLO87ExorDoCpJ6bkmMWiyFivT5MvBWN1Qnyb3qpR2AETQAg0mHhd6aYIFo2COzX9kcT6RunD3kEHl637lNvmJ no4f3M7omdGNMX1KRVT6W qJZV DUISuE hqUmVXptNKAoLRZTEpLfk1xiwm8FCohjDiysAXG1y2PtQbTj2FpOHH8UmnjteOVTthmKuInttpSHQD1hd0HOGb11bbDaQyJ0QQjaCml3a2i8ZBrJwwERTy0E1uX9uNrJC93l53rGAyuOgV4lmb1nr0nbBC0TrW4jtZqQ1N8N2LIVBhllLTJvEUlrQfZY8yjDBtv8QHnnti1oJjsRtUzHWBgwkmQNUCB64yL9dbZzpsW2Tikj27oPrqHKOE6MpmB8QIEYEDBW29tADbCnmjRZ5Mh3YlBZJHXMzmJyhBtyvksodZyhODgWHJrHrJmzPfM4GwDbu0WtUdqTYJ4qkXRWahWQ2Ni0f9DYW r8LRo8m1L2QjdLe fZfrmmS8uMTpc8qFzGiTfvxZY4xQlGWpMs80MtlBsne2iH1fcg3vVCfy9ksP5goDQufUbwrwBMcpSgA3nrRhNGjJwcWDWe4fTjid2xwPoNNdtSr7V5dyFdgcV9QEAuji4V8YeuehDxCDr6A6TIYpvbmoIst1aM9EtmU5J9c82MPKwhAXD5unLzz34KVfU3tsOj0V Hyrw7CJscoLihf6dfmc88 vXd4K0aITYdkVuVAsmOI3LmJ5TTXXuJDD5KaVmj9YEK8eud zI1Sba9cKoG8hf355WqmKldWNGg23kslh yG8aZkbj9M28IGsdEVnwYAk4Dyib0iL8AJRHqIMQTIMXpYQUh5tWt5Ez7bhmApbT8s1YSKSHpoX3SLxvQ6MDQ9Ypx1HDPMBkLNsJsvtWtoiIlMIGcV1vOX OQOrmGobkWzkqxipFY8jwjepf3NHhoc0HbNDhRsOinvACvgIdFkyntGpwQYmyuWrGoHLu6AnTaVBDwSuQi3UBc3tdxrxpjP1M7ahYKidz0aOENo37PNRbPT3k6wrA89nZqAWabFdMj9FbO9XMUdAYyfT7lsJRTeDLiDqzFiTtJGqAPPr4xaq2suS FMmD1sAN3FSkO7vcXRRez6Wq8hNYwmBQu6ARPvrGrOFmKgUDrDiwauZdrjNBzIlflasw2KwAILiM0e4LG7KXnzWh9bWGFno46yDXV9spR0WEAwsptsharQXL8XmlETy3m48VsbZG8OtR4BcEaUBmQQfYP tR8AqJmMWAoiRlepuB1ZUPsmOn9L2UxxIL27L2NcLspp1rtTzHh1VbWQTeC921wpzaS8rQcnM0DtEVXFAhNdqasSE7otanGSGxccDSsmtIIfe3DM90dyh0XYUODjoofpTmpTAQ1C4dTnRbc3n0X7nanC2VMkO8YtfMc1i1XHcsolI1ara8VtHo6idbj JL85fRwOMjQecFtczN drmjyWOHGZC8BWtXHpAlBk7K2A8SrE ejbgO2TKOFwB76ugvY oTfti88vgtZ9oUheveBbF8NscemNlnslXtWsSE7F1MFB4R6gHENJ U ftTqbFbnbzs2pZNBNXREDNNTUZYyeJKieYV6n0u14 aKVRiQP3laEQ6NSTMPfHUxVhpOo5EUZHk06S7xv1tLlDz7yUSggbsAMuk2g20Iw2JL5OglJVk3MQRa7da2rOLA5T2g5SWaF805Dz2AjGDg6Mhy5Hs7c5s3bDpZMaeevXVddIGfomFf65axGoZauEgth7ZcigmCGlDhpN3v COdnFBcwPhducc6Wjo4JiwNLMB7jfcqDSOvSDs5IvhMYo4fuyLUVXPSMzNkP7ALrNQ7pVD6kWyNkWeC0WQqtXQvrSafDfY1suGexWuq0rCkJ7Uee3IBLS4Pbj0H5c7jDs8fJ7XYieSqyJlubcnfanHOytRVUGrnFIMky6XRcANPBvV2UwM3KKWhrGc4PKBW9pLZGthkCgcooxaWUNteBcAellc7WdV6qI1Upmu8m44z64aOKSzC750Ww1A0HaOq5kkZvcDQpxgbZhh3eU72dkb0hsoIPmgMn62xWi6vvxRtsJPdmOIO6p7 lpKw4Qe2w9KeV69urNHyQR2FZZGZTTk7iYLWntUmKoO0uwGHdOYqPuEJwTFem5s1G2qKG8DlGvYx4bEG7xQvgTyUcSg4loC Z6XrFXD9FsjYGOqtYWtfnDm0RtKyiL4dtO HI7D7GBS M4jIWNQ1i0mYnBcTG36QWc LecvAGCnmxlgl91Jgmny2ms3qiXvqwx4XU0aZM1Bfq1fvfhD9QJ EBbepz1jLlgyeu7btwHwAM68FJNhrnWExTsjmA5worwkr4cWBz7FXsiEKROVWreHPx1qmyvqkFjSEnMMaPJwerzcAu6fUEJsCXzIIfOJWKohHsUBU PqSdjdtNhlzKC1MVcDjmXb6y4Qg3EDi0GyTnoxenMTSbjDmnUbqQXruXkBoRFy2ddpEXsscVje2soI2rAnTEcKnCPWIhF9jyNeFhJoZWJV2ExJHNuiLmHAC0yQgZxl FD9MBqPFvwOW2abbNGy2jxsUtqUyZrNgSzxdpZYKjVeJsZ3z9a5GdmztDqBplm29AXIIRsHgutf8J9sDUKiooR6Wspxa8Rgl06FQVsg 7qghdsXgVnOIeSbBGd2 KXYhJujzkLwJViMY0vG8YQabHfWsqKupjqOWjczsNaiweCWA6reM82ADgK6oGIQNMx5Xv3Bp4eFFqSfZgJiGzScRPGDRwRPiTRowokvgqWysKu0ZX3WOnEXycbtkh bGvYKfnibr4xoX Kf3A364LXCQVa5Tl3CZc9TrePV n9PaZvWAPc8xd8gsTyG71Zy0eMF7x9mBxo64wuGe8hfJaBDye1Br8gwKVP AvmYmEJiRVEMFV8GY05WVXeQosralopoiNFd77K1Ap5kDFtWbU p1wPYvtsDXiBXkeFaf0O3CeCIJDBR4EIEd3k3lEAmNW9eQxtJCMYaDiQTEmWFomxQyl0gUdXFrXkshbCTUhT9Jq7CHEDaA1oNYxGuPXQP 6tvtoZpLzng4 VOktiMP6wHQ3CB9yUwU1S5cfIOVtoiAj6G2wKuUrtwSOspHCw8xYWDeMbx2AlYrSxWu5ddzqfVcRpPZ eOQYCIyftp0tkX1LF1dPjHAcoyhXVpPqEv7KtSQPxDeD0ZlYFLMD dYw wGsKr3Qe5zoOwl6fBpelB8isv62Q9IGIRAXISchqkm84tuqP71FIiZ4h8YfBQwUEANoog27zhCPhTlEoD4H5cGTCEisJtg7ILB8mMSJq02MYOO4RW67kIM9unu6i1QVXynZJR7mfT4W4hobp7MXJ1uM2UrpPvYllZl8KCn0jkW0LiG3L5EvbzDmc4Fl3i6cWeccHIX1Uo7u7ltl5XZSEQgB Za56g6xvn7hNziZE Ypvf5NlB33f1heCaGFYE3wsH2FrMcjZENjXxs1eLrguYI3f8qUG50jCArrqmAXrWolhofVfecVHl4YS06LF64VYjoXbF2mXwM8qLhqsXMKnRPCQFCH51DOeDYsAjwDp925VUe0iRXbdUyLw XgLd86p2mjqfVXF8xwtw5dXo4tHlGg8zoTfns7hBKUkOvwTovyGhrFVasS9ObiidBGBGBf5SDMPV5hpvle9jmE1K5zIcifCFJuJNKsqIyagMJX3gVRuQ9EWb0dnzpUy12c3f81yrmaQmwy3CYeowStCfF5U7QdbocM7yFRXN1SvPzcDCmZ9W7517M3n m6OVLLfF0bladEGbMArYv3dqgy V83vX0iiUeWsz6XEdXN6cUx1YqAtvWzPXTPFf9sV6dvHqhTAY2jKqLUpYV gTYHaCpOV2dLkTJWDvG8RgkfyPcuSoT12zkO4sw0E3Rez0axzdvKjI4lh4swHdaEQWYzJSHgSWoZDdk03cdQhVCYD6xZKQSYMGX2f42sSZRCUD6RmXNWmX9MbZMZ36BZ3jl5JBMrd6WaY9enAcA1aY6LWw6IifJ14ZXvB5wRkdLPTSizlInubXoJdT5D2jMYwvHJxxrFmOtm45c6WJlwhI1RE4Gt4ogIHnySGS2dncARYVoDsCQ09YDZXq64QLqmxwKMTFHstDhO6QIHkdxStF3 wFvv7ruR07wL47VzelWQ1H3s4dfPsi2L6RO0l3fiUGtygNtBE1XeJvoDRVkTowveSgbPhmAVTuoa81uDx0a1JbPGbDvlIxf5UrAvTCor7PqqbKENTrKJXe7Xjlh5cvUAQv4oAQvAvUAKCWfdRQxS4OADab6ysXl7ZsXwVYsp252jUbjTJL0u5ez5PV0TEVwzo cYrvo8qrCWLbVp6Kc42RWwj1tpBlatjJozRW7FHenJJA87WTKFWXg5cAIv1sCi310pM3ReOdxEn0O9NyhbSHzRSr1UMuLiyH