{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"collapsed_sections":[],"machine_shape":"hm","name":"H&M 17th place solution.ipynb","provenance":[]},"gpuClass":"standard","accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"**Solution Summary**\n\nMy Solution: [discussion](https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324595)\n\nI solved this task as a binary classification problem to predict whether or not each product was bought in the last week of `transactions_train.csv`. To create features, I used\nthe purchase data from the previous weeks.\n\n<img src=\"data:image/png;base64,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PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4zMzYwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjIxMDA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xNDQvMTwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0LzE8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgp/rDdGAABAAElEQVR4AezdCdxt9bw/8F8DDZpTNKeURknzoIG6hhRpJEqUKSFEkVDJlChDRZRuQkmZus0DUi4VTRo1y9A8Ker291l/+9jnOXuttffzPOecfc7z/r1e++79rOG31nqv6dx81nfN8vS/WtEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJiuArNO16VbOAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEClYBgrwOBAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwBAICPYOwU6wCgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQEex0DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIZAQLB3CHaCVSBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAg2OsYIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAEAoK9Q7ATrAIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABwV7HAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEhEBDsHYKdYBUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQICPY6BggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMgYBg7xDsBKtAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQLDXMUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgCAQEe4dgJ1gFAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAoK9jgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQyAg2DsEO8EqECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBDsdQwQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGAIBwd4h2AlWgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIBgr2OAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwBAICPYOwU6wCgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQEex0DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIZAQLB3CHaCVSBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwOwICBAgQGB6Ba6+9dnhWxpoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgggisssoqE2RLbSYBAgQIECAw7AIq9g77HrJ+BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECE0JAsHdC7GYbSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMOwCgr3DvoesHwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwIQQEOydELvZRhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAy7gGDvsO8h60eAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAhBAR7J8RutpEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLDLiDYO+x7yPoRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMCAHB3gmxm20kAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAsAsI9g77HrJ+BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECE0JAsHdC7GYbSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMOwCgr3DvoesHwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwIQQEOydELvZRhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAy7gGDvsO8h60eAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAhBAR7J8RutpEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLDLiDYO+x7yPoRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMCAHB3gmxm20kAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAsAsI9g77HrJ+BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECE0JAsHdC7GYbSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMOwCgr3DvoesHwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwIQQEOydELvZRhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAy7gGDvsO8h60eAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAhBAR7J8RutpEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLDLiDYO+x7yPoRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMCAHB3gmxm20kAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAsAvMPuwraP0IECBAgAABAgQIECBAgAABAgQITC+Bxx57rNx9992Ni19sscXK3HPP3TiNkQQITFuBJ598stx2222NC1144YXLAgss0DiNkQQIECBAgAABAgQIECBAgAABAgQIEJjWAoK901rc8ggQIECAAAECBAgQIECAAAECBGYYgeOOO6587Wtfa1zfo48+urzkJS9pnMZIAgSmrcCFF15Y3vve9zYudJ999il77LFH4zRGEiBAgAABAgQIECBAgAABAgQIECBAYFoLzDqtF2h5BAgQIECAAAECBAgQIECAAAECBGYUgVTs1QgQmPEEnLsz3j6zxgQIECBAgAABAgQIECBAgAABAgQI/H8BwV5HAgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEhEJh9CNbBKhAgQIAAAQIECBAgQIAAgRlW4Iorrih33XVX7fovv/zyZeWVV64dbwQBAuMrcN5555W///3vtZ2uu+66ZdFFF60dbwSB6SlwySWXlHvvvbd2FVZbbbWy7LLL1o43ggABAgQIECBAgAABAgQIECBAgAABAgRmfAHB3hl/H9oCAgQIECBAgAABAgQIEJiOAgcddFC54YYbatdg4403Lsccc0zteCMIEBg/gYcffri85z3vaezwfe97X9lzzz0bpzGSwPQS2GeffUqO47q24447lo9//ON1ow0nQIAAAQIECBAgQIAAAQIECBAgQIAAgZlAYNaZYBtsAgECBAgQIECAAAECBAgQmG4C8803X+OyF1hggcbxRhIgMH4C88wzT5l11ub/3DX//POP3wL1RGCcBdruKY7fcQbXHQECBAgQIECAAAECBAgQIECAAAECBIZQoPl/6RjCFbZKBAgQIECAAAECBAgQIEBgmAQWXnjhxtVZaKGFGscbSYDA+AnMMsssZcEFF2zssO2cbZzZSAJTWaDtntE2fiqvnu4JECBAgAABAgQIECBAgAABAgQIECBAYBoIzD4NlmERBAgQIECAAAECBAgQIEBgphVoq8jbFjKcaWFsGIHpJJBz8t57761dets5O3LGtddeuzz99NMjB0/29xJLLDHZ3/4gMFqBtntG2/jRLndmnG/55Zcvu+22W+Omrb766o3jjSRAgAABAgQIECBAgAABAgQIECBAgMD0EBDsnR7qlkmAAAECBAgQIECAAAECM43AXHPN1bgtc845Z+N4IwkQGF+BtnOybfzItdl8881LPhqBaSHQdny6p/S/F1ZdddWSj0aAAAECBAgQIECAAAECBAgQIECAAIEZTWDWGW2FrS8BAgQIECBAgAABAgQIEBgmgWc+85mNqzPHHHM0jjeSAIHxFWg7J9vGj+/a6I3AYAJtx6d7ymCepiZAgAABAgQIECBAgAABAgQIECBAgMCMKCDYOyPuNetMgAABAgQIECBAgAABAkMj0BayagtpDc2GWBECM4lA2znZNn4mYbAZM6hA2/HpnjKD7lirTYAAAQIECBAgQIAAAQIECBAgQIAAgQEEZh9gWpMSIECAAAECBAgQIECAAIEJKfD444+X2WefvfqMBMjwptY0/p///Gd5xjOe0TT7QOP+7//+r9x3333lb3/7W/nLX/5Sst7Petazyvzzz18WW2yxssgiiwzUX2fiu+66q1x//fXlxhtvLPfff3957LHHqk/WP6+NzzLyefazn11WWWWVstJKK5V55pmnM/s0+872Z/3uueeeyiELXmihhSZ9ZptttqmyLv/4xz/KFVdcUW677bbywAMPVJ+HHnqoJIAX+wUWWKBahzXWWKMsvfTSU2Ud0ukjjzxS7acbbrih/OlPfyqPPvpo9clxkOOss5/mnXfe8vznP7/aV0ssscRUW5+nn366XHfddeU3v/lNdTxm3+T4zH7KsbLoootW38stt1xZd911e55fdSv31FNPlVlnnbXMMsssU0zSdM5l4qbjYLzPySlWrmFAjp/LL7980vEbqxxbz33uc8uSSy5ZllpqqeqTfTa9w505tnKe5ZPrQY7znGsLL7xwdU1o2Mwxjbr11lvLlVdeWR1HnXMtx8J8881XnWc515Zddtnyohe9aFyvrWNa6R4zx2zOOeesjuGRo9uO36Z7xngfv7G99957y1//+tfqk/5zbc/+zjEZ70Fbzv877rijujbcdNNNJdfKHE8xybi555570rXqOc95TnWdesELXlB5Dbqs6Tl9tiXHaPzyyfUwXrn2LbjgggNd76b1dmS9L7300kn3/Fy7s59y78i/I/LJvll//fWr76mxfvG75pprSu5nWZ+sw4MPPlhdvzv31XyvvPLK1b85et0LpsZ66ZMAAQIECBAgQIAAAQIECBAgQIDAtBKY5V//UfHpabUwyyFAgACBZoFrr722eQJjCRAgQIAAAQIEpovApz71qfK9732vCiIm0JIwaydUmNDr7bffXrteCVBmnvy/3/kkGJUAZoK3+T7uuOPKWmutNWn+9HXQQQdN+nvkj/S33377TRqcPn/729+W008/vZx99tlVOGrSyBE/Esh65StfWT7xiU+MGDPln1mP9PmTn/ykColOOUXzkNVXX73ssssu5eUvf3nfIcSEhz//+c/XdpxA21FHHTXZ+ATCzj///PLTn/60CiI9+eSTk43v/JFQ68Ybb1w222yz8opXvKLvderMP/I7gbcf//jH5YwzziiXXXZZeeKJJ0ZO0vPvBHuzHi996UvLBhts0HOaQQYmtJv9/qMf/aj8+te/ro6xQeZPGHPbbbctO++8c1l88cUHmbV22oT1vvnNb5af//znVSCrdsKuEQlobbnlluVVr3pVWW+99brG9P753ve+t1x00UVVYD3bkCqnCXbl84c//KFxuS9+8Yur6XPuJDyW8GyCYwkvpp/s0wRFOy3H10knndT5c4rvLPNzn/tcFdab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D4y6464ZjzzyyFbbzuQ5v3K+5Xpy1113lVtvvbWv61Hu1V/+8perCvCdvkZ+H3vssX3dBzbYYIOy5pprVveAXAtzL7vkkktKHixpajnmUyH9u9/97hST7bjjjuWYY46pPS8yQ64nqWo8SMs8dedap58ddtih89M3AQIECBAgQIAAAQIECBAgQIAAgVoBwd5aGiMIECBAgAABAgQIECBAgMD/F+i8qjsBl4RbExTK79lmm62kkmtTS6gyr11OS+AsgY9HHnmkCi/VBdASEJ0abeONN56i24RQLrvssimGdw9IgHfvvfeuXh09MnScQFbaK1/5ypKKoXvssUdjlbu8ojqvLq9rI/uvm27k8BVWWKG8/OUvrwJI2V+pephKfT/60Y9aQ8t5jfo73/nO2qBfwrltgdrNN9+8fPzjHy+dY6V7/bK9ed15qks2BX6yrqnc26sCbObrJ1y83XbblT333LMstdRS3atQ/V5ppZXKpptuWu2jz372s+X73//+FNN0Bvztb3+rju3VV1+9M2iK7wSmMl1by3H37ne/u4zs68477yxnnHFG9fr5phBgKiBm27POI1vCrzk+c9zknEz10LZzMsH0TJuWczChv1SOrKsS23ZMtp2vN998czn00ENHrnrPv7faaquy2WablVVWWaUKQWd7ErpPZc1UkEzoL25NLctLMDvVneta2zbVzZcQc8L9Wb84Jpx91VVXlfPOO6/VPWHyhDCbQm05F5tarqUJ5q6//vo9J0vwMOdQ1qmu5Xg6/fTTBw7s1fU3muGd60TuJbmndI7fBFHbjt+ll1665LhPy/GbIO3DDz9c3VPq1qXtGK2br214r2BvQuxtD5/k+pTr4n/9139V99Hu5Tzvec+r/txmm22q/ZjrWbavrl100UW1wd7ME9umYG+TzWjPk9wXX/WqV1X3ozyQkDBs7kcJK7c90JD7QO63bdWC6zzahqd69je+8Y22yarq/h/60IfKK17xisnujTl/8oBIrv833nhjYz/HH398yT2p1/0oM/7gBz9onD/3rM9//vNlueWWm2K6vfbaq3oIIFYJg9e1uOd6MPL+E9/so3jXtZ/97GcDXycyT1Nbd911q2t70zTGESBAgAABAgQIECBAgAABAgQIEIjA1PlfCtkSIECAAAECBAgQIECAAIGZSCDBooRTEiAc+drxVJxrClwmvLT11ltPoZEqp6mS2CvEOcXELQMSUkyoNSGYVNZLqChhrwRSE2q59NJLq98rr7zyFD0lKNjUEqRLSDDB2baWaqxHHHFEecMb3lAbYE2l1gQVO8G0kX0m2DZIy2vmE+zJa7W7A1oJ8SQYlldev+Md72gM/nRenZ2QWa+WoGRTe/GLX1yFDetCYDlmsn8SXm2qDJx9duGFF/Y8Xs4666yqSmHTerzrXe8qCTu1tYQJP/KRj5Rs129/+9vayVM5dWQYqjNxKsNmndra2972tmr/9NqvqdaZ8anEmDBmUzjrpz/9abUfO6G/VDdOxdVe50/29y9+8YvaVUuVxgTuR7aE/3JOLrroopON6rXu3RO0jf/6179eez50+sn5kGB4KsmObBkXo3xyLTnggAOqKtAjp+v+O6Ht2NZVpW1b5+6+Or+32GKLst9++01h95KXvKS89a1vLQkBpuJuU0vAvSnY23Su5TzK9Tah4rqWSuJHHXVU2WmnnarqonXT5dgdtBJnXV+jGb7//vtXwdZeVZUPPvjgqqp2Xb+HHHJIWWuttaYYnetHjt/cp8bactyk6nfuJ/kkmPn3v/+9Ms11IdVSc70duawEjVMBvallH+W+kwrebS3XnwT6c22ra7nHNbW2Y33kPb27r6Zx3dN1fqfC79vf/vay2267VYHizvDVVlutOrdTJTbjc2+ua9mPCSvn3jU12tFHH93aba6zqbbbud52z5B77nrrrVdVwU1l4Vyb61oeSMn1NsfsyJaHQppCzglE53xfcMEFR8466e811lijZHua/s2RiXO+97qX7bzzzo3B3hxbd9xxR20wedKK/PtH3mDQVmU61yaNAAECBAgQIECAAAECBAgQIECAQD8Cg/2vZf30aBoCBAgQIECAAAECBAgQIDCTCSTck+pug4Z8mhgSikpwJSGZkW2Q5SRMm9dMJ/y0++67lw033LAsvvjiZdl/hXtT1TLhvgRzUxl1ZL8JFzUFO7NeCaD1E+rtbENCdy984Qs7f07xneBX02vfR67jFB10DYhfqu296U1vmizU2zVJFQI84YQTSlu4K0HVutY0LvOk6l9dqLe7z0yX/VLXcozl1fK9WlN4KtMn6NdPqLfTd46/utfXd6bJ687rWsKqeSV6Xct+TOA9wfY2+3XWWacKMvY6F7r7736deoK5vUK93dMP+juB54QOuwPi6aNt/ZvGp4p1zr2mlvBcKtX2CvWOnC/bnPB8QrRNLVXBUzm1rg1ynqWPhI6z3F6B6IyPXfb3BhtskD9rW9O5lODo3XffXTvviiuu2Bjq7cyYIGCCfnUt4cs8XDA9W64XvUK9Y1mn9Jlrf6oqj2yD7O+EUE899dQqjJlrayqMZr+nampC3Km+/Z3vfKcK545czu9+97vWitKf+cxn+gr1dvpOlfG64y7T5H7SVPG7bdubzt+mcZ3163zn+h23PAhUdz94/vOfX0488cTa8Z2+ms6TzjSj+U6F3VTXbmr5d0MeDOgV6u2eL+dR/t2RsHJTSwXbXtXQ27Zxk002aQz1dpaZf3O89KUv7fw5xfd8883Xc/mZMP9WyQNRTa3t+t09bwLETcdijpGXvexl3bP4TYAAAQIECBAgQIAAAQIECBAgQKBWQMXeWhojCBAgQIAAAQIECBAgQIDA9BFoCyJ11iqvyD7ooIN6hoM70zR9Jxh7/vnnl1TRvf766yd957XhqSicV8QnjDpoS2Xgyy67rHa2VMgda0vAsa7y6si+E6ZN4PmXv/zlyFGT/v7Tn/406ffIH02vgc+0beO7+3vLW95Sfv7zn1cB0oRIU7U23/kkKFXXDj/88HLTTTdNtp8S0upUPEyFyEFbrwrO3X0kHNqrZZltYaccm3UVkHv1mUDi+973vvKpT32q1+hq2DnnnFNVGq6dYAhHJACZMHtT++QnP1lyjA7Ssr8vvvji6lM3XwLtqUpbFzKsm2/k8FRLbQvvZZ6EIFMBM9Vc61oeJohHr8Bk3fHW6atzrHf+bvreaqutqkrlqQrbOc8651rCdROt9XtP2WWXXaqq4qkCP5qWqtIJN468p9x+++3VgwAJDafC+aAt4cum0HeOnVSXn14t1+5UEc+DNm0tIeXNN9+8seJ50/2orf+m8QnsNrWclwnxtz1k0d3HBz/4werfEXUP7KQCcSqoj3xzwXie77k+ZTm5j+TTOdfz3fYASObNv6PqWoLJqbLcT8u0TW3bbbctoz23mvo1jgABAgQIECBAgAABAgQIECBAYOYUEOydOferrSJAgAABAgQIECBAgACBmVxg+eWXL5/+9KfHHNpL8C2fVGLstARkUk0vFVlnm222zuC+vxMIbmpjrZaZiqp5TXiqH/bbUtGvKdibaqF1LQHoppZXz2+88cZ9VRPdbrvtSj6DtrnnnruqLjiyGnLCbqkKm4q9g7bR7qf//d//baxKmBDhO9/5zkFXp3r1fPZrJ8CZflKlNduWz2gCgQOvxDjP0PZa9hw3o9l3Wc1UTk24t67lVfcJQyfkOtr22te+dqBK0KmymXBgU5g551qv4GACtwm9/fOf/+y5ujnWv/rVr/a1Possskg5+uije/ZjYG+BVGr9yEc+0ntkn0NzziZMmU93FdXHH3+8ejCh137vp+vsz6aWe8r0CvZmm/PgRULL/bbYJABd15ruR3Xz9DO87Xq0zTbblKWXXrqfriZNk32acGyCzZ2WatQJeXeu3amqO7Ll3x1NLZWFzz333LLFFls0TVaNy7Gbz2haKqUfdthhtVW8b7755nLddde1VvZNGPvyyy+vXYUcJzvssEPteCMIECBAgAABAgQIECBAgAABAgQIjBQQ7B0p4m8CBAgQIECAAAECBAgQIDDkAgmIHHLIIWMO9dZtZip8tr2eum7efoYnMDyWttNOO5V11llnoC7aQqxNQaq2oNN9991XUkE11Upf97rXtb7CfKAVb5k41R+bXlPfMvuoRl966aWN86Vab4Lng7Y555yzvP/97y933XVXFeJNMKyt2uKgy5iW0//lL38pt9xyS+MiU6V4tC0h70033bRcdNFFtV2kqvNo24ILLlj233//gWbPtSMBy/vvv792vrpgbwLBqa6biuF1LeHBK6+8sjrX8jBCQv7a2AVy7qVy9NRq6X+Q4Oug6zHWe8qgy+uePmHYBNoHaWO5Hw2ynO5pUy07D4HUtTzE029l2pF9JLCaBwkS4E2Yd7nlliv5d0pTS/i7qSXgn+tjqtxuv/32ZY011miafNTjEkzOmwl+8IMf1PaRSrxt/yZqq2Kftwa0bXPtChhBgAABAgQIECBAgAABAgQIECAwIQX81+8JudttNAECBAgQIECAAAECBAjMyAIve9nLquqt03obUhXxzjvvrAI8CfHk1dsJ8CWol4qM+eR3UzBvrOucEM5oqsGmgmBTa6owmoBpqvYmGFXXYvOtb32r+qywwgplgw02mFRldqGFFqqbbaoMT8gt4dgES7OPOvsq69jZV/l+9NFHR7X8VOxtagk3j7bNTBUN25zWXnvtsvLKK4+Wqprv9a9/fWOwN+fraFvOs3nmmWfg2XOuNQV7m0KYCdh1V/7stfBU3s4nAeJU6Vx33XWrIHjOu7YwYa/+DCtVJdHpETp8+OGHq3tK93XqgQcemHSd6txTrr/++qHcTQmy77333gOv21juRwMv7N8z9HM9anuIpW7Ziy66aPnEJz5RN7rn8BikYnlTJf1cK374wx9Wn8UXX7wkHJvrZqq35yGA8WqpONwU7E1oNw+dNF1fEv5tankgSSNAgAABAgQIECBAgAABAgQIECAwiIBg7yBapiVAgAABAgQIECBAgAABAkMg0P2K86m5On/961+rV2H//ve/L9dee21VfbQplDc116XT9x577FFSSXTQNpqAYmcZqWT4xje+sXpdd2dY03eqpOZzwgknVJMts8wyVRApYaRUGl5qqaWaZh943D/+8Y9yySWXlLxmPfsprw1PiHdqtbxyvKmNNhzW1OeMOO7uu+9uXO1UtRxry7HV1EYb7M0+TNhtNG0s51qWmYB8Ap1t7cEHHyxnnXVW9cm0qe78ohe9aNK5lgqfz3jGM9q6Mf5fAtPqnnL77beX8847r1x11VXVteqOO+6Yof133XXXUVVMnx6VyIfxuh2/pmBv98GR9U/4thPATZg499Q8eJOwb1tF3e6+Rv5eddVVq2rDuX/2anmo5/LLL68e1uk1/qabbio33HBDr1HVsKzrZpttVjveCAIECBAgQIAAAQIECBAgQIAAAQK9BAR7e6kYRoAAAQIECBAgQIAAAQIEhlggr7ueWi3B3Z/+9Kfl5JNPLldccUWZ3kHe7u2cffbZS4JAo2lNlfb66W+33XYrl156ad8hpO4+8/rzfE477bRq8LLLLluFfLbeeusxhZFuvvnmKgSZoFwqX06L1qmgWbeshKBT3Vgr5b777mtkGI+A92KLLVZVkaw7T0cb7M15NtpQ7FjOtUUWWaQceuihVXXMRrweI3MO/OIXv6g+GZ2A8UYbbVS22GKL6pPqqlpvgal5T/nnP/9Z3U9y/fvDH/7QewVm0KFvectbRrXmYzlHRrXAf83Udj0azwq4/a5jzs83v/nN5fjjj+93lknT5cGjM888s/pkYMKzm2yySXnlK19ZVfKeNGGfP/JQQVPV4fy7aK211urZW8Y1te23377k3qgRIECAAAECBAgQIECAAAECBAgQGERg1kEmNi0BAgQIECBAgAABAgQIECAw/QXGIxDYayt+97vfVVU699tvv6o6XV1YsNe802LYrLPOWuacc85psagplpFlf/7znx9VYGhkZ7feemsVZNpuu+3Km970phL3QVoCjAcffHDZdttty+mnnz7NQr1Zx7ZwWEK9CWBrpdx///2NDONxHid82xSkzjo8+uijjevRa+SznvWsXoOnybCXv/zl5aMf/eiog8WdlXzkkUeqar777rtvFez95je/WZ588snOaN//FlhggQWqEPTUALnooovKNttsU4W1Z7ZQb7zmnnvuqcE2VfqcFtej0az4+9///pLg61hbgr6p5vvWt7615KGZVPMepL3qVa9q3J/pLyH1Xu2MM87oNbgaln875F6vESBAgAABAgQIECBAgAABAgQIEBhUQLB3UDHTEyBAgAABAgQIECBAgACB6SyQoMh4t7PPPruqnFf3KurxXt6M2N98881Xjj322PKBD3ygzDXXXOOyCXm99y677FIOO+ywvqoj33PPPSXVg7/3ve+Vp556alzWYZBOHnroocbJU3FV+/8CbVZNgdxBDNv6yTEzo7U3vOEN5aSTTiorrLDCuKz6vffeWw4//PCyww47lD/96U/j0ufM0snUqiR64oknlne9613l9ttvn1moZujtaLseTa9rd46/T37yk9X5ufDCC4+L8R//+Meq6vd73/vekirz/bQ8zPDqV7+6dtIHH3yw/OpXv5pifB7Mueuuu6YY3hmw6aabNj580ZnONwECBAgQIECAAAECBAgQIECAAIGRAuP/vwSOXIK/CRAgQIAAAQIECBAgQIAAgaEWOO+886qwal01uraVT4XWvAb7ec97Xskr3VNFdGZteYV6Xr9+7rnnVsGh5ZZbblw29bjjjquqlDZ1lsqrqfB7/fXXN03WOG7++ecvqRS74oorlhe84AWN0/Ya2Vah8oEHHug124QcNu+88zZudyrKjkd77LHHGrsZrxB640KmwshcS0477bRy1FFHlc0222xcris33HBDeeMb3yhsOhX2V3eXCfV++tOf7h400O9OJepcX1ddddWB5jVxb4Fhv3anUvc555xTDjrooLLGGmv03ogBh+Y+vccee5S///3vfc254447Nk73s5/9bIrxvYZ1T7TTTjt1/+k3AQIECBAgQIAAAQIECBAgQIAAgb4FvBuxbyoTEiBAgAABAgQIECBAgACBmU8gocBDDjmk/N///V9fG7faaquVNddcs6y88spVNc3nPOc5ZaGFFioJvHbaN77xjfKlL32p8+dM+Z3X1+eV3/ncdNNN5Re/+EW59NJLyxVXXFESwB1N+9GPflTWX3/96tX1veZPwLHf6pepfLjBBhtUQeuVVlqpLLHEElX4+pnPfOakrhPC3WijjSb93c+PxRZbrKRidN3xksqFGTc1qkr3s37DNM2SSy7ZuDrZl9lHY2133HFHYxc5VmfUluvKJptsUn06FTMvvvji8pvf/Kbceeedo9qsv/zlL+WAAw4o3/72tye7bo2qMzNNIRDffq//uU7kfpIgZ4LcCfLmnjLymE1F15NPPnmKZRnQv0Db9ajtOtL/kkY/5RxzzFG222676pPK2rmvXnLJJeWyyy4r991336g6zj35K1/5Stl3331b58+/a1ZfffVy1VVX9Zz2/PPPL/k3Uycknar5Z555Zs9pM3DxxRcf+B5b25kRBAgQIECAAAECBAgQIECAAAECE05AsHfC7XIbTIAAAQIECBAgQIAAAQIE/iPw9a9/vfz1r3/9z4Aev1Lxc/fddy/bbrttFVTpMcmEHvT85z+/5BOjhFpvvPHGKuCbQFFe0z1IAPELX/hC9TrwkcHYW2+9taQKZlvbeOONq7Dx2muvPVXCtamkmeDd3Xff3XNVUvU5wb4EgCd6awvS9RvSbnK85557qqBZ3TTzzDNP6Q5z1003IwxPtelXvvKV1Sfrm23vnGP5vvbaa0u/VccTFLzgggvKS1/60hlh02eodTzssMNaK6RmX7797W+vrnV5CEGb+gJt16NhCPZ2KyQUm2q3nYq3t912W3U/zT0153seqHn66ae7Z6n9fcIJJ5Rdd921unfVTvTvEanaWxfsTeXfXDe22mqrauqEjpsCxzvssMNUuQ+3bYPxBAgQIECAAAECBAgQIECAAAECM4eAYO/MsR9tBQECBAgQIECAAAECBAgQGFggIZXjjz++cb4VVlihHHPMMX0FYjodtQWFO9PNjN8J5L7gBS+oPjvvvHO1ifH49a9/XX7yk5+UVBttagkrXn755SXB3O527LHHNoYWZ5tttvKZz3ymvOpVr+qerfH3aPfTUkstVRvszQITZBbsLaUtSDcewd6E3Zras5/97KbRM/S4bNuWW25ZfbIhTzzxRBX8u/DCC8upp57aWjn7rLPOEuwd5yMgx+MZZ5zR2Ot6661XVfSdb775GqfrHpmHBbSxCbRdjwZ5AGVsazK6uZdZZpmSz2te85qqg4ceeqj89re/LTmPc8zVVZHPxBl37rnnll122aV14Xl44LOf/Wx55JFHek77s5/9bFKwN7/r2uyzz149DFU33nACBAgQIECAAAECBAgQIECAAAECbQKztk1gPAECBAgQIECAAAECBAgQIDBzCqSybFOFywSvvvWtbw0U6o3UddddN3OCjXKrFl100bL11luXVEc+6KCDWntJsHdkSzXSprb//vsPFOpNX6PdT20BsQSoRtv+9re/lYsuuqj8+c9/Hm0XQzNfm9NvfvOb8uCDD45pfWPV1NZcc82m0TPVuDnmmKMkNPrhD3+4/PjHP24Nl6dqrza+An/4wx8aO1x66aXLV7/61TJIqDcdjvZa1bgyE2xk2/Uo952m6rNtXL/61a/K1VdfXf7xj3+0TTou43MMpeJ2Qrh5QCnnf1PrdV/tNX3eULDNNtv0GlUNy8M5DzzwQHn88cersHDdhFm3RRZZpG604QQIECBAgAABAgQIECBAgAABAgRaBVTsbSUyAQECBAgQIECAAAECBAgQmDkFrr/++sYNyyupF1poocZpRo5MFeCZMYSVsNLdd99d/vSnP1Wfu+66q/o71f022WSTkQy1f2+33XblyiuvLD/4wQ9qp0nV3u6W8PUf//jH7kGT/U7l0u23336yYf38kVeaj6alYm9TO/nkk8tb3vKWgQPh6fOHP/xhOfLII6vuF1544bLqqqtO9klIekZpz33uc8sznvGM2vD8ww8/XFKJ+QMf+MCoNikVl0888cTGeddff/3G8cM28umnny733nvvpHMs51vOtTnnnLN86EMf6nt1Y/+lL32p7LTTTrXzjDzPaic0om+Btmv/m9/85pLg5CAtIX8VewcR6z1tqqinonxdZdvHHnusfPOb3yz77rtv7w4ahmbevfbaqwr15pqXSv/d1+78neEj21NPPVXt28553vlebbXVSqfi/ch5ev291lprVdfRQw89tNfoatgg5/sOO+xQTjrppJ59Pfnkk1Wgd/755y/Z7rrWdO2pm8dwAgQIECBAgAABAgQIECBAgAABAt0Cgr3dGn4TIECAAAECBAgQIECAAIFxFqgL0YzzYkbV3c0339w430orrdQ4vtfIL37xi41hl17zDPOwBFRvueWWkkqyCR2ObHl9+SDB3sy/7rrrNgZ7R1Zxvf3222vDoelv+eWX7xmayri6lsqap556at3oxuFbbrllOeKII2qnSQg61Yk/9rGP1U7Ta0TOle5Xmyfg+fOf/7z6dKY/+uijy0te8pLOn6P6nlbnZEJ0r3jFK8pPfvKT2vX8zne+U974xjeOKgSdyqdPPPFEbd8ZMaMEexOii0XC83XblPD6csst17i93SMTDpx77rlrr0cJzOdBhEGDpt3LmB6/E4Yc1tZ2T1l55ZUHXvVDDjlk4HnMMKXAM5/5zKrCbVNF9e9973tl9913L3lYZJB21llnTarUm/MqFebzOeWUU6pu1l577fLtb397Upef/OQnyy9/+csq1NvreL7wwgtLHoLpFQae1MmIH6nW3dRG3lebpl1xxRXLi170olL38MvZZ59d5p133touUpm6bX1qZzaCAAECBAgQIECAAAECBAgQIECAwL8FZiVBgAABAgQIECBAgAABAgQITD2BBEKHtc0222yNqzboa7kvvfTSKpzX2Om/Rs4yyyxtkwzN+FTkS2XUXqHerGRe790WZhu5MQkvNrWRgaHZZ29+LnvQ/ZTg5P77719SeXA07XnPe14VEGuaN6HhhIcHaXmdepPlPPPMUxIQG2ublufkW9/61sbVzb7Iq+QH3RdXXHFFVd24qfMEzgcN6DX1NzXHpSLvrbfeWhvqzbI7IcF+1+OBBx6oDfWmjznmmKMk7DijtWl5/A5qM97XqlTwvuCCC1pXY0a6p7RuTMsEV111Vdl1113Lm970ptrP1Vdf3bOXtuvR448/XvJwziAPP6Sach4yaGqbbbbZZKPTf6rz9gr1ZsL777+/nHfeeZPN0/bHoPfVtv7yxoK6dvHFF5czzzyzbnTJvBPpmKyFMIIAAQIECBAgQIAAAQIECBAgQGBMAoK9Y+IzMwECBAgQIECAAAECBAhMdIG2cOyVV145MNEgoZqBO++aYckll+z6a8qfCdbUBVq7p0448cgjjyzveMc7ugfX/m7qc7Tjahf27xF1AaLOfHXjN998884ktd/77LNP6bcaYF4r//3vf7+2r4xYZ511JhufV6g3hYT++Mc/VlWFJ5up5o9LLrmkvPa1ry033nhjzRT9DW4LiKVqYyrRNlWr7Swp+/ywww4rX/jCFzqDen5vvfXWfVVXHe9zsu18bDpm8wr6TTfdtOf2dAam2mWCegm69dNS+TJVNdvWq9/zsdcy2/ruNU9nWJNHpul1rqUKc9MxnvlOPPHEcv755+dnX+0rX/lK43RrrrlmaTtWGjuYSiPb1un3v//9wEtu2p9t+2uQhS2xxBKNkzdVi+2e8aGHHiqp6nrggQd2D6793bQNTePSYdP4pnFt89au7L9G9DoHuqdv2l8XXXRRueyyy6qHSvJgSa/Pww8/3N3dpN8vfOELy1prrTXp714/Tj/99PLOd76zJBjf1vLwxs4771xV2q6bNlV3t91228lGjwz6Tjby338cdNBBfd/XUnk7VeKb2sj7atO0Gffyl7+8zDfffG2TTTG+1/ZOMZEBBAgQIECAAAECBAgQIECAAAECBPoQEOztA8kkBAgQIECAAAECBAgQIECgTmDRRRetG1UNTzg2VQe7A0KPPvpoOeGEE8pWW21Vrrnmminm7552ipH/GtAU+uk1fd2wtmDvr3/96/LlL3+5cXmdoOgxxxxTEubspzWFmpq2Lf232dQtv23d6sYnTNoWOEyV2be//e1VwKpu+dmuvHr8zW9+c2uAc911152sm1QVfc5znjPZsO4/4vm+972vNFXyvPfee8uHP/zhsscee5Tbb7+9e/ba3037Ka8pf/GLX1w7b0ak+uN+++1XPvWpT5Uc871awmMJRh933HG9Rk8alkqgu+yyy6S/m360nZMJgI18xXqqPX7+858vr3jFK6Y43v/xj380La41pNcWgk7nCWtuv/325YwzziiPPPLIFMvL8ZMA91577VU+97nPtZ5reQ38GmusMUU/nQFN+zbTtG1zp59e323z9jrXFllkkbLRRhv16m7SsBh88IMfLN/97ndLgnx17a677ioHHHBANV3dNBkeo2FsbcfvySefXBLu7G6pcPq1r32t/Nd//VfP60DTdbPpmtu9jH5+L7XUUo2TnXbaaSXr39RyDuS6m+ma1ru7j6ZtaDsem+ZtGpflt/XdvY7dv3udA4OM75520N/9XI9yr0rV2ZHXdlxDGwAAQABJREFUyc6ysl/OOeec6oGEVLRvaq95zWvKAgssMNkkG2+8cVlooYUmGzbyjzwss+eee1aVe5v2QyoYv+1tb2u8/6bvQc/3VBHfZpttRq5W698JBI/c3taZTECAAAECBAgQIECAAAECBAgQIECgh0Dzuxx7zGAQAQIECBAgQIAAAQIECBAg8B+BtiBTpvzYxz5Wvao6lVcT2kuwMlVu066//vqy6qqrVr87/6ef0E9CJ2NtCWfOPffcja+rT2A3VRYTOlxmmWVKlnvfffdVgeSEf0ZT+bUpVPjkk082blZsEnQdtPVj2qvPxRdfvOywww6tYbSEi/Jq9OzLuCaoOO+881avFM+ryvPq7n4qsmbeBRdccIpVSejx1FNPnWJ4Z8BNN91UhVITxlp99dWr5edYu+OOO8qvfvWr8pvf/KYK2nam7+e7aT9l/lSETaCqrZ100knllFNOKRtuuGFJBdu4pCJnjv1LL720tO3z9L/bbruV5z3veW2LqsYvvfTSjdMlBJmQ8HLLLVcFsO65555y5513Tgr0xizHeqe1hffa1j8VMjfYYIOSEHxTS5Bt3333rSbJNqyyyipVxcjs2+uuu67xPO3uN76f+MQnugdN8bttndu2eYoOuwaM9lzbe++9q/OkKcyZ6+YhhxxSPXCQatrPfe5zy8ILL1xdTxMwvOGGG0oeSGjqI6uasH4/VUO7Nmua/Wy7p8T3Xe96V8l0uc7kuMk9peOe4yXDu1tnXPewzu+mcZ1p+v1ef/31K9sm/1TiTcA3ock8XJIKpzkHE27PPaXfBw+616npWtV2LOdcmGOOObq7m/S7zaat70kdjfjR1m/b+BHdDfTnJptsUt2nej1U1N1RAvK5TuZamOtXAucJ2KbqfPZTvtva/PPPXz10MnK67PM8pHDwwQePHDXZ33ng4j3veU91rGcd8oBLQrO5f+RBllQrzrWxrWWeVOgetOXen0rhg7TcgzUCBAgQIECAAAECBAgQIECAAAEC4yEg2DseivogQIAAAQIECBAgQIAAgQkr0BbC6sAkBNMrCJMQ1sjWVI0y06YSasJ7Y23pIyGU448/vrGrVKT97Gc/2zjNICObtq9pXJaRwNO0DPZmme9973vLWWedVQXo8ndTS1iqLTBVN3/CZXn9eK+2++67NwZ7M0+Oi1SCHq/22GOPNXaVsPHHP/7xkqBeW8t+S5XRkZVG2+bL+ISB82r4fltbJepOP6mA26vleB8k2NsJ6ffqqzPsiCOOqKpPJrzYT0u4cTQBx/R96KGHlrZwc46VpjaWYGHbvHXjV1ttteoBgoTA21rCrKeffnrbZLXjU7l6xRVXrB0/PUf0e09JAD2fkS33lIQgu1vTdbXtWOjup+13zpstt9yynH322Y2TXnnllSWf8Wp116oEUZtCv1l+tv9Zz3pWz1Vps6k7lnt21jWwbb628V1dDfwzofajjjqqqh5fdw3s7vS2224r+YymHXjggT0fVElf+bdHzvV+grl1x3q/65QA8Wj+3fD85z+/qkyfAHE/LQ+L5EEOjQABAgQIECBAgAABAgQIECBAgMB4CMw6Hp3ogwABAgQIECBAgAABAgQITFSBVFdtC9E12fQK9j788MNNs/QVMG3soGtkKqH2qhDbNcm4/0wor641jcs8bePr+m0zffTRR+tmrSoEfvWrXy1zzTVX7TTjMeJDH/pQWX755Xt2lWq12267bc9xU2tgP9YJZ330ox+dWqtQnVvHHnvsQPapmpyKkKNtI8/JNodUj2xrCQ5+/etfLy984QvbJh3T+A9+8IPlpS99aWsfbdvUNr5pAW0eqSRd1/bbb7+y9tpr140el+EJEL/73e8el76mRifLLrtsSaXT0baRx2+Td5aR4GvT9W/Q9Xj7299eVXYfdL6xTF93vNYN715W072hbf628d3L6f7dtMxM17bPuvsaze9Uuf7Wt7412QMMo+mnaZ4DDjigqiJfN82ss85aVd5O1e2p2XKP6ueaWLcOeVtBv+11r3tdv5OajgABAgQIECBAgAABAgQIECBAgECrgGBvK5EJCBAgQIAAAQIECBAgQIBAs0Cqlo623XjjjZPNmteCt4V67rvvvsnmGcsfeb32N77xjXGpAJz1ePGLX1xVAmxap7/85S89RydcVld5sTPDX//6187Pgb7bzOrWqbOQvMb7y1/+8rg5dfrNdyoopiLtzjvv3D14it85zvIa9fFoCZp++tOfbuyqX+s3vOEN5cMf/nBjX6MZudhii5VvfvOb5dnPfvZAsy+++OJVddyBZuqaeOQ5mVe+N7VU12wL6mX+eeaZpzrXVl999abuRjVuzjnnLF/60pdKKjv309qO97ZtrltGQqJtYcem4yrb8bWvfW2qhXsTrI7T7LMP70vM5p577rLvvvvWEbcOH3n8PvDAA63ztF0fWzvommCllVYqRx555JjC9V3dlS222KJsvfXW3YOm+F13TPVzHN97771T9JcBqfZ7zz339BzXGVi33M74uu827yy3rdJwXd/9Dl9kkUXKcccdV/qtEN1vv5lun332Ka9//etbZ8m1Otf4fE+N9upXv3rM96ZUoO7noZ4ElbM8jQABAgQIECBAgAABAgQIECBAgMB4CQj2jpekfggQIECAAAECBAgQIEBgwgqsv/76ZZttthnV9icY1F3hsi5k1N15Wyioe9p+fq+88spVuCbfo20JLb7nPe8pxx9/fFXhtqmfujBU3fDuvvoJanVP3/ndZpZQcVvVyrze/sc//nHZdNNNO92O+XuJJZaozPqpIJoqtAkl7rTTTmW22WYb9bI33njjctppp7WGhBMuS7itn7brrruWr3zlKyXVUMfaEnROKCzrONrA15577llS5Xg0bWTF07ZwX5bRdnx11iPnSYJs733ve0uqZo5HS5j+O9/5TkkArd/Wdq6N9jy7//77W1fhz3/+c+M0CZ0ncJiweIK+49Fy7uSY+O///u+SwPiwt1TnXnfddUe1mlPz+O13hTbaaKMqoD2WavY5P/IwwxFHHNEarKw7nvs5juvuuRnedv3rp/9eZm3Xi35Cxb36HXTYc57znOqc2GWXXcblXEu16VQC3mOPPfpelcxz+umntz7Y0neH/5pwvvnmqx5c+exnPzvm7UrQfsMNN2xdfK7DCUtrBAgQIECAAAECBAgQIECAAAECBMZLQLB3vCT1Q4AAAQIECBAgQIAAAQITWuBTn/pUFSQZNMiU6oZPPPHEJLsENttew95WEXNSZwP8WHXVVcspp5xSPvOZz5R+A75Z1zXWWKMcfPDB5cILLyx5BXuGLbjggo1LrgtSPf30043zjWVkP4GbfgKcqXCciqInnnhiFeaeY445RrVa66yzThXS/Z//+Z+BqpNmeQceeGD50Y9+VL3mPKGjflrWO9VczzjjjHLMMceUBIoTdkzQtK71U321e97NN9+8fP/73y/HHnvsqEKJOXYSoPrud79b8hr3eeedt7v7gX4/85nPrNZl7733HqifmIysYLnQQgu1LrufqqidThJcfdvb3lbOOeec8rGPfawsueSSnVEDfafy79FHH10F83IdGc+WcPVo2ljO/+7lpfplwuJnnXVWed/73jdqoxz3Cc2fe+65VT/DXKm3e/vzO+fpRz7ykYEqVsdthRVWKKki3Wk5x9uuU1PjnpJzOQ9C7L///mW55ZbrrE7jd86/PChz+OGHl/POO6/suOOO1fSjvafkGpI+m1rduZvr32jPg6blZVw/96O6+2Rb34OOz7rkOMv1KOH3pntCXd8Jy+dhhTyMsd5669VNVjs818RcC3O8vOlNb2r9N1BdRyuuuGL5xCc+Uc4///xRP2zVq+8E1dtaHpjRCBAgQIAAAQIECBAgQIAAAQIECIynwCz/+h/Npt7/ajaea6ovAgQITACBa6+9dgJspU0kQIAAAQIECMzcAk8++WS54IILym233VbyuvtUp0xVv/y/3wkbJmiUEEwCsQk+PfvZz54CJNX6mioFJjw3tQJHnZVJ2Om3v/1ttf75narCWfcEQhNEzCfV/rIuvVpCUXX/ySHhs3x6tab5Mv1YgnlTo+/HHnus5N/xV111VbnuuutKx+qRRx6ptj9mqR6YTyoTZr+/8IUvrP7utf2DDsvxlmWnSmeqpXZCaql029lX+a4LALcda2PxvvLKK8ull15a7rzzzupzxx13VMdTlpn9n8Bsjv8EaTfbbLPqs8ACCwxK0Dp9jt2EBO++++5J52Sssg4JPCY0GKNUSE3gupdV27EzlnMyfV900UXlxhtvLDHqeOX6Eauc63FJBdMcQwmQ5TOWyrNt+73pHG0Dnxp951pyyy23lBxTV199dXUcPfzww9V16fHHH6/2WR6IyPmWMG9CzznXlllmmbbVHfrx2b4cv3fddVe13Tku8hBCjovcU7LdORbWWmutkqriudaMbG37ZCzH78hl1f2dqrqXX355yXfOv1RIz3Gde0nnWpV9V3dvazoHm47Xpvmyrk3b3jbvWK6Po+07+7Lu3tqxj0edY2eauu/cu84888zqfOtci3Jd6lS0z/UxYeBcu1OldostthiXSu3d65Ng+vXXX1/d26655pqSkHPnfI9bwsede2uOnZzr+fQTmO5eTr+/453lNrWm46hpPuMIECBAgAABAgSGT2CVVVYZvpWyRgQIECBAgMCEFBDsnZC73UYTIDCsAoK9w7pnrBcBAgQIECBAgAABAuMhkMBWAmIJHyZ8ptULdKwSYEtoTCNAgMD0EkiwNkHmueaaa3qtguUSIECAAAECBAgQmCYCgr3ThNlCCBAgQIAAgT4EZu9jGpMQIECAAAECBAgQIECAAAECBAgQGLPAM57xjKpK55g7mgAdsJoAO9kmEphBBPKAgUaAAAECBAgQIECAAAECBAgQIECAwLQTUBpl2llbEgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFaARV7a2mMIECAAAECBAgQIECAAAECBAgQIEBgZha4++67y6WXXjpNN3HNNdcsyy677DRdpoURIECAAAECBAgQIECAAAECBAgQIECAwIwjINg74+wra0qAAAECBAgQIECAAAECBAgQIECAwDgKnH/++eXQQw8dxx7bu/r4xz8u2NvOZAoCBAgQIECAAAECBAgQIECAAAECBAhMWIFZJ+yW23ACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQyQg2DtEO8OqECBAgAABAgQIECBAgAABAgQIECAwcwvMPruXqM3ce9jWESBAgAABAgQIECBAgAABAgQIECBAYGwC/ivy2PzMTYAAAQIECBAgQIAAAQIECBAgQIDADCqwzjrrlAMOOGCarX1CvVtvvfU0W54FESBAgAABAgQIECBAgAABAgQIECBAgMCMJyDYO+PtM2tMgAABAgQIECBAgAABAgQIECBAgMA4CKy44oolH40AAQIECBAgQIAAAQIECBAgQIAAAQIECAyLwKzDsiLWgwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBEFhDsnch737YTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMjYBg79DsCitCgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwkQUEeyfy3rftBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQyMg2Ds0u8KKECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQITGQBwd6JvPdtOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwNAICPYOza6wIgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhNZQLB3Iu99206AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDA0AoK9Q7MrrAgBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBEFhDsnch737YTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMjYBg79DsCitCgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwkQUEeyfy3rftBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQyMg2Ds0u8KKECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQITGQBwd6JvPdtOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwNAICPYOza6wIgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhNZYJan/9UmMoBtJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAMAir2DsNesA4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQITXkCwd8IfAgAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSGQUCwdxj2gnUgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCY8AKCvRP+EABAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwDAKCvcOwF6wDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAhBcQ7J3whwAAAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBYRAQ7B2GvWAdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJryAYO+EPwQAECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDIOAYO8w7AXrQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMOEFBHsn/CEAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwNoGnnnqqPP3002PrxNxFsNdBQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAIBWaZZZYyyGcIN8EqESBAgACBGVpgkPtwptUIECBAgMBEF7jzzjvL6quvXk4++WQB3zEcDIK9Y8AzKwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwP8XuOaaa8pOO+0k4DuGA0Kwdwx4ZiVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJhcQMB3co9B/hLsHUTLtAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAn0JCPj2xTTZRIK9k3H4gwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYDwFBHz71xTs7d/KlAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAqMUEPBthxPsbTcyBQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwDgJCPjWQwr21tsYQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMJUEBHynhBXsndLEEAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWkkIOD7H2jB3v9Y+EWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCdBAR8SxHsnU4Hn8USIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMKTCRA76CvVMeD4YQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMZ4GJGPAV7J3OB53FEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1AtMpICvYG/9cWAMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAkAhMhICvYO+QHGxWgwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoF1gZg74Cva2739TECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJnAzBjwFewdsoPM6hAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPQvMDMFfAV7+9/vpiRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhSgZkh4DvL0/9qQ+prtQgQIDDhBWaZZZYJbwCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECoxFYddVVy4EHHlh22GGHMqNksQR7R7OnzUOAAIFpJDCj3EymEYfFECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGCBGSngK9g78O41AwECBKadgGDvtLO2JAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEZm6BGSHgK9g7cx+Dto4AgRlcQLB3Bt+BVp8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgaETGOaAr2Dv0B0uVogAAQL/ERDs/Y+FXwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhPgWEM+Ar2juce1hcBAgTGWUCwd5xBdUeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIERAsMU8J11xLr5kwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB6SAw+3RYpkUSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmK4Cw1SptwMh2NuR8E2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDDTCwxjoLeDLtjbkfBNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAw0woMc6C3gy7Y25HwTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMNMJzAiB3g66YG9HwjcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBMIzAjBXo76IK9HQnfBAgQGEKBp59+egjXyioRIECAAAECBAgQIECAAAECBAgQIECAwLQQmGWWWQZajP+mPBCXiQkQIECAQKuAe3ErkQkIECBAgMBkArfddltZdtllJxs2vf6YEQO9HSvB3o6EbwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRlWYEYO9HbQBXs7Er4JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRmOIGZIdDbQRfs7Uj4JkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmGEEZqZAbwddsLcj4ZsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDoBWbGQG8HXbC3I+GbAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgaAVm5kBvB12wtyPhmwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYOgEJkKgt4Mu2NuR8E2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDA0AhMp0NtBF+ztSPgmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCY7gITMdDbQRfs7Uj4JkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmG4CEznQ20EX7O1I+CZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJjmAgK9/yEX7P2PhV8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLTSECgd0powd4pTQwhQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYSgICvfWwgr31NsYQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMk4BAbzukYG+7kSkIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRGKSDQ2z+cYG//VqYkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoU0Cgt0+orskEe7sw/CRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBibgEDv6P0Ee0dvZ04CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIF/Cwj0jv1QmOXpf7Wxd6MHAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBiSrw1FNPlVlnnbXMMsssE5VgXLZbsHdcGHVCgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGwCs45tdnMTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAeAoK946GoDwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJjFBDsHSOg2QkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMh4Bg73go6uP/sXcfcHKU9f/AH0gIPSRACKEGQm/SO0E6CAZDE0EBQVAEC0iXJihNRUGQ3qVLtQTpItIDoddQpYWE3kK7/37n9dv8r8zM7d7t5S659/N63Wtv55l5ZuY9eztD+Mx3CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHRSQLC3k4AWJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAIAcHeRigagwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAnBQR7OwlocQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNEBDsbYSiMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0UkCwt5OAFidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQCAHB3kYoGoMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJwUEezsJaHECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECjRAQ7G2EojEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdFJAsLeTgBYnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0AgBwd5GKBqDAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCcFBHs7CWhxAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAo0QEOxthKIxCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHRSQLC3k4AWJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAIAcHeRigagwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAnBQR7OwlocQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNEBDsbYSiMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0UkCwt5OAFidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQCAHB3kYoGoMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJwUEezsJaHECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECjRDo24hBjEGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBlCHz00Ufp9ddfT+PHj09vvfVWampqSoMHD05zzz139jrDDDN0+Y7ENrz88svplVdeSR9//HGaY4450lxzzZXmn3/+NNNMM3X5+t9555305ptvZvv/9ttvp+mmmy7b/zCI7ejbt+v/F1psQ+x//Hz11VdpzjnnzNa9wAILZNvT5Qh1rOCTTz7JtrN6zOKzM+uss2bHbc0110zzzjtvHaP1vlnjM/baa69ln7k41sOGDUsLL7xw74OwxwQIZAJx3n3jjTeyc1Cch9977700YMCASefi2WefPU0zzTRdqhXfRbENcQ6Ka4I498f5L64HJsd3+hdffJF9L1avRarXAnEejp/+/ft36f7H4J9//nl69dVXs+uR2I7ZZpstM5hnnnmy81uXb0AdK4jPzLhx47JtjXPx//73v+zaIT4rcT5ZY401Jsu1Sx2bnM0axzU+X/E5D+P43MXnrHrNOeOMM9Y7ZF3zV//WXnzxxRQ/8bcWn/E4xvE5j+2YHNd8dW20mQkQIECAwP8JdP2/SqAmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoVoHHH388XXnllenGG29M9913X/ryyy8LtyeCDltuuWXaeuut07rrrpv69OlTOG89HQ888EA699xz01//+tcs4JG3bARsIyi6ySabpN122y0Lf+TN15Fpt912W7r++uszgyeeeKJwiAhTLbHEEmmrrbbKDFZYYYXCeevpiDBL+IfBqFGj0ocffpi7+CyzzJLWW2+9tPnmm6eddtopdXXoJXcjKhMjfP2Xv/wl/fnPf06PPPJI0WzZ9GWXXTZtuummaeedd05LL7106byN7vz000+zz0uMG0GdCIbHZ7Z1KC7CPREk++CDD7JwVHzOjj322EZvTjZerOO6665Ll19+ebr55ptTbGPrNnDgwLTiiiumlVZaKa222mrpW9/6Vpp2Wg9bbe3kPYGpRSC+B+I8/K9//SvddNNN2fdQ0b7FuXCdddbJzkMjR47MvtuK5q1n+vvvv58uu+yydN5556XRo0dnwda85eMmm4033jhts8022Xd73jwdmRbBzksvvTTb/zgnF50HY+w4F8Y2xLXIFlts0bCgbwRiL7jggnTRRRelZ599Ngua5u1LnMviWuS73/1uatR1QN562psWxynOw3HcIiRb1CIIvcEGG2RWce3QnWHVp556Kl1xxRXZcb7nnnuyc2/Rdg8ZMiSNGDEi+6zHtU989jvbIkR80kknZX9vEYLOOwdX1xFO8TkLs7j2nRw3t1XX7ZUAAQIECLQnME3lP2Kb2ptJPwECBAgQIECAAAECBAgQIECAAAECBAgQIECAwJQnMHbs2HT44YdngZAIltbboqraCSeckAU26122On+EOn74wx+2Gw6tzl99jYDmXnvtlX75y19mVfSq0+t9/e9//5sOOeSQdMcdd9S7aDb/UkstlU477bQ0fPjwDi0fC11yySXpwAMPzCrs1TNIVJI76KCD0t57792wgHV764/gUJhHADlCYPW0CMjsu+++6YgjjpgslZdj2yLAE5/TeluE5jr6mShaV/yNnXzyyenQQw/NgtFF8+VNj6BxhO0WW2yxvG7TCBCYQgXihoLzzz8/HXXUUVl13Hp3I25SiBtN4rslbl7oSJs4cWI6+OCD0xlnnFEaDs0be9VVV03HHHNMFhrN669lWtzscOKJJ6bf//732c0VtSzTfJ5+/fpl58Gjjz66w+eWqHa75557pmuvvbYwzNt8ndXfwz9uvPjNb36TllxyyerkLn+Nm0LiXHLvvffWva5lllkmO9ZxXpmcLSriHnnkkdlNQWU3kBVtUzy9IW64+cEPftDm5pyiZZpPj+rTv/vd79LZZ59d9+c8xolw9M9//vN02GGHdWswuvk++Z0AAQIEereAYG/vPv72ngABAgQIECBAgAABAgQIECBAgAABAgQIEJhKBaI67fbbb58++eSTTu/hhhtumIVTBw0aVPNYUVsmQsERTIlgU0fboosumlU/7UigJoI4sf7Otgj2RDj5T3/6U11hjwjJ/uQnP8lCsp3ZhqjCF9VfI/TSle21117LKudFhcDOtAUXXDCr1heBsK5uHQ32RhXMq6++umGbFyH6qPh31113dXjMqBQYwbUIR6ve22FGCxLoMQIRaI1QboQ0O9tmm222dMopp2QVZOsZ65lnnknf/va305gxY+pZrMW8cQ6MsGOENuP3etrzzz+fVf2N6ridbQsttFC6+OKL0xprrFHXUOH/ve99L73xxht1Ldd85rjZKG6+2G677ZpP7pLfTz311PSzn/2s9OkK7a04jtOPf/zjLBA+Oc4nUYk6KjyXVWFub5ur/fG0iKjsHNV8a23nnHNOtr+fffZZrYsUzrfKKqtk1zBDhw4tnEcHAQIECBCYHAKCvZND2ToIECBAgAABAgQIECBAgAABAgQIECBAgAABApNRIMInu+++e6dCIa03N0Ka8ejsCLe01yLU+53vfCcLo7Y3by39s846a7rxxhvT6quvXsvs2TwRqI0QVCPbrrvumiI8UkuLQFdUhX344Ydrmb3deRZeeOEU1Yejim9XtAh9ffOb36y7qnDRtkQI+c4770xLLLFE0SwNmd7RYG9UBDzrrLMasg1RJXCttdbqUDXOvA2Ix4Ffc801dQfo8sYyjQCB7hGYMGFC2mijjdJDDz3UsA2IgOaVV16ZhYVrGTQq5sc2NCJsGeuLm4WiAn2t4d5HH300W/+bb75Zy+bWNE8EnONcuPTSS9c0f5yz99hjj7qq9JYNHBVhf/GLX5TN0uG+qHIbFWMbee0SFf/jpqSubJdddll2Y8vnn3/esNV87WtfS//5z39SXP+1137729+mAw44oL3Z6uqPa5f4+4nPm0aAAAECBLpLYNruWrH1EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQINF7gqaeeyh433ZHHIJdtzX333Zd22WWXslkm9R133HENC/XGoBGSjQqrr7766qR1lP1yxRVXNDQYU13Xueeemz3mufq+7PX73/9+w0K9sZ6oehgG8Uj1Rrd33nknbbzxxg0L9cb2Rahtk002qfmYNXqf2htv4MCB7c1SU//48eMzuwj3Nqpdd9116Ve/+lWjhjMOAQLdIBAVVxsZ6o1d+Oqrr7KKvbXcMDJu3LiGVVCt8kWAs9bvpgh57rDDDqmRod7Yjvfeey9tttlm6d13361uVuHrvffem1VxDbdGtQiQ/v3vf2/UcC3GiacMNDLUG4PHeMccc0yL9TTyzQsvvJB222231MhQb2xffMbjBrH2WlQKPuigg9qbre7+uJaOKs8aAQIECBDoTgEVe7tT37oJECBAgAABAgQIECBAgAABAgQIECBAgAABAg0UiEq58QjjqHJW1vr27ZuWWmqptOKKK6bBgwdngc7HHnuspiBqhC2WW265wuFvuumm7LHbZUGa6aabbtL6BwwYkCJAEeO+9tprheNGR1QNvvvuu1PZY6UjpLrkkku2GyaKysNREW6FFVbIqhC/+OKL6YEHHkjxWtZmn332rDJrWeXiE044IR144IFlw2TrrK4/qh8+/vjjmUFsf1n70Y9+lE477bSyWerui8d1l40Z27ftttumtddeOzv2UcEujllUY4zqjWVm6623Xrr11lvr3qZaF+hoxd5DDz00HX300bWu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owuXjWudn//854X91Y6qc/V969f33nsvVSrrtp6cHft77rmnzfTqhEMPPbT081udL16PO+645m9b/F55wkQUS2wxzRsCBAgQIDC5BAR7J5e09RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEulCg8ujowtEjOFgWFG294GqrrVYYDImAw0svvdR6kVR5pHZheDNCohEWriXIEwNXqvml9dZbr806qhOKwqhlBhEm2mijjapDtPtaFgCOoEdei/VXqs/ldaVKlcRUefR5bl/exGOOOSYNHjw4rysLL1ceu53bV8/E//73vynCyHlt++23rykE3XzZSoXJwuB2hNmmplapVpm7O9VAdC2h3hhgpplmSocddljaZJNN0lFHHZXiMxRBprvuuiudcMIJqfIo8dz1mEiAQM8T+Oqrr9Idd9xRuGGVCt1p1llnLexv3dGR89Df/va31sNMer/55pun+G6vpUU4NELARS3OQXk30sQND5WKuUWLZd9zhZ2tOuJGoEqF41ZT///bomBvmcEhhxySKk83+P+DlPw2dOjQ7Pu5aJaia5Gi+Yum33jjjUVdKULK9bS4saToei/OLxFIbkQru97q379/2m+//WpezQorrFD6d5F3nOeZZ54Un8HKkyhShOArTwaYdM1Uqaacdt1115rXP2zYsMKbmCIg/vbbb9c8lhkJECBAgEAjBQR7G6lpLAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBANwncfffdhWseMWJEYdW5vIUigBvBjKKWVwkvKpgWVTWLUG2Ehetpu+++e+HsRWGaMoMddtihcLy8jjnnnDNvcjYtb/+jY9SoUYXL7LLLLimqNdbaZpxxxizgXDR/kUHR/HnTiwLKMW9ZoCxvrJg2YMCAtOyyy+Z2Vx4Bnjt9Spz4ySefpOuuuy530yNcFNV262kRwrrhhhuyANnXv/71FMdeI0BgyhN44oknsmB+0ZZH1fZ6WqPPQ1EFvJ4W30eLLrpo7iJRNT6vYmrZeXjIkCEpxqynlRl89tlnbYaKm4zGjBnTZnpMiLByhEDraXHuLqrwHk8PKLqZp551FJ2LI7y6yCKL1DNUNm9cc+W12NaHH344r6vuaWXHebPNNksDBw6secyoEB03PxW1vOMcx3LttdfOnkQRNxXFNVE8UWL8+PHpoYcequt664svvkjxk9di28quh/OWMY0AAQIECDRKQLC3UZLGIUCAAAECBAgQIECAAAECBAgQIECAAAECBAh0o0BUtRs5cmRaccUVU+sgTL2h2ldffTW99dZbuXsTod+8oE9Zxbmdd945d6yyibEvs802W+4sESiJcGXr9o1vfCPFzzLLLNMmiFGvQVEwKNYZFfHyWqMNIlBU1BoR7H3zzTeLhk/LLbdcYV9Zx/LLL5/bHRVoi4LfuQv04IlllZmj2rRGgEDvFIgAaHxvR8X5qALavEr9fPPNl+add966YOo9Dz311FPplVdeyV1HVJ8dPnx4bl/ZxLLzd955KMKoEWBea6210vzzz5+iemq11XsejuXKgqh55+Kbbrqpuro2r3GTUz2B0xhgrrnmyq4r2gxWmRBh0LIKzXnLtJ4W58Vx48a1npy97+h5OCrgFrWo1N+IttJKK6Wtttoqrbzyym1CtPUe5wkTJqT//e9/uZsVwdpaKyzHAPGEiqIbjHJXUJn42GOPpaIbtuaee+5UawX+ovFNJ0CAAAECHRXo29EFLUeAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBzBPbdd98UP9X28ccfp5dffjkL+Xzta1+rTq7p9eCDDy6cL8IceRVFH3nkkdxlpplmmiz8kdtZMjEewR3hqGuvvbbNXBHAiAqwG220UYu+U045pcX7d999NzOIoHJeAKjFzM3eRFjnsMMOazal5a951fDC+7nnnms54/+9iyB0RwI6EU6JMFhe4CUCXxGGiRBLR9t7771XuGjrcHjhjK064rjltXfeeSdF6KyegE7eOD1h2oMPPpi7GVFBMIJORS2qDr7//vtZ6Lx54K9oftMJEJiyBJZYYol03nnnTdroCG1GFdGXXnopffnll5Om1/JLVP+96KKLCmfNOw8VnYdjkK233jrF+bjeFjfLHHroobmLRbD3yCOPbNG38cYbp/iptjifxjk4DMqqslbnb/56ySWXpKJ9isBnhIdbt6L5Y75tttmm9ew1vQ+D66+/PnfeMIj+jra4diiqFtvR8/BMM81UuDlxk029VYvzBttrr71S/FRb3GxVveas53orlv/lL39Z+PcR10FFN3lV192Z1/gb/fWvf104RGeObeGgOggQIECAQI0Cgr01QpmNAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAlCUSwI0JG8VNP+9Of/lR3mChCKc8++2zuahZeeOE0YMCA3L72JkbVubxgbywX4Z3Wwd7W48V6416skdgAAEAASURBVKeeUO1XX32Vdt9996yCW+vxqu/zAlVPP/10YUXaqKLc0RYGecHeCKNElbl11123o0OnwYMHFy4bxzOvMnPhAv/XUVZhMvZjagj2xmO+89omm2wyKYAUjzy/4YYb0nXXXZciSBUVsD/44INssQjXRcAtKlvG8dtiiy3S+uuvrypgHqppBKZggfhbHzJkSPZTz268/vrrWQi1KPAZlYFXX331NkM++eSTbaZVJ3T0PBQhzahY+vnnn1eHmvRaFqKtzhTbuuCCC2Y/1Wm1vN53331p7733Lpw1KvPnXVt0hUFZBdxaDAp3otIx88wzp1lmmSXFOaN1K7quaj1f6/ejR49uPWnS+7zriUmdnfglbvhafPHFs596hjn77LPTmWeeWbhI3vVW4cx1dsR11BFHHJGuvvrqwiX33HPPwj4dBAgQIECgqwWm7eoVGJ8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDKEDjmmGPST3/609KN3Xzzzdv0jx07NkU10ry2/PLL502uaVrZsuPHj69pjHpm+vTTT9MOO+yQzj///MLFIoSTF6aN6opFrWw/ipapTi9btrMGEbouahEarrdFCK0o9BpjRdXeqaEV7WM8kjzalVdemYYNG5a23Xbb9Je//CU9//zzk0K90R9hoqi2/Oijj6aoMr3ppptmYaiozhnBco0Agd4rEN8Xw4cPT2UB1ahmn1eVtSvOQ1FdfKmllso9IFGBvOjcn7tAjRNvv/327MadsnNG3rVIDF9kEOHZ+F7uSIuqsX369MldtLPn4Rh0oYUWyh378ccfL7xhKHeB/5sYoeiiVmZatExXTf/DH/6Q9thjj9J9LDrOndmmqJJ82WWXpXiaxdFHH1041IYbbpg6GogvHFQHAQIECBCoQ0Cwtw4ssxIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEpkaBt99+O2255ZbZ45DL9i+CihE4at3iMdtFrd6Kwc3HiepvRS0qoDayPfXUU2m11VZLl19+eemw8djxvMdjT4kGZcHeCDfXG9g66qijcqsOVkHffffd6q9T7OuXX36ZXnzxxdztj2rEO++8c9puu+3SuHHjcucpmvjCCy+knXbaKUXV36nBqWg/TSdAoFjgiiuuyIKEzz33XOFMUT03ApF5reg8FJWDF1tssbxFappWdh5vRLC1uhFxY8Ovf/3rFIHKCA0XtXnnnTcdfPDBud1FBnE9EQ4daVGNdv75589dtBHXIkXn4qjie+mll+aut2jiG2+8Ufj5iGV6wvnlvffey86T++67b2moN6rZx40vHWl/+9vfskrZEd6N69YNNtggrbrqqtmTCuIGre985zvZzTVFY0eYO27S0QgQIECAQHcKCPZ2p751EyBAgAABAgQIECBAgAABAgQIECBAgAABAgS6WeCOO+5IURX2+uuvL92SqNh3+umn585TFsCZbbbZcpepZWLeY7aryzUiTFMd69xzz01RbbW9R2p/61vfSvvss091sRavU6JBhIkiJJbXolrkcccdl9eVO+2ee+5JUfG5rPWkSoFl21nWF8c5Ku7mteOPPz5deOGFeV01T7v55pvT6quvXncwuOYVmJEAgR4n8NFHH2WVS7/97W+nCD2WtVNPPTUtvfTSubMUnYciyNi3b9/cZWqZWHYeb9S5OAK5G220UTrssMNS3EBR1CJkGwHoWWedtc0sUXX/888/bzM9JpTtQ+4CrSYWXY80IthcdhNTXHPEzVe1tl133TWVbVN3n4fvvvvutMIKK7Qbml1kkUXSOeecU+tut5kvrmEi5BzXdf/5z3/Srbfemu6///6azq1xDr7hhhtS0TFvszITCBAgQIBAFwkI9nYRrGEJECBAgAABAgQIECBAgAABAgQIECBAgAABAj1ZIAIwUS3t61//enrllVdKNzUeX/2vf/0rzT777LnzFYWJYub+/fvnLlPLxLJlGxEmitDHiBEj0m677ZYiWFXWInAUlfOKHsc9JRrEo8kjSFbUIqgblXvba9dcc00aOXJkaRgrxugJlQLb25f2+sv24YEHHmhv8Zr6n3766fTd7343RfVKjQCBqVvgzjvvTFFV9Kyzzmp3R0844YS0++67F85XdB4qO5cWDtaso2z5RpyLL7roorTMMstk4ctmq23z6wwzzJCuuuqqtOaaa7bpiwlF+x99ZfsQ/e21ouUnTpxYut72xo3+COMWVROO6u9RBb6oEnF1/DgOO+64Yxo1alR1Uu7rxx9/XHc1/tyB6pwYTwCIKsvrrLNOigr1ZW2BBRZIN954Y5prrrnKZmt4X1T1jdB4hI/nmWeeho9vQAIECBAgUK+AYG+9YuYnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEzhAhFAjIpp8Tjvouqj1V2MEMZdd92V5ptvvuqkNq8ffPBBm2nVCTPNNFP117pfozJfUZC2ngp2eSuORyxHkCge19xei+Dv3//+9xShoqLWVQZ5VQmr29BZgxhnv/32qw7X5jUCS9///vezKor33XdfijB4tUUQOqr0RhXjrbbaKquMV+0reo3xpvRWFuzN27fpp58+rbjiimnnnXdOP/nJT7JQ3tprr52igmZZu+mmm9IZZ5xRNos+AgSmYIH4Ptx///3Tuuuum8aOHVu6J3EujGrgMX9ZKzoPtfd9UzZm9HXVeSjCqHFTyE477dTujR9DhgxJt9xyS9pss80KN7do/2OBnmoQ2xYVe+Mmo6IW+x1PTYhqza0Dvi+++GJ2rlhyySXTJZdcUjREi+kRsp2c7eGHH04rrbRS9hSAsmrMsU2rrbZaFqxdaKGFJucmZuuaMGFCeuqpp9q92W2yb5gVEiBAgECvFRDs7bWH3o4TIECAAAECBAgQIECAAAECBAgQIECAAAECvU0gKoAee+yxWbW7CC+UtWmnnTYddNBBWQW99qqm9evXr3CozgRIIgBSFALp6GPFI/izyy67ZBXwIsRR1qKi7XnnnZfOPvvsVLaPMUZZf2cMypbtqEHzfY5KkZtuumnzSW1+v/nmm7OwTXjMP//8ad55582qH66xxhrpuuuuazN/0YTOhLyLxpzc06PaYa1tm222Sc8//3waPXp0Vvn45JNPTmeeeWb2WPDnnnsubb/99qVDRYhLI0Bg6hN44oknsu/U3/3ud+1W5o7AZlQQ/d73vtcuRNF5qLM3VXTFeSieArDccsula6+9tt392njjjdODDz5YWKm3OkDR/kd/TzSobne8HnDAAc3ftvk9qhHvvffe2U1W8fSEOBfPNttsKQKwP/rRj1J71zPVAaMycNlNStX5GvEaN46deOKJ2Wf9scceKx0ytmufffZJd9xxR7dVyx0zZkw6/PDD09JLL53i5i+NAAECBAh0t4Bgb3cfAesnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEwGgfHjx2cBzkMOOSR9/vnnpWuMwMitt96ahYBrCY8OGjSocLwPP/ywsK+9jrLqe0WPxS4bM4IlK6+8crrgggvKZsv6ompchDwiBFxL6yqDrny0eHW/zj///LTYYotV3xa+Rsj6f//7X3rttdfaDaPlDVJmlDd/T5xWVrmyur3TTTdduv7667NgUNHjvOeee+506aWXZqHx6nKtXx9//PH03//+t/Vk7wkQmIIFLrroorTKKqukqGLaXvvxj3+c3RgQN2DU0oq+YztzHo71NvI8FOeRuA6JyrtvvPFG6W5FxfN4ssANN9yQ4juzvVa0/7FcTzLI248111wzRdC7lvbOO+9k5+Ky41I0zsCBA1Mt13VFy9c6Pbbxm9/8ZvrFL37Rbqg6zpMR9I4QcFk4u9Z1d3a+uPbcbrvtsir7RTeXdXYdlidAgAABArUICPbWomQeAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAULPDoo49mj0G+6aab2t2LqAoY88fjwWttZWGasnBue+OXhVaiUl09LSrLrr766umZZ54pXSxCmUcddVQWqBw2bFjpvM07pwSD5tvb/PfBgwenqMq7wAILNJ/cod+HDh2att5669xl55xzztzpU9LEOeaYo93Njc9PBJpqabvttltpxeQI/2oECEz5AlExPyqS7rTTTqm9yt8RdBw1alSKqt0zzjhjzTtfdB7qylBrPefiOKdvscUW2U1DUc21rK2wwgpZqPnnP/95imqutbSoRBuV5fNaZ65FYryi65HYtlpu+MjbptbTIgR7xBFHtJ7coff77bdf7nKT4zz89NNPZ+H1f/zjH7nb0HxiBGjjmnOjjTZqPrnTv3/3u99NDz30UBaA/uijj1JUnY6fuDnp3nvvTRdeeGEaMWJEaZD4lFNOSfGjESBAgACB7hIQ7O0ueeslQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEwGgQhMrLPOOunll18uXVuEPa666qos7FBPUCcGLQoTRd+LL74YLx1qZdX86qnYe8UVV6StttoqRbijrC211FLpnnvuSYcddljq06dP2axt+nq6QZsNbjUhqjTffvvtacstt2zVU/vbCOaEX4Sj81qZUd78PXFaPAK9rK211lrtPlK99fJlwaHnn3++9ezeEyAwBQrsuuuu6Y9//GO7W7799ttnQcdNN9203Xlbz1D0HRuBxqi03tHWiHNxnH833HDDrPpu2XbEuffQQw/NwpdLL7102ay5fUUGnbkWiRUVGUSot9bgce4Gt5p45JFHpj//+c9prrnmatVT29s4R51zzjkpPm95rcgnb96OTItQb5wHx44dW7p4VA6+5JJL0uWXX57aO6+WDlTQGeH45ZdfPs0777xppplmyq5L4tok3q+66qopbmKLG75iO8tu4jr88MPTm2++WbAWkwkQIECAQNcKCPZ2ra/RCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLdJvDKK69kj7t+7733SrchqvNGADjCrx1pZUGRCHl0tI0ZM6Zw0Qhn1NL+/e9/ZxUSo1piWdt9992z6oArrrhi2WyFfT3ZoHCjW3UstNBC6dprr0133313Wm+99Vr15r+NQFOEgSPQe+ONN6ao/vvcc8/lztzRoFLuYN00MapnllXQjFDetNPW979gI1RUZBPVBTUCBKZsgUMOOSRdcMEFpTsR4cOYJ6p0dzToOLnPQ/H9HwHK9toXX3yRtt1223T//feXzhrn9ThnH3300YU3iJQOUOksMnj11VdTRysXx41R77zzTu6qa70WyV24YOKee+6Z4qaOcBgwYEDBXC0nx3H43e9+l1566aUs1Nsd5+HXX389q0A/YcKElhvX6t0aa6yRHnnkkfSd73ynVc/kfzvffPOlW265pfCJBVGpuVFVlCf/3lkjAQIECEzpAn2n9B2w/QQIECBAgAABAgQIECBAgAABAgQIECBAgAABAm0FIoQSFf8izFLWDjjggHTMMcfUXaG2+ZgRPImw4yeffNJ8cvb7U0891WZarRPKgr3LLbdcu8M89thjWeh04sSJhfPGdp922mlp5513Lpynlo6ycNOTTz5ZyxC583TWIHfQdiauvvrq6dZbb00R0omQ1ejRo9P48eOzn1h0wQUXTBECHjp0aPra176WFllkkUkjxiPm87Y5KuUtscQSk+abkn+JEG6Ep/LayiuvnDe53WlRLXrcuHFt5mvv77fNAiYQINCjBE499dR07LHHlm7ToosumlXMX3bZZUvna6+zvfNQrTdsNF9PVKotqlga54CoWNte22OPPdKoUaNKZ4ttu+yyywpvcihduFlnmUFcj3TkOzrvnFZdZS3XItV563mdeeaZs8rFBx54YHrggQfSHXfckZ13IjQbN2vFUxbCP87F8bP22munfv36TVrFXXfdNen35r909jPWfKzmv3/wwQfpG9/4RrtPafjpT3+aBZCLKvs3H3Ny/R7XNBGiLroO/O9/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5eN7pCvapptuWjjso48+mn76058WnluaL3j//fenY489tvmkFr9vs802KYKbeW3ixInpqKOOyuvKpkXwtiwwW7hgjR0RuC1qF154YWFl+dbLREXlG264ofXkSe+LbrCJAHE957UIoq622mopnqiw5ZZbZqHvahX3iy66qDQgPWljKr/Eerfbbrv09ttvN5+c/R7XTnFtVdSKtrfoRrEYJ7YxgrtFLf4ONt9886LuDk9v76kN++yzT3rzzTdrHj+ueeL6p6jFDTazzjprUbfpBAgQIECgywS65mqxyzbXwAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkUCERAsqjg2zzzzpH333bdo0Zqnx6OKP/vss9z5999//9zpMfGNN97IHhF+8803F84T1V533333dM011xTOs8suu2SPXM6bIQKxZdX4IvDUiGBzPLK5qB1wwAFFXenBBx9Ma6yxRvYI6aKZXnrppbTFFluUBnn222+/3MXjkeH9+vXL/VlllVVyl4kAdVEAJgJQv/rVr7KAUu7C/zcxQkkRWi4KD++9996Fi4dX0TaXHcvCAZt1FP0txCxlfc2GKPw1/pamn3763P7TTz89C7UV/Z1UF3rggQeyx5O/+OKL1UktXmP8rghFtViJNwQINFTgP//5Txo1alThmHGeLqr4XbhQq44IW0Z117y29NJLl35vnHLKKVn4M8K3RS1u1IgbaCIomtfiuykCwkXtz3/+c3rllVeKurMqq50NNsf3a1yP5LU4H0WAOq+FXdyYURY8jvNDVL2NgGhRi5t4ttpqq9zujTbaqPC8lldNNm58ue+++3KfthDHKY5FhLLLWoR5d9xxx/Tvf/87d7bY1rgOzGtxTVN0Hp577rlTBF/z2qGHHlp43o+nIxx00EF5i9U1Larltv6szjLLLKXVh1944YW0ySabtGsWGxL7Hjc4lVWXXnnllevaZjMTIECAAIFGCUxTuShpatRgxiFAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgegQgyLLzwwoUrj9DGmmuuWdjfuiP+F1IEZ+InQhUff/xxFgCNkMUPfvCDdNZZZ7VeJHsf1ebiUdJFbbrppstCNbEtq6++epp33nnTE088kYVef/Ob36SXX365aNEUYY5nn302RdAkr11++eVp++23z+vKpkXQZJlllinsb90RQdXq/sdrBI8jBBseZ555ZhZCbr1MVL1bbLHFUlFYM+aP7YhHkMf+x8+MM86YBVAimBsVEmM9RW2ppZZKjzzySOrTp0+bWSJQNnz48DbTY8LAgQNzq/hFlecI/Zb9L8PlllsuHXfccVmV4Kp9fA6eeuqpbPpf//rX3HXGxAjXlFU8jOq28bj3vPb973+/5sqKecuH5zrrrJPXlVWLPPjgg3P7ap245557pgjxFrUlllgi/f73v0/rrrtui8e1v/vuu+mSSy5J8Sj6omBajBkB7t/+9rdFw5tOgEAPFIhwZfx9F7X4zp9hhhmKuttMj3Bt83NxBDjjhow4l0YYMa8CfXyvtxdGXHHFFVNUnI3tiXlj3AiPXnXVVem8885rsx3NJ8RNPCeccELzSS1+jwqnZUHJr3/96y3mL3sT56aqQZx74yf2P7Y3wrtFAeII5v74xz8uGzp94xvfSHHDT9xwE9cGcWNNnF9j2dtuu6102SuvvDJF1eK8FhVlb7/99ryu9Kc//Snl3ewSN/T84x//yF0mJsbxjhthIrQcVfsjXB02sf+33HJLdj4petJBVFa+6667smOdt4IIt5aFzV999dU2oeC4WWvIkCF5w2XTokLw2muvXdjfuiP2Ja6f4vjG5716zRnnyAjetq4MHEHo+OyWXbtEeDz+HuNGnCWXXHLSzThxbfe///0vXXDBBdk5uigkX93G6667Lo0YMaL61isBAgQIEJhsAn0n25qsiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoMsEysKTsdIIShQFTerdqHHjxhUuEqGVe+65JxXNE8GNCEOWBSKLBo/qsdVgad487RmMHz++yw0ifBOhqKjYV1TtMLajLBSVt28xLcK84ZsX6i1apr3pK620UhZ+OvXUUwtnjaBTBKCiRWXBmWaaKavAXBaoiXnjseJnn312/NotLT7zRS3CQ51tUXkzQnBFYaoIPkfF3QhVReh+wQUXzMJoTz75ZBZeKlv/oEGDUjzGXCNAYMoRiMBgVLsta3F+bESL77CiQGJ8r0cItOw8ExXk46feFkHisu+muMmoLNQb65sc1yJ77LFHuvrqq1PZUwL++c9/pvipt8X5vSjUW+9Y1fnj3B4ucdNMXotrp7j5KX4isBrVdyPcHAHY9lpUzo0QbCPbv/71r9Lh4vqnK4/zqquumgWkw62oxd/jRRddlP2E2fzzz5+FeyPAXes1wHbbbSfUWwRsOgECBAh0ucC0Xb4GKyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOhygbLwSpevvNkKIvQTYccIuDay7bXXXlnVtbIxe4pBVCM86aSTyja1Q31RJXn99dfv0LJlC0VV2NjmWloEyV5//fXSKnkxToRZL7zwwsLHodeyrs7OUxbcKQv91rreCAldc801k6oAFi0XAeixY8emW2+9NY0ZM6bdQFFU84wKgQMGDCga0nQCBHqgwMMPP5zixo2e0KL6+2abbdbQTYlq8xFcjhs8ilpPOQ/HDTBRxX/YsGFFm9qh6SussEIqq1LfoUErCy200EJZVdparp2qFWdrCfVG1dyjjz66o5tVuFxPOM7HH398WnbZZQu3sXlHmEWgN0LnZdcGzZeJz/spp5zSfJLfCRAgQIDAZBUQ7J2s3FZGgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgagSeeeKJrBu7AqBEkicdUzzLLLB1Yuu0i8ejpk08+uW1Hsynvv/9+9mjlZpO69dd4BHgEq6JKXCNaVF78/ve/34ih2owx44wzpr///e91PTa7zSDNJsQjuKMCcLXKb7OuyfprVDMsahMmTCjqqmv6Wmutlc4555y6limbOaohX3bZZdmj4cvm00eAQM8T6Enn4Tj3xHdJo8K9/fv3T6NGjUqLL754KXxPMph99tlTVPJfcsklS7e51s7FFlssGy8suqJtueWW6ZJLLmlYVf5VVlkluxZrZJX/6n73hOMc1y7//ve/G3btUt23eI1Q7xVXXJGier5GgAABAgS6S6Ax/5LQXVtvvQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAunLL79Mzz//fI+SiIDK3Xff3W4IqGyjIzxzxhlnZFXs2gvIPvfcc2VDdUtfPP76+uuvT3PMMUeH1z906NB00003pf3337/DY9Sy4Mwzz5ytJ6r3dmZ755577mycPffcs5bVduk8r776auH4ZX2FCxV07LjjjumWW25JiyyySMEctU2O8Nl9992X4m9HI0BgyhN49tlne9RGxzk0btqIc1Fnwp2bbrppevTRR9PKK6/c7v71NIP4Xr7nnnvSyJEj2932ohmiAn3crDN69Og011xzFc3WkOnbbLNNuvfee9PGG2/cqfHiRqA77rgjxTm5K1pPOc4DBw7Mrjl22223ht1INXz48Ky6/nrrrdcVdMYkQIAAAQI1Cwj21kxlRgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAzxSIkOJnn33W4zZumWWWSY899lhW0TQeM11ri6BGhDQef/zxtMcee6QI1bTXelqwubq9m2++eXrhhRfSUUcdlWK/am3zzz9/OuSQQzK/DTfcsKbFonpdZ9oMM8yQ9ttvvywkfvjhh9dVcXnBBRdMf/zjH7Nlv/71r9e8GZ3d5rIVvffee4XdZX2FC5V0rL/++lnw7cgjj0wRxq6nLbzwwlmAfcyYMWnppZeuZ1HzEiDQgwR64nkoboqJ6vFRYXWHHXaoK+C72mqrpYsuuiir1LvAAgvUJN0TDSLgfPXVV2fVXdddd92a9iNmmm666bKKx1EVNqrQ1/oUgs6e11ZaaaX0r3/9K91+++1pzTXXrGt7t9566/TQQw+lc889N8U5vZYW+1lP8Hv8+PHpgw8+qGXoyTJP7OfZZ5+dnYNj/9u7ESxvo+I6M54ycPPNN2efk3nnnTdvNtMIECBAgMBkFZimqdIm6xqtjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOECUZUvwhlRbTVCJX379s0CsbWEYvM2Jv4X0ldffZVVA/7000/Thx9+mN599930zjvvZBXrIgBRT4vxHn744Sys8sADD6Rx48alCIfE9g0YMCDNM888KYIUG2ywQVaprl+/fvUMnyZOnJhVx41Hb8fP9NNPnwVVYvzOGnz++ecpDCLIEvsfDssvv3yK8E09Lca566670o033piFlt96663MNbZ9yJAhmUEEZLfYYou0xhprdGi7i6roRdBl2LBh9Wxutm33339/ip9XXnklRRg2DOLYREg5fuLR5FHdrt6xqxsSn6vXX3+9+rbFa4SxBg8e3GJaPW9iW994443cRWabbbYurbwYZtdcc0165plnUgTv42fChAlp1llnzR7tHZ/3tdZaK2200UZp1VVXrStUlbtDJhIg0O0CEWqN89ygQYNSfH/FOTm+eztzHorzcPzEzTuffPJJ9j1cPQ9tu+22dVdYj2Wjwnj8vPTSS9m5OMaNa4b4XoqfqB4elWOH1nmTQhyAOL/Hd3oYRCX45gYdPUDVa5E4V8a2Vvf/o48+ym7+qXfcOJ/FeTgq2r722muZwRdffJFmmmmmSefiqE681VZbZdcT9Y4f3/Vvv/127mLhEtc89bSnn346Ow9H1eTY9zgXx+chPmNxvRNVhCOEHdcNHQ0Vx2eh6AaxuPmkdfB31KhR2ed6zjnnbPg1ZxznuDaoHue41hgxYkTNZOETx/bWW2/Nwr5xLKo/cS0a44VbXC9/7Wtfy87FcT7uqurGNW+4GQkQIECAQCsBwd5WIN4SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6A6BabtjpdZJgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBLAcHelh7eESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgWAcHebmG3UgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQItBQR7W3p4R4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBbBAR7u4XdSgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0FBDsbenhHQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFuERDs7RZ2KyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQUkCwt6WHdwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgS6RUCwt1vYrZQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBASwHB3pYe3hEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoFgHB3m5ht1ICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECLQUEe1t6eEeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgWwQEe7uF3UoJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItBQQ7G3p4R0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbhEQ7O0WdislQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0FJAsLelh3cECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEukVAsLdb2K2UAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEsBwd6WHt4RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6BYBwd5uYbdSAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAi0FBHtbenhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoFsEBHu7hd1KCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLQUEOxt6eEdAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgW4REOztFnYrJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBSQLC3pYd3BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLpFQLC3W9itlAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBLAcHelh7eESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgWAcHebmG3UgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQItBQR7W3p4R4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBbBAR7u4XdSgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0FBDsbenhHQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFuERDs7RZ2KyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQUkCwt6WHdwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgS6RUCwt1vYrZQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBASwHB3pYe3hEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoFgHB3m5ht1ICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECLQUEe1t6eEeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgWwQEe7uF3UoJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItBQQ7G3p4R0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbhEQ7O0WdislQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0FJAsLelh3cECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEukVAsLdb2K2UAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEsBwd6WHt4RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6BYBwd5uYbdSAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAi0FBHtbenhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoFsEBHu7hd1KCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLQUEOxt6eEdAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgW4REOztFnYrJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBSQLC3pYd3BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLpFQLC3W9itlAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBLAcHelh7eESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgWAcHebmG3UgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQItBQR7W3p4R4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBbBAR7u4XdSgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0FBDsbenhHQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFuERDs7RZ2KyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQUkCwt6WHdwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgS6RUCwt1vYrZQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAS4G+Ld96R4AAAQI9TeCTTz5Jxx13XLr44ovTiy++mL788suetom2hwABAgQIECBAgAABAgQIECBAgAABAgQ6INCnT580dOjQtOOOO6aDDjoozTjjjB0YpXgR/75cbKOHAAECBKZuga4+x07devaOAAECBAgQ6G6BaZoqrbs3wvoJECBAIF8g/tF1gw02SHfffXf+DKYSIECAAAECBAgQIECAAAECBAgQIECAwFQhsMYaa6RbbrmlYeFe/748VXws7AQBAgQINECg0efYBmySIQgQIECAAAECpQLTlvbqJECAAIFuFYhKvUK93XoIrJwAAQIECBAgQIAAAQIECBAgQIAAAQKTRSD+LTj+TbhRzb8vN0rSOAQIECAwpQs0+hw7pXvYfgIECBAgQKDnC6jY2/OPkS0kQKAXCyyyyCJp7NixvVjArhMgQIAAAQIECBAgQIAAAQIECBAgQKD3CAwbNiw999xzDdlh/77cEEaDECBAgMBUItDIc+xUQmI3CBAgQIAAgR4sINjbgw+OTSNAgEDfvn3Tl19+CYIAAQIECBAgQIAAAQIECBAgQIAAAQIEeoFAnz590hdffNGQPfXvyw1hNAgBAgQITCUCjTzHTiUkdoMAAQIECBDowQKCvT344Ng0AgQITDPNNBAIECBAgAABAgQIECBAgAABAgQIECBAoBcJNDU1NWRv/ftyQxgNQoAAAQJTkUCjzrFTEYldIUCAAAECBHqowLQ9dLtsFgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFeJSDY26sOt50lQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoqQKCvT31yNguAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBXiXQt1ftrZ0lQIDAVCjQ1NQ0Fe6VXSJAgAABAgQIECBAgAABAgQIECBAgMDUJzDNNNP0qJ36/O0netT22BgCBAgQINBRgelmX6qji1qOAAECBAgQINDjBFTs7XGHxAYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0RgHB3t541O0zAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjxMQ7O1xh8QGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9EYBwd7eeNTtMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQI8TEOztcYfEBhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRGAcHe3njU7TMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECPExDs7XGHxAYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0RgHB3t541O0zAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjxMQ7O1xh8QGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9EYBwd7eeNTtMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQI8TEOztcYfEBhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRGAcHe3njU7TMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECPExDs7XGHxAYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0RgHB3t541O0zAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjxMQ7O1xh8QGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9EYBwd7eeNTtMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQI8TEOztcYfEBhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRGAcHe3njU7TMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECPExDs7XGHxAYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0RgHB3t541O0zAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjxMQ7O1xh8QGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9EYBwd7eeNTtMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQI8TEOztcYfEBhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRGAcHe3njU7TMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECPExDs7XGHxAYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0RgHB3t541O0zAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjxMQ7O1xh8QGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9EYBwd7eeNTtMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQI8TEOztcYfEBhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRGAcHe3njU7TMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECPExDs7XGHxAYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0RgHB3t541O0zAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjxMQ7O1xh8QGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9EaBvr1xp6v7/MYbb6QTTzwxzTnnnGnw4MFp0KBBafrpp0/9+vVL0003XfY6zTTTVGdv6OtXX32V4ufzzz9Pn376aXr//ffTuHHj0ptvvpn69OmTDjzwwOy1oSvt4YN98cUX6dFHHy3dyllnnTUtssgipfP0pM6PPvooPfPMM6WbFJ+/+eefv3QenQQIECBAgAABAgQIECDQeYGJEyeWDjLttNNm/x5QOpNOAt0o8Nlnn6WmpqbcLYh/w4p/0+pse/zxx9Pzzz+fXnzxxfTSSy9lr+PHj0/xbzKzzz579rPQQgulddddNy233HKpq/7trLP7YXkCBAgQIECAAAECBAi0JzBx4meFs0RMoLP/jRX//fbwY0+ll15+Nb348mvZ60uvvJbeffe9yn9jzZLmmH1Amn3gbGnYwgukdddaNS25+LDC7dFBgAABAgQIECDQuwR6dbD34osvTr/97W975BEfMWJEWmaZZXrktnXVRk2YMCGtuOKKpcOvv/766ZZbbimdpyd1jhkzJq299tqlm7THHnukM844o3QenQQIECBAgAABAgQIECDQOYEPPvgg9e/fv3SQ1VdfPd19992l8+gk0F0CF154Ydp5550LVz/LLLOk+Jx3tMVn/4ADDkh33nlnzUNE0PcnP/lJOvLII2texowECBAgQIAAAQIECBDoCQIn/PHs9MujTizclEWHLZieuH9UYX97HTfecmc65FcnZsHe9uat9s81aI50yH4/SnvtvmN1klcCBAgQIECAAIFeKtCrg7299JjbbQIECBAgQIAAAQIECBAgQIAAgSlMIJ70VNYiZNuR9sorr6Sf/exn6Zprrql78bfffjt7ClXdC1qAAAECBAj6/nWbAABAAElEQVQQIECAAAEC3Sww7q3xpVsQlXQ70p58emz62YG/SbfdcU/di497a0Llab/lTxuqe1ALECBAgAABAgQITJECgr1T5GGz0QQIECBAgAABAgQIECBAgAABAr1JYK655ird3UGDBpX253XGY2F32GGHuqr0th4nnq6kESBAgAABAgQIECBAYEoTGFSpjlvW5pyj/psnJ078LG2700/T08++UDZ0ad96w1cv7ddJgAABAgQIECDQOwQEe3vHcbaXBAgQIECAAAECBAi0I/DZZ5+lBx98sHCuaaaZJq222mqF/ToIEGiswPjx49Nzzz1XOGj//v3TUkstVdivg8DUJjB48ODSXZpzzjlL+/M6Tz/99E6Fevv06ZOGDx+eN7RpBAgQIECAAIFeK/Dc8y+l8RPeLdz/BeYbkuYZUn7TVuHCOgjUKDDm0ScrlV8/K5x7qcWHpf79Zyns7w0dg9sN9g6sm+GY353eqVDvgNn6p+WXXaLu9VqAAAECBAgQIEBg6hMQ7J36jqk9IkCAAAECBAgQIECgAwL//Oc/08iRI0uXfOihh9Lyyy9fOo9OAgQaI3DMMcekP/zhD4WDzTrrrOn9998v7NdBYGoTGDBgQOkuDRxY3/90fvXVV9NBBx1UOmZ7nSuttFIlDNC/vdn0EyBAgAABAgR6lcDIHfZKTz3zfOE+b73lJumy84r/W6dwQR0EahR47/0P0irrbl069wlHH5D22WuX0nmm9s4I0Za1gQPK+1sv++gTz6QTTjq79eS63g9fa5U07bTT1rWMmQkQIECAAAECBKZOAcHeqfO42isCBAgQIECAAAECBOoUmHnmmdtdopZ52h3EDAQI1CTQ3t9be/01rcRMBKYggRlnnLF0a6effvrS/tadf/vb39oNx0dF3vXXXz8NHTo0ffnll+nll1/Oqtu//fbb2XDRpxEgQIAAAQIECLQUmHmm8uu29vpbjuYdgfoFavmM1TJP/WuespaYcYby/4aavl+/unboqmtvSF988UXpMv36TZfWG756isrdEyd+ll565bU0esxj6cP/x955wDlRtGH8FTl6h6P3Ir13qYKgFEFpIs0GKAKCVBUVAemCiEgRUDqoiIiggFQBQUSkIyC9Hb03Ef3yrF/OJLc7s5vkjtzd8/5+IbvT57+7x07mmXeu3zTyPVKdu4UpATKSBEiABEiABEiABOIRAQp749HFZldJgARIgARIgARIgARIgASsCWTMqN8G004a6xoYQwIk4ISA7nnTxTupi2lJIDYQCAsLUzYzkcNJ5/379yvLy549uyxYsEDKly/vle727dsyd+5cmTJlijz++ONecTwhARIgARIgARIgARIQCQ9Pr8SQUROvzMxIErBBIGHChJI2TWq5dPmKZWrehyJhYWqpBES4Tmz/waPK5IUeyitfzhgr+Pa0a9duyIx5C2Xm3IVSu0ZlzygekwAJkAAJkAAJkAAJxGMC6rfVOA6mYsWKMmjQIMmUKZPxyZAhgyRJksT1Eh9mfDAhYrXVxcaNG6VVq1aWhLAl6I4dO0zj//nnH/n777+Nz927dwUTIteuXZOzZ8/KmTNn5Ny5cxIfJyhxHSZPniyHDx825YbAfPnyWcaFYkSlSpVk5MiRcunSJcvmVahQwTKOESRAAiRAAiRAAiRAAjFHIDw8XFkZxgepU6dWpmEkCZBA8AjonkldvG9LUqRIIX369BGVmLFgwYK+2XhOAiFDwOo3KncDgy3s7devXxRRL+rCb2fPP/+88XHXzW8SIAESIAESIAESIIH/CISnT/vficlRBk28SRYGkYBjAuEZ0iqFvRlc8fHddGOsMIfC3gN/HFEiHdK/RxRRLzKkTJlcOndobXyUBTCSBEiABEiABEiABEggXhGI18LeqlWrCj7+WEREhDIbBgLYppDmjED79u2dZQjx1NiyslevXiHeSjaPBEiABEiABEiABEgABJInT64EkSxZMmU8I0mABIJLQPdM6uJ9W/PAAw/I8OHDfYN5TgKxhoBu0hleuZyYSuSOctq0aeOkOKYlARIgARIgARIgARL4P4HkyZIqWSRPro5X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XOrXry/du3eXbdu2BbV1JUqUkEmTJkmlSpWCWi4LIwESIAESIAESIAESIAESIAESiLsEunTpIjdv3oyxDlarVi3G6mJFJEACJEACJEACJEACJBBfCTz44IMy+aP35JHqFeXNAaPl1OmzQUWRIkUyGdivm3Tu0FrgdIb2LwFwf63zczGKo16d6jFaHysjARIgARIgARIgARIggVAm8MA/LgvlBrJtJEACoU3g77//lilTpsj48eNlx44d4u+flNSpU0uLFi2kXbt2UqVKFXrp/f9lt7M62V/moX1nsXUkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEPcIxORvvnbquntxT9yDzB7FWQI3btyUEWOmyLjJs+Tq1esB9bNMySLSpmVjeaZZQ8mQPm1AZTEzCZBAaBAIS1dE2xDOq2oRMQEJkAAJkAAJkECIEKCwN0QuBJtBAnGBwJkzZ2TFihWyatUqOXnypFy6dEkuXrxofN++fVtSpEghqVKlEoh406RJI4UKFZIyZcpI6dKlpWjRooItlWjeBOz88MoBqDcznpEACZAACZAACZAACZAACZAACZAACZAACZAACZBAqBKIyd987dRFYW+o3ilsl4rAvXv3ZPOvO+WH1Rtk9dpNcuzEabl4+bJcvx51B48kSRJL6lQp5aF8uaVUicLGp1L5UvJQ/tyqKhhHAiQQCwlQ2BsLLxqbTAIkQAIkQAIkYEmAwl5LNIwgARIggftPwM4PrxT23v/rxBaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQgB0CMfmbr526KOy1c9WYJrYQ+Ouvv+TS5atyy+VsJlnSpC5Bbwo6lYktF4/tJIEgEKCwNwgQWQQJkAAJkAAJkEDIEEgYMi1hQ0iABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjADwIJEyaU8Azp/MjJLCRAAiRAAiRAAiRAAiRAAiQQWgQShFZz2BoSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESiJ8EKOyNn9edvSYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggxAhT2htgFYXNIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgATiJwEKe+PndWevSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEQowAhb0hdkHYHBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggfhJgMLe+Hnd2WsSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIEQI0Bhb4hdEDaHBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggfhKgsDd+Xnf2mgRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIMQIUNgbYheEzSEBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEoifBCjsjZ/Xnb0mARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIMQIU9obYBWFzSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAE4icBCnvj53Vnr0mABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEKMAIW9IXZB2BwSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIH4SYDC3vh53dlrEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBECNAYW+IXRA2hwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIH4SoLA3fl539poESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDECFDYG2IXhM0hARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARKInwQo7I2f1529JgESIAESIAESIAESIAESIAESIIH/sXcfYFIUWxvHz5KTkoOCSFIUMYAIIiogijknzDlexZwQAcGcvQbMGDAjZjGRTJgAQURFUVBylIwg8M3bfsOdmZ2unp7Azu7+63n22Zmu6urq3/QsdPXp0wgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECeCRDYm2cfCMNBAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEECidAgT2ls7Pnb1GAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEMgzAQJ78+wDYTgIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAqVTgMDe0vm5s9cIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAnkmQGBvnn0gDAcBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoHQKFGyIlNK56+w1AgggkP8CBQUF+T9IRogAAggggAACCCCAAAIIIIAAAggggAACCCCQNYFsXbpjfjlrHwkdIYAAAgiUEIFs/RtbQjjYDQQQQAABBBDIYwEy9ubxh8PQEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRKjwCBvaXns2ZPEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQTyWIDA3jz+cBgaAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEDpESCwt/R81uwpAggUQ4GyZcsWw1EzZAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIF0BLI5J5zNvtLZF9ZBAAEEEEAgnwT4dzGfPg3GggACCCCAAAJBAgT2BglRjwACCBShQJMmTYpw62waAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAYFMKZHNOOJt9bUoDtoUAAggggEAuBPh3MReq9IkAAggggAACuRIgsDdXsvSLAAIIZEHgpJNOykIvdIEAAggggAACCCCAAAIIIIAAAggggAACCCBQHASyOSeczb6Kgx1jRAABBBBAwCXAv4suHeoQQAABBBBAIN8ECjZESr4NivEggAACCPwrsGrVKuvWrZuNGTMGEgQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIESLNCxY0cbPny4Va5cOSt7yfxyVhjpBAEEEECgBAhk+9/YEkDCLiCAAAIIIIBAnguQsTfPPyCGhwACpVtAE7iayO3Tp481b97cypYtW7pB2HsEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKAECWjOV3O/mgPOZlCviJhfLkEHCruCAAIIIBBaIJf/xoYeDCsggAACCCCAAAIhBcjYGxKM5ggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCORCgIy9uVClTwQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBEIKENgbEozmCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAII5EKAwN5cqNInAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACIQUI7A0JRnMEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRyIUBgby5U6RMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIGQAgT2hgSjOQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAArkQILA3F6r0iQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEgBAntDgtEcAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBXAgQ2JsLVfpEAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgpACBvSHBaI4AAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAuBAjszYUqfSKAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBBSgMDekGA0RwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIBcCBPbmQpU+EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQCClAYG9IMJojgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQCwECe3OhSp8IIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgiEFCCwNyQYzRFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEMiFAIG9uVClTwQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBEIKENgbEozmCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAII5EKAwN5cqNInAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACIQUI7A0JRnMEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRyIUBgby5U6RMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIGQAgT2hgSjOQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAArkQILA3F6r0iQACCCCAAAIIIIAAAggggAACCCCAAAII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BBBAAAEEEEBAAgWRFMcboEAAAQQQyE+BfHxETH5KMSoEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDgX4F8uM6ayhjWLprMR4YAAggggECxFyhfq1XgPhCmGkgU16BM3DveIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECRCBDYWyTsbBQBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIF4AQJ74z14hwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQJEIENhbJOxsFAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgXiBcvFveYcAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECwwMdvPR3XqKBiDStToXrcMt6EEyjYECnhVqE1AggggMCmEigoKAjcFH/GA4logAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACpUggH66zpjKGtYsml6JPhV1FAAEEECgtAgWV6ljZynVLy+7mZD/L5KRXOkUAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBUALlQrWmMQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCDgF+vbtG1e/Ye0K2/DPyrhlvEEAAQQQQAABBJIJFEQe4b4hWQXLEEAAAQSKXiCVx7PwZ7zoPydGgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAC+SOQj9dZ16+ab+tXL8gfJEaCAAIIIIBAjgQKKtWxspXr5qj30tFtmdKxm+wlAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAC+S1AYG9+fz6MDgEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECglAgQ2FtKPmh2EwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgvwUI7M3vz4fRIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgiUEoFypWQ/2U0EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgSwKlK/VKrC3DRs2BLahwf8EyNj7PwteIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggUGQCBPYWGT0bRgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA4H8C5f73klcIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQqUCXLl3iutiwfq3ZujVxy4a/82zce94ggAACCCCAAAISKNgQKVAggAACCOSnQEFBQeDA+DMeSEQDBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBAoRQL5cJ01lTGsXTS5FH0q7CoCCCCAQEkVKF+rVeCuEd8USBTXoEzcO94ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQJEIENhbJOxsFAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgXgBAnvjPXiHAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIE/HKo0AAEAASURBVIBAkQiUK5KtslEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgWItsPce7eLHX7aCFZQpH7+Md6EECjZESqg1aIwAAgggsMkECgoKArfFn/FAIhoggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEApEsiH66ypjGHtosml6FNhVxFAAAEESotAQaU6VrZy3dKyuznZzzI56ZVOEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCCUQLlQrWmcdwJz5861hQsX2mabbWa1atWyqlWr5t0YGRACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQLBAsQrs/fvvv23gwIHmeuz8NttsY4ccckjwnhfDFuPHj7fHH3/cfv/9d5s2bZpNnz7dVq1aFbcnFSpUsGbNmlnnzp2tS5cu1rVrV6tfv35cG94ggAACCCCAAAIIIIAAAggggAACCCBQHATmz59v48aNcw61bdu2Vrcuj3VzIlFZZAI///yzN5frN4Btt93WmjZt6led0vKRI0fa559/7m1H88b6+fPPP23dunVWs2ZNq127tvez2267eXPGe++9t5ckIqXOaYQAAggggAACCCCAAAJpCyTGtqxfNd/Wr16Qdn+siAACCJQkge++/9HmzVvou0s7tW5pDeqnP+env8HvvD/Sxk+YbNP+mGnTIz/T/phlM2bNsTJlylitmtW9n3p1almH3Xa2zp3aW6fd21q1aiTV9P1QqNikAgWRg3jDJt1iBhsbO3astWvXztnDjjvuaBMnTnS2KW6VCuTt3bu3vfjii86g5mT71aNHD2+9ZHUsQwCB/BcoKCgIHGQx+jMeuC80QAABBBBAAAEEEEAAAQQQQCBWoG/fvta/f//YRYVev/XWW3booYcWWs4CBPJBYPPNN7dly5b5DuXOO++0K6+80rfeVaH58muuucaGDx/ualaoTvNN3333ne20006F6liAAAIIIIAAAggggEBJEcjH66wE9paUo4v9QACBTAXmzltgjVt1sfXr1/t29dKge+3ow/f3rXdVjBg9xq7rd7eNiwT1hilly5a12b98ZjVrVA+zGm2TCBRUqmNlK6cfmJ2ky1K3qFhl7G3YsGHgB5RKm8BO8qjBs88+a+ecc46tWbMmrVHtvvvuaa3HSggggAACCCCAAAIIIIAAAggggAACCBS1QLpzYkU9braPQFSgYsWKzsDeOnXqRJum/Fs3eZ9xxhmmueN0bvjWU9/05DsKAggggAACCCCAAAIIIIAAAgggUBQC1apWcQb1akx1atcMPbRVq1bbMaf2tA+HfxZ6Xa2wRYO6BPWmJcdKuRAok4tOc9VnvXr1rHz58s7uGzVq5KwvTpUzZ860iy++OO2gXu3rPvvsU5x2mbEigAACCCCAAAIIIIAAAggggAACCCCAAAIlRqB+/frOfalbN3zmkkceecSeeeaZtIJ6NRglg6hcubJzXFQigAACCCCAAAIIIIAAAggggAACuRKoGgnsrVLFPTeRTmBv/9sfSjuoV/vada8Oudpl+kUgtECxythbpkwZU3CvAl79SoMGDfyqit3yCy+80JYuXZr2uDUp3Lp167TXZ0UEEEAAAQQQQAABBBBAAAEE8l3gzTfftB9//NF3mG3btrXu3bv71lOBAALZFXjwwQdt+fLlvp0efvjhtv322/vWU4FASRPQfPYPP/zgu1thA3tnzJhh11xzjW9/qVSQDCIVJdoggAACCCCAAAIIIIBAcRSYNXuePffym75DLxuJO7r0wtOsXLliFS7luz9U5KfAt+Mn2fDRY3wHV79ubTv9pKN860tLRb06tWzaH/4xgHUj9WHKuAmT7Z4HB4VZpVDbrnvvXmgZCxAoKoFi9y9VtWrVnFZB9c6V86jyww8/tLfeeiujEXXp0sUKCgoy6oOVEUAAAQQQQAABBBBAAAEEEMhngRtvvNHGjx/vO8T99tuPwF5fHSoQyK6AAnr19ClX+eeff6x3796uJtQhUKIENttsM+f+BNUnrnzppZfasmXLEheHek9gbyguGiOAAAIIIIAAAggggEAxElAwZe/+9zpHfFD3ztZquxbONlQikInAsy+8bgOffNG3C2WqJbDXbLNqVX2NVBFUn7jyBZf2sfXr1ycuDvWejL2huOIa97/twbj3BeWrWkG5KnHL+vXrF/eeN26BYhfYW7FiReceBdU7V86jyq+//jpwNHvuuaddccUV1qRJE1u3bp1Nnz7dPv/8cxs0aJAtXrzYmKANJKQBAggggAACCCCAAAIIIIBAMRcIynQYVF/Md5/hI5BXArrhvlKlSrZ69WrfcfGd9KWhooQKVK7sfqxkhQoVQu35iBEjAtsff/zx1rlzZ6tTp47NmzfPpk6daq+88or3JLwqVapYhw48VjIQkQYIIIAAAggggAACCCBQLAXq1q4ZOO6wWUADO6QBAgkCdQIyzaZynCZ0WSLfVq5cyblfFSqUd9bHVi5dutyUsddVykQydp9x8lHWrs2OVn3zajZ77nyb8us0e2XoMFv81xJr3rSxNWrYwNUFdQ6BAXc87Kj9t4rA3kCiuAbFLrC3bNmycTuQ+CaoPrF9vr6fMmWKc2hHHHGEDR06NC4j76677mpHHXWUDRgwwKvbd999nX1QiQACCCCAAAIIIIAAAggggEBxFwgKEtQj0CkIILDpBPSd/PPPP303yHfSl4aKEioQ9HjXMIkqFixY4CV0cFENHjzYTjrppEJN7rjjDm/OWMkhypdP/cJYoY5YgAACCCCAAAIIIIAAAgjksUBQQKWeel27Vo083gOGVhIEgoLH69WtXRJ2M+N9KFfOPwZQQbhhYgCnTJ0WOJ6P337a9urYrlC7OwdcbS+8+k4kBq9QFQsQKFKBYhfYqy+uqwTVu9bNp7qgwN5evXrFBfXGjl1ZF04++eTYRbxGAAEEEEAAAQQQQAABBBBAoEQKKBuhq9SuzSSpy4c6BLItoO+kK7A37HfykEMOsQYN3JkyWrdune3doD8EsiYQNF8dJsg2aM64TZs2SYN6tTMKMD7uuOOytl90hAACCCCAAAIIIIAAAsECo0aNimu0/u+/bMOaJXHLOu/ZPu49bzITqBOQsbdmjc0t6DwtsxGwNgJmdQKCx2sF1JcWwzIF/jGA5cuHC2n8JSCw97CDuiUN6pW1MgefdeoxpYWd/SxGAuG+BcVox4r7UF2TtJrsbdeu8B0ExX2fGT8CCCCAAAIIIIAAAggggAACYQWCHnEeVB92e7RHAAG3QNB3Lqg+sfdOnTqZfigIFFcBZYNylVDZZwKe8rb//vu7NkUdAggggAACCCCAAAIIbGKBrl27Bm5x7aLJgW1okLpA5UoVnY0VwEdBINcCQcdZ0HGa6/HlS/+uOZMw8yXan19+nebcrf277emspxKBfBTwD33Px9GWkjGtX7/e+Ui1+vXr+2brLSVE7CYCCCCAAAIIIIAAAggggAACnkClSu7J+KB6GBFAILsCQd+5oPrsjobeEChZArNnz3buUFB2a+fKVCKAAAIIIIAAAggggAACJUCgUkBgb6WK7sDfEkDALuSBQNBxFnSc5sEuFLshzJ473znmBvXdT/5zrkwlAkUkQGBvEcFnstlatWplsnpa6yrYeMOGDWmtW9xX0n5r/ylugXXr1rkbbMLafBrLJtxtNoUAAggggAACCCCAQKkUCAoSrMhkfak8LtjpohPgO1l09my55AsEzc/WqcNFqpJ/FLCHCCCAAAIIIIAAAggg4BIICqisWLGCa3XqEMiKQMVK7uOsYgV3fVYGUco6CZozqV2rZikTYXdLgkC5krATYfYhKECzTJnksc5Lly61L774wpQVYe7cuTZ//nxT2u969ep5Py1btrTddtvN/NZPHOO4ceNs1qxZtuWWW5oyKVSpUsV04aNC5I930BhjA03/+ecf+/vvv70fjXHBggXej/rZd999Ezcb+F4BkdrPd999177++mtvX+fMmeNlEFYK9M0339wb75577mmdO3e2Ll26WKNGjQL79Wvg2ldtL1nada0zZswYmzp1qmc4c+ZMW7FihW222WZWs2ZN23rrrU2fxw477GDVq1f323TS5ZMmTbJ33nnHPvnkE6/v6GetbVarVs1q165t7du337jv22+/fdIxJu08YaFr39XU71jSZ6T9/+OPP7zPR2Ncs2aNNzYdj1tttZXtvffe3jGVsMmsvNWxP3z4cPv444/t+++/974LWrZ8+XJvmzqm9dOwYUPr1q2bHXnkkZarYHQd78OGDbP333/fOx5koZ9Vq1aZLt7XqFHD9BnpWNXP7rvvbmEf+ZkVNDpBAAEEEEAAAQQQQACBjAR0/qzzHp1/lisXP5WR+D5xQ+XLl09c5L3XeaTOZZo0aZK0Pp2F6m/atGne+aTGrG3oPDr2XDXseerKlStt7NixNmHCBNM5q86Dli1b5p2DyaRq1are+bDOiTW/0KZNG2vbtq1tt9123rxFOvuR7jraZ/1Ez83UT926db15k2bNmnmv0+3btZ7mBXSeOiXyiPqFCxd6Rn/99Zc3x6LzeP0o2K1jx46m+QzNmeSi/Pjjj/bdd995n9X06dM3fk46DrRNfUb60TGgOQt9Tvq8dIzkomieaNSoUTZ69GibMWPGxvN3zSvoaVDR83fNoRxxxBGeUarj0DGo/Ur2VKl0v5OLFy+21atX2xZbbJHqMLLWTt+lzz77zPvRPNi8efM8L41H8yw6fqM/zZs3t6ZNm/rO22RtUD4daf5Fx1f0e6bPQvMf+iz0N2DbbbdNe67KZ5PeYll8/vnn9tVXX3k++q7pR3OT+hun75nmf7T97t27e2Nx9Vfc6jQHpu94rLu+Q7HHhT6HbBQdfyr6+5lsbtS1Db/HVOp7H/3MNGeXq787rrFRhwACCCCAAAIIIIAAAghkU2BOJDtnlcqVI+c31eK6LVeubNz7xDflE+YWo/WK35gzd4FtVk1zbVWji1P6vXTpchv73SSbMOlnm/zTr7Zo8V+2fMXKyPzdClu3bn1k/q7Kv/1G+m64ZX1rs9P21mbnVtai2dahz/tSGpBPo3nzF9q0P2ba7DnzbObseZG4itVWffNInE2NzW3rxg1t2+ZNCnn6dFVo8cqVq2xWpN+58xba/AWLvPmC2rVqWN06ta1e3VqRn9qF1tkUC2bOmmvvfTg68tn8FPl855sMFi76y8qXL2c1qm9uW25R3/bao53tHflptV2LUJ/HkqXLvP1t3GiLSLxXfCbocmXj57AT91XbT1Y0RzVrznxrFDlOgubYkq2/qZfpezP2ux9s6m+R+KWI7bz5CyLze39HjvMG1qxJZE6taeRn60aReKtw3ym//ZgVOW4rRYKma9UMPwfjN2eydu1a75hYtHiJN+bEz9JvLCxHYFMIFESCRItVGtZ27dp5F7T8cB588EH7z3/+k7T61VdfteOOOy5pnRbqYt7vv/8eV//mm2/ac8895wW6agLbVRRUeeihh9q1115rLVq0cDW1Sy65xP773/8622RSqYtVCtBNtehiz+23324DBw70gnhTXU/tFCx5xx132F577RVmNfvll1+8yX6/lXSh5IcffvACNNVGFy0ef/xx7/NQUGtQSdVAFyCefPJJu+2227wLsEH9xtbrmLnpppvsxBNPDPUPvAJPFcztKrpgqwt90TJx4kR74okn7JVXXvEuIkSXJ/utIPF99tnHLrroIjvwwAOTNQm9TMHoN954o7399tuhsjfrIrqCzHv27GkHHHBA6O0mW0FB59dff72NGDEiMBA+dn25XHDBBda7d++cBRvHbi8br1O5gFPM/oxng4U+EEAAAQQQQAABBEqZwGWXXWb33XefF6iqQCcFs2oiTv9fXrRokReA50eiQDcFUkZvktXkqM6BFfipops7Dz744I2r//zzz3b44YdvfJ/4QjcPvvbaaxuD+hR4q/dPP/20jRw5MvB8SX2/8cYbid0Weq8gQ50Dqm8F8oUtCoI+//zz7ZxzzvECa1NZf/z48XbCCSf4NtVkss5VY4vOz1944QXvR4FvfkWflW6I1ryJxpVpVkmZ6JjQthVsl2rRTbtdu3b1PuPTTz894+BnBfnpc9LckY6dsEXnzMccc4x3/r7HHnuEXT1pe92Ie+utt3o3LWvOI5Wiz1bzCPr8TznllEAXzTXoJlvdVKvvpM63dYOyPmcFWruOWQVCar/1nVSwoW5Y1/dY3yXdjKu5OQWpRsvzzz9vAwYMiL4t9Fvb/OCDD6xx48aF6oIW6PuvuTAFQGv7qZZtttnGrr76ajv11FPTChQ/5JBD7Ndff/Xd3C233GJHHXXUxnoZvfXWW97xrhuc9d6v6G+e+tfYws7VJetTtvfcc493PAXNjUbX12eyyy67ePNA5513nncTfrSuOP3+9ttvvTlDJUD4888/A4feJDJPeN1119kZZ5zhHePRFU477TR79tlno28L/dZNIdG/ibqYpM9Q3wl9TxQsrO+Xvmv6dy9680KhTmIWKFhf369oMgh9bkuWLNn475Pmuw877LCYNXiJAAIIIIAAAggggEDJFNC5SVDJ9XXWVMawdtHkoGFSnyCwYOFia77zvpFz+VVeIGqNyE3TFSqUj8xN/PuZT/l1WsIa/3urdk0iQawq69f/OzexMhLgqj41T7FP5472wetP/m8Fx6v3P/rEnn7hdXt72IhIUoK1jpbJqxTYe8HZJ9hpJx7pBdgmbxW/dPzEyXby2VfGL4x5t0skaPj5J+7euETBxUPe/MCefeEN+3TMtxuX+7044ZhD7NnH7vCrjls+9fc/bOhbH5ocPv9qvOcX1yDmTfOmje2wg/axIw/tbh3b77Kxpt8t/7VX33h/4/vYF/r+PHxvv0jQ7W6xiwNfaz7siWdftSeeftUL6A1c4f8bKBD5xGMPteuvusD0OqgMiYz7hDMv95qpvYLCNcem43BVJLj1zxmzfbtQQHqDev8+dUfHoeYDVkSOZx2HKtdedq4NuOFS3/WLumLE6DE2+OW3bFjks4+O2TWmHbZvYb2vutCOPnz/uNiqfQ4+1fe4rFKlsi2ZMXZjtwrSbrnr/pH5jjXe911B6QrCVfZjmc+ZtyAy7+8/j67jaZvmW3vf+78j1wj0nV0Zid1atmzFxm2M/fR122mHlhvf8yKcQPlarQJXyPW/u4EDKGYNSlVgrzKUKMOsX9HkazSwVxOqZ511lhfE6Nfeb7kmWq+66irr06dP3CRubPt8Cux96KGHrF+/fl5Gm9gxhn2ti5MK8FVmjlSKLqIqo4erKFuLJrB1IVOT4spCkmq58sor7c4773Q218WJSy+91H766Sdnu6BKZdm5++67ncdXYh/K0uO60BUN7NV/HnVBTkG1qV6Qi92WJur1GaebWVkXEnQheOjQobHdpvX65JNPtvvvvz/toFplftIFfQU3Z1J0TPXq1csLsM9VpqZMxhe7bione/zDFyvGawQQQAABBBBAAIGSKBAN7M3Fvj311FPe+Wa0b2U2VYZOV9HNmgq0+uabb+zoo49OKeAr2p/OQe+9997o20K/FTx2+eWX25AhQwrVpbNAgay6SbZHjx6Bq+vcWIHLfkUT05pkVtF5iM6DddOlgqXDFM0F6CZZBfj6Pa3G1d8jjzzizWMoqDaTomy5CsrVOX3YonN1nWtr7kcBc9koumn4scce8wLX0+lPgdkXX3yxl1U1nfWj6+y6666m78VOO+0UXVTot9roBuBcFAW86mbvaLnrrru8ebbo+2S/FVTeunXrZFVJl3300UfeTb+6cTiTosynmn/SvIluOEi16ElLn376qW/z2L9Lcj7ppJPSmrvS917fU2WWDVtkqr9Xuqk6kyKXm2++2Ts20/m+Z7LtdNfV/LDmjV5++eWNwbBh+lLwet++fb3PTcG4YQJ7U0kGEGYsydoS2JtMhWUIIIAAAggggAACJVEgH66zpjIGAnvDH33T/5xpLXbeL/yKKayxY6ttbdxn7pvyf5rym/W8+iYb+cmXKfQY3KRO7Zr23GN32r5dg2/61rZ33P0Q30517v33gn9vzP/sy7HW4/TLIlllF/i2T6zodcX5duP1PRMXx71XgGX/2x+0p59/PVQitmgnRx3W3e6//XprUL+unX9pH3vyWf950Htuvc4uPu+U6KqBv99452PrdePd9svU6YFt/Roo6PbqS8+xS84/1Qsc9WsXG9jr1ybd5WeecrQ9er//je7p9pvpehN/+Nmu6XOnfTwy9USTsdtU0Gy/XhfboQfu4y0OE9j7489TbaeOh8Z2l/XXBPZmRjr6s/i51oKKNaxMhepxnbriNuMa8sYTKFOaHDTZnkrRxLouXigzaTpF2RB0gUpBjLrQk69FF+MULKusrnqUZ6ZFk8Lt27e3L79M7T8vCq5UJpagouyqyl4TJqhXfe6///7OrpUx+aCDDkrrwkhix7rIosw2yvybaknleFSAuf6o3XDDDWkF9WosyujSuXNnL2NOqmOLtlNwsT7TbAT1qs/Bgwdbq1atQmWTjo5FF5Q6dOiQcVCv+lNQuTLrHHnkkc4sN9Ft8xsBBBBAAAEEEEAAAQRKj4AyJaYSfKbzP2XDTCWLY6ye61xV8xB6cku2gnq1Xd1QqiysV1xxRewwkr5O5TxVK86ZM8d7Motuag4b1Kv1dROvnrZ09tlnhwqaUzCxbpTWk1gyDerVOBQIq3NeBR2GKfPmzfPO1TWWbAX1avvKPqysxgouD1tefPFF69SpU8ZBvdru2LFjTU/MCusSdsyptk/luNT3NpWixwPquO3evbtlGtSr7Sk7sW480JO79NSpVEsq+6S+FNSsJ2Wle0P6Sy+95B3j0UQGqY7v888/tz333DPjoF5tb8WKFV6AsDJSZ2P+MdV9SLed5jf1d1h26d5I/dtvv3nBvJp31P6nciE/3fGyHgIIIIAAAggggAACCCCAwKYVGDT4NWu715FZC+rV6JXx9KBjzrF7HhwUuDNbNqgX2EYNHnxssO176Omhgnq13n7dOumXb3lpyLu2XbsD7KnnXksrqFcdK8tv6w6HpGQYzWrrO6D/r9A5/NU33GHHntozo6Bedaesr73732ud9uuRUjbaoLGVlPpHn3rJdut8dNpBvXJQYPBRJ11kZ1xwrRcDlUJi9ZLCVyr2o/Oe7S3uZ689vHl0xb1Ff0oFRBZ3slQF9qaSnUIBmnoEpy5SZVqUVVSZUvKx6BFs2s+nI48KzWbRBS1dpPzii9Tuzthiiy2cm9fFzHQuJFWpUsX5uEFdxNEFOF3QyVbRfxSUoUWZkFIpQcejLr7q0ZZ6/GqmRRcU9t1Xj6JI/bGSEyZMsI4dO9rUqVMz3Xzc+rr4qkevhnlU6ieffOJdUErn4mbcxhPevPfee3bEEUdYqo+STFidtwgggAACCCCAAAIIIFACBZSVNvpIdL/dGzlypHf+pxt7wxRl+dWNl8nKc889552fhL2pNVlfyZbdc8893lN2ktVFl+nJMvpxFd0oqaDITLN4ahuDBg3yAv5c24utUzCwbtLNZtEN2bqhWEF8qRSd0yrQMhvn6sm2p3PlQw45xPmEn8T19PQkZftVps9sFd0MLpfbb789W12m3U9QEGz58uWtdu3agf3ruyVbBctmu2gesVu3bikH4Abtk8anpAGav4pmyU53zAo+1s3oqc51KqhX3/GlS5emu8mk63311VfeTQbZnItLuqEMFiobuLKwZ+u79OGHH3pze6ncLJLBsFkVAQQQQAABBBBAAAEEEEBgEwnccd8Tdm7PGzI+V082XMWbKBPqC6+6ExAqm2zlypWSdbFx2bsfjLLLrr0ldCJC9b17u5039pP44ua7Btop514Via8INyea2I/eL1m6zI46+SKb8L376dr16tVJtnrcMiUeOOHMy+3eh56OW57pGwWh7nf46TZ/waJMuyr2698w4D676Mr+WYuxGvzyW3ba+ddYxUoVi70NO4BALgVKVWCvgj0rVvT/ozBt2jRvsjWbF9EeffRRU1BlvhU9Sk+PHcxF0cS/gnuVYTWobL755s4meixnOkUXSv0+awUz5+Iijsap/2ydd955pkw5QaVWrVrOJscee6yXJcfZKESlsrvoomkqRdmTjjrqqFAXElPpN9pm0aJFdsABB9isWbOii3x/z54928vYnO0LStENvv/++yZrCgIIIIAAAggggAACCCAQFahZs2b0ZdLfp59+elqZHJXhN9mTaxTwpuy1uQ54u/76601zH67iCmr+559/7LDDDkvpfN+1jdi6Bx54wCZPnhy7KOlr3UA8cODApHXZWCj/oBtQFQSsm0PDZj8NOz7daHvnnXemtJpuWL3uuutSaptOI/WtoPOiLK5jUuPS3FJQRlTN1+jJWsOGDcvZrijou2vXrjZlypTAbQTt01NPPeU9vSmwoxQb6HuvAPCgor9BF154Yagbw4P6jK3/+OOPrW/fvrGL8ua1nnilbODZfvqangyX6nxc3mAwEAQQQAABBBBAAAEEEMiagM6BYn/69LrSbrj6wrifrG2MjnIq8PawEXZ9/3tyug11fvFVA7ygV9eGatbwj7PRuf15l/Rxre5b13WvDqakB8nKfQ8/Y/1ueSBZVdrLli9fad+On+Rcv1bN6s56VV7V+w577c0PAtul02DS5F9s38NOD/xM0um7uKzzwKPP2W33Ppb14b4ydJh9NOLzrPdLhwiUJIHkf5FL0h4m7IuCe10ZdfQ4RVfRP2LKXqPAx1SK/tFUVpwHH3wwleabpM2rr75qCjgOKtrXtm3b2o477mjbbLONKSuPLnLpgtsvv/ziXF3ZZhU8PHz4cGc7ZStylXQn0/0ebarg1osuusi1yY11euzeTjvtZK1atfIm9bWu9n/SpEnOSX5dLNJjGJUFxpXpSMeiq6TyOFcFB+tzSfXir45FXaRwZQqJXuxKJSBd/ejRjHvvvbeX0eqPP/7wgpH1ONOgQFy1PeOMM+yDD/z/g6X9Oumkk2z+/PkuKq+ubt263qNCdbwqU4/Gr89LF0SDHo36zjvv2Ouvv25HHnlk4HZogAACCCCAAAIIIIAAAiVfwO9G0eieB80dRNsl/k52rqrzHp2nKbNEUNE5qtpuv/321qxZM2vQoIEpmFDnj0OHDvXO9V03KyswV+eFrqy3VatWdQ5DQWrZLDoHvfvuu+3JJ590dnvttdc661Wpc2QFXbdp08b0lBw9nUVPfpGN69xT665YscL69OljmjPxK8rm+eWXX/pVb1yuuQDd9KubjvU5NWnSxJuL0ljGjh3rfQZBN0PrM9I+JwsEj25I570KVk1lTkCBr8o0vO2223pB6TpX1vxOUDZYfT5nnXWWNz+keZKiKEHHZND8isZ8yy23mAI3Uy2a72jZsqU3/6M5wFTmJdS3suIquFfHyVZbbeW7uaB9ykVGaD1hSsd4jRo1fMf1/PPP28SJE33rVaFj6aCDDvKeBLb11lub5vZ0U7aObQUkB83BKGhd2bf19ytfirIan3nmmaGHIwt9RygIIIAAAggggAACCCCAgJ9Av3794qrWr5pv61cviFvGm/wXWLlylfW8+qaUBtqx/S525inH2DbNm1izJltZ7VrVbfbc+Tb9z1n20pB37dkX34jME/nPAy5dutweG/SyXXXJ2b7bq1Sxom+dKubOS+8Y677Pnkn7/fKbCXZdv7uT1iVbWKFCedtph5a2bYumNmvOPPs+kvl24aK/kjUNXFYlIDvxm+9+bA8/8UJgP2pQo/rm1nr7baxZ061sXiQL708/T/U+l6Bz+8k//Wq33PWI3d7/qpS2U5IaTZj0k13b966StEvsCwLFSqDUBfbq8Xxhiyaor776ai8ri4I8dYFPmUY1Sa/lU6dOdXaprAwDBgyw2Iw/mgBX8KMuNNWvX980oa9+9aN/NHr16uXbpya+L7nkEq9ebRX8qotVunini4u6qHfooYcmXV8XqlLJgtupUycvE46CJJOVIUOGeAGy2pZf0WM53377bd+xaD1XgKlfv9Hl+iybN2/uXfzUBYTYx+Qlu1iq9bTvMnCVpk2bmjIGHXzwwUmb6UKFLmrpIphfkcttt91mN998s18TS+dYVGd6JODFF1/sBR3rmNLn/u2333oXZt944w3f7alCF/3URtl4/Yo+M2X8CSq77rqrd8FTXolFFwb1uMj7778/sSruvR5JqGw5Bx54YNzy6BtdENIjbl2lQoUK3vdQ35lkFzx1QUljeeKJJ5wXW/Rd1meu/igIIIAAAggggAACCCCQXwLRc/FGjRp559E6T9f/3XVD6ptvvukcrII8Gzdu7J0PKABSAbS6EVGBXDqXTFb8MlMka5tsmV+wV7Jz1ZdeesmbH0jWT3RZixYtvHO+ZOdOMtFPx44dTRl5FVT43XffRVct9FvnYa6S7jnRfvvtZyeeeKJ3rqpgvx9++MGUifi+++4LfFqLggl1/uwX6KcbQ4MCis855xzvHDTZeeG5555r33zzjfd0IdeN2goA1jGxxRZbFCLSnEPixbjERprjUBYezdlUrx6fTUTBpzqH1zyLgo9vvfVW59yPbuLVmHUjrV/p2bNnSjee66bam266yfvuxPaluSTd5KogZFdAuM7xr7jiCtMTb2KLApgVvFqvXj1vPkvHjgyCvpP77ruvNw+mOS19JzUOPdlHgc/JAmiDjsmg76vmTBTQGlQ0ds0fKCv1zjvv7I0xuo7+XowbN84LEA4K7tacoY5nBYL7laB98ltPc4i6mVxzMjqWdDzre6aA9HfffddvNW+5bsLXjf7XXHONbzt9F11F323N4+jmgsSiG7P79+/v3aDtCqJWwgXN0fTu3TuxiyJ7r/nChQsXBm5f3+NTTjnFOnToYLvttpvnsHLlSi+Lub5L8vP7dyWw85gG2o5uYNe8sW5Y0Hyx/t0rW7asty3X33hlhm8SuZlARXPGuqFDY9R3TPOVmhdVAgcKAggggAACCCCAAAIIIFASBOrWqWVbNWwQeZrPZpFzpwpWPjJXqLmG9z4c7bt7m21W1brs2cGrV9t1kR8F7s6bv9BmzJqTdL2HHn/eZsxMXhddoc1O29s9t/WyPXffNbpo4++tt2po+tl7j93s+isvsL0OONH+nJF8XlIrfTTyC2dgb9myuXk4e/duhQN7dV556rlXeeeXG3fI54XWv+mGS73g2cR4mNGff2OXX3uLTYwE+YYp5cv7h7UpCPqci28I7G7bFk3sv3f0tm5d9ijUdtmyFdbv1v/aA48OdsaTqP68M3t4wdrRTpo1bRyJUakUCd6uYQ23qOfNJSmouVzk/H3S5Ck27Y+Z0aaFfjdutKXtvON23jY1R7ZW5+8rVnmB0DNn+8dhFeoohws0rjPOvzYyn742cCvKrHzScYdZu7atbbe2O1qLZlt7WY7HffeDvf72R/ZiJKh9ydJlgf24GmjOvUqVyla/bm3bMuJd/f+/9wp017zeV99OsF9/m+7bhY7PurVr/XudYMP6SMKDf2xF5Lu/KBJ0rmB49b9F/bq+61OBQFEIFES+iMUqrUC7du28DBB+WMqMq6wPfkUTomEmWBXopyDPZMGL2oYCaRWkq2BPV9HFj2QX8JKto/88aKLWr+jigmsC1289LVegpTLpuooezXfllVcGPsZQE8K6OOSarFcmGF3M87vIosnmMFlINPGsif9ddtnFmzyP/mdAE9XKdqNgYmUTTvZ4Tl3oUHYaV9FFSF1cSHYhMHY9XdTSxTpdiPMrmnDX4xf9MrTowqKypaRadCFXx7ffcaTjRhf1HnroIWeXylisY9qvtG/f3rt46Fev5aeeeqp3MUj76Cq6QK3HmbqCqZXxN9kFWu2PLhS5HmHZsGFD7zPXcRZUFCCsoGjXRVxlrtIFsnwq+s9DUClmf8aDdod6BBBAAAEEEEAAAQRCCSjbq85h/crTTz9tp512WtJqnXeoaOIvtihgS8GAqRYFbCowTOfr+tG5q84blUlX56I6V1Vwqh5Dn1iCtqWgZJ03+51bJvb3+++/e8G1CuJLVnSOofN5v6ydqZwTxvarcelc6phjjoldvPG19lvnsXoKjqs899xzXvbZZG2UbfeAAw5IVuUtU/8KNgw6fxo9erR16dLFtx9V6Jz6wgsvLNRG5+86j3eVxx57zBRgnGrRTbcKBvQrmp9RoGmyopvF9ZQlV9GciQKrk+1P7Ho///yzdwOwMvi6igJaFdCooos6fnM9hx9+uHOuSDcd+82zaX5H38fYz1Jzbwpo9SuaL3E9WSpoPOpXQeUvvPCCFxjvtx0t1/dagbH33nuvq5kXhDlt2jTfcWvuKcyxonlCzXcqcDYxaFwD0byAgq+DxqV5uE8++cR37Arc1Xc2WdHnrScjydtVFAS/xx57OOcuM5nbdG07nTrNW7Zu3TpwVe33a6+95v199WusANq77rrLCwB3PTEucX0FtNepUydxcdL3yj6tmzj8yosvvmg9evTwq2Y5AggggAACCCCAAAKlSiD23NJvxzf1dVYy9vp9EuGX+81NaG6hUt3kCey0lZ1bb2fffjLUd4OJ/er9Nm26OwN7d2y1rQ1/5xmrWSP+Rm+/jYyNBDvuse/xvk9hqlatii3+w39usnWHg+3nX373677QcgVAn3PacbZT65a2YySTbotmjb2swX9Egou/HjvRRoweYwsX/2VvvVT4JuXnX3nLTo8Ed7qK5nL6XneRXXf5eXFzOonr6LNRkPSV19/uDKKNXe/370dYo0jwdrJy5/1PWK8b70lWtXHZ1ZeebX2vvSgwwZuCQk877xqb+nvyeRF1eOSh+9krz7iT20U3PObr72zvSAC3Xzn7tGNt4L03+lU75958V8pyxbBIgPxhPS4I7HXXXXawV5693xSs7FcWRY6vm+4YGAmgfs6vSaHlCuJdMsMdixe70vmX9rEnnx0Suyju9acfvGi777Zz3DLe5FagoFIdK1uZYOlMlMtksnJxXDeV/7xF90uZJpS91O9ig9opK8k777zjezEj2pcmvou66D8cutjmKso6oYtGqTgpY4QyUeixkn5FQZnJgjaj7VPZTrStgm4VQK2gUj1+NBrUq3pd4FCw7+WXX540qFdtdEHMVdRnKkG96kPb1kS6srj4FWWcGTx4sF91SsbRlXXx4IsvvvAN6lU7/WdJgb9BwcuuY1EXS5URyFUUGP7MM894F6lc7VSnCwkak6voAvWkSZMKNVGGH1dQry4ovfzyy95jRAutnGSBsla5suVoFX3+FAQQQAABBBBAAAEEECg9AjqP0k8mJRrApnPE448/3rbbbjvvHFU3QirA9+STT/YeT58sqFeZPXWTqqvoxsxUg3rVj+YwNCa/ogtWrqfvhDlPVyZlPc3GL6hXY1BgsgIJg24MdZ2rBgUF69w8lXF37tzZFLicrCioTkHWfv3ofNlVdGN4mEBN9aV5J1eZM8c/E4wy8LqKzpmHDx8eGNSrPlq2bGmff/55oYy+if0//PDDGxf5BfVubJDmC83vJH4Gie8Tu3bV6/jU3J6r6JhQO80bBBXNB2luTQGerr8dmhP673//69uda8yJK2k72p5u1k8W1Kv26k/jOuGEExJXj3vv+p4pKFU3I/iVHXbYITCoV+vqZnndVJ6s6O+A/kYq8UK+lKC5Uo1T32/d7KG5Q1dRpl1lh/7oo4+8TLuuttQhgAACCCCAAAIIIIAAAghkJpCruYnEfidM+tlmz5nvHOwTD92SclCvOlIgZMttmvr2uXz5ykjytJW+9WEqOu/Z3sZ+8rrdeH1PO/rw/U3ZazXXoEyzGsMpPQ63QQNvSxrUq3lEBc8GlTdffNh6XXF+oTmdxPU079Pz/FPtgTuDs+xG1/WbQ9FT2YKCRI898kC7uc/lgUG92laHdjvb0Ocf9DI/R7ed+FuZZ2fO2jTZdBOPw8SxbIr39zz0dOBmzjj5aBs97HlnUK86qVWzht1z63X20qB7ncaBG6QBAqVMILOrVyUYq1u3bjZo0KDAf3hEoKwe3bt3d2oou0hRl1GjRvlm3dDYNLEeFPiYuA/VqlXzglddFzMU+JxpUcYRBRHrMY/plCVLljgfBVm1alUbMmRIYKbexG0rEFTB3X4lG/uuR+8p85B+p1IU+OwqrmNRxq6iC0jKVBymnB55xKgr2FiZrZJl1lHwsKvosZadOnVyNSlUd9xxx3mPTCxU8f8LlJ1ImYMoCCCAAAIIIIAAAgggULoF/CaME1UuueQSUxZYBa+mUxTcpsy6utlR2UKvvfZa76lAjRo18rpr0qSJHXrooaG71o2vrrJ06VJXdUp1GrvOVXVOF1R0Pqusqa4yY8YM32plAHUV17qJ6+kpQLphVZlsdUPpxIkTbdmyZaaMmV9//bVdcEHyLBSaM9AToBTge+edd3rnlso6WqFCBW8TF198ceKmAt+n+zktXLjQ3njjDWf/ylKt7KypFmVwDgpwTBacnmr/RdVOwciu7Ev6rmsuzDW3k2zsyrasOQZX0bb9Mme71kusU3B/0Pcnuo6emuQqCxYsiGTk+TtpEwUju6x0I0I0y3nSDmIW6olJymI+YMAAb95QgeNaX8HDCi5+7733YloX3Uv9bdHfXlfRsaEby/2CqpOtq++eAsp1wZKCAAIIIIAAAggggAACCCBQvAUUhLt05lj7ZvRr9tTDt9pl/zndunXpaPXq1vZ2rGP7Xaztzq1C7+TOO27nXGfpshW+9anOXV5z6Tn24RtP2RYNUos1SdzguAmT7Ycff01cHPf+iEP2tQP22ztuWdCb887sYScf759EL2h91b/7wWhnwLUCmB+7v38qXW1s02q7FnbbjVdufJ/sxbsfjEq2uMQt+336DBv16VfO/dph+xb2yH03hgrUVXD5oMj3iIIAAqkJlEutWelq1bx5cxs6dGhcRtggAWV9cU1Kr1jh/49uUN/Zqldgr6voIpQyS4QtHTt29AI3lVE2WdFEth6Nmm456KCDvItu6a6v9ZQ1WGn9/YouyCiTUtiii5PKvuR38UuPqdTFwVSDchO3r4BpXWgMesxh7Ho6Fl3FdSwqm4+r6KK13+NaXevpcZGyUNEFal3giP4o40vifzx1ocj1aEgFYqdz0VTbv+yyy0yPePUrCsbu2bOnXzXLEUAAAQQQQAABBBBAAAFPQOfCOhd03eiaCpWyL+i8SD+x2TYXL17sBcElni+l0mft2v9eWPBrq+C6TIoycmoOJExA8wEHHOAFx/lt1zWmoO0oM+qee+7pBUX79R9drkDpdIKltb5u7E68uXvt2rU2bdo001xS2JLu5zRy5EhngKWOqeuvvz7scLzMyzpnjwZKK2hbN9RGz9933XXX0H0W9QpBwcgKzm3Tpk1aw+zXr5+9+uqrvvNNf/31l3fMn3XWWWn1r5WuuOKKlLIuRzfQpUsXLzu2gnT9ir5rFStWLFStJ3NpvsVv3kjzW2eeeab3tKOgrDGaOxo4cGChbeTbgq+++spcVhrvdddd57mEHbsyp+tmDd2YTkEAAQQQQAABBBBAAAEEECjeArqxe5cdt/d+Yvdk3vyFzptkY9smvq4dyWDqKisDbnR3rau6rnvvbjf1uSyombM+KLBT86L9r7/E2YdfpdZ79Y33Izcgr/Fr4lw+8pN/40/8Gl17+XlWrVpVv2rf5f855yS75a5HbP6CRUnbKLD33DOOT1pXkhZ+8rn7Sd/a1xt79UxrblyZlN8eNtJeHJJ5ksiSZF4S9qV8reCbHFyJBUqCQbb3gYy9SURvv/1223zzzZPU+C8KuhgTlF3Gv+fs1bgCe/UProJb0y3777+/76rKxvrrr+67ePxWVkbgsFmEk/Xl2ne1P/bYY5OtltIy174rQDXocZ2ujSj7ri4WhynpHovKmKLsKX5F3wkFxaZT5KvHRv7+++/eYx2VDUVZkFq3bl0oqFf9K2OSLmL7FT0CUReS0ynKiOTKxOMK0E9ne6yDAAIIIIAAAggggAACJU9Ak/l6gkumQb0uGQVVNmzY0NUk7bpMJ8+U8VbZasMU13mY+nEF9rZs2dK5KQUiHnbYYdajRw/78MMPnUGvzo7SqCxfvrx3o3AujgW/zykoWFXZeps29X+co99uKruosszqR+flygysm7Wvvvpqb24imp3Yb/18W66Aa9dTeRScqoyy6RYdlyeeeKJzdc21pFsUZB12fDoOg+aFMvmu6elKCoRWFmEdH8W9KBGAq+gzUObhdMuVV16Z9tPH0t0m6yGAAAIIIIAAAggggAACCGw6AWXtrV+vTk426DcvlMrGKleu5GVSTaWtq82oz752VXtZd7dvGf5md3W6VaMt7PCDuzn7d1WOdgSear7usIP2ca3uW6ckC/t22cO3fkQkoHjVKv8bqn1XLGYVn40Z6xxxuzatI5/fvs42rsobrrkwaayQax3qECiNAmTsTfjUFUSpx8WFLXXquP+xzuQf3bBjSdZeAaZ6pKRfUb0u1KRbvvnGfbeGLgiFyTobHccxxxxjW221VfRt2r/HjBnjXHfw4MFelhVnI5/KoKBt7Xs6RYGrYS/gaDtBF3D8jkU9FtFV9N1IJ1uv+lQmmDCB40Gfly5iKug53TJv3jzfVdP9vHw7pAIBBBBAAAEEEEAAAQRKnIBuXmzVKvju82zuuM7ldNPslClTbPbs2TZnzhzv94IFC7wMmwrW04/OUV03bWY6Js1/KAtl2BJ0rqp5Cb+iTLHKaPzDDz/4NfGypr788stehlQFRXft2tXLNKtMvrrBMyjDqG/HaVQsWrTIvv/+e5s5c+bGz0mf17Jly7zPKPpZLV++PI3ezUaPHu1cTwHO6ZZ0sxmnu71crhfkpOy26Ty9KXbMymDreiqQbnBOt9x0001p3dSs75qOPb/i+q5prmXcuHF+q3rLJ02a5D3pSDd/t2vXzuSo75myO+u7V5xK0PzTOeec42VATnefNI+m4O9HH3003S5YDwEEEEAAAQQQQAABBBBAoBgJ6CnSP035zX6fPsNmz5lvs+fOtzmRn4WL/rKVkWDQlStXeUGhysY7Y+bcnO3ZyccfZs2aZB5nM+F79w3LB+y7V0b7cMC+e9srQ4eF7mPxX0ts8k/+yQX1hK1HnnopdL/RFSZNnhJ9Wej36tV/24+Rz7jtzpt2brjQQHK84MtvvnNu4cJIZuNMyjbNm9i+Xfewj0a445Qy2QbrIlASBAjsTfgU77rrroQlqb2tUqVKag2LqJUuKukfL1dxXYhwrZdKXboZe/WozmyUuXPd/yl65ZVXsrGZpH2ku++6QKLMIGGLLlYqi86aNeEeWaCLjK7SrFkzV3VW64I+Lx3PuTpedYFcF1nz/TudVXA6QwABBBBAAAEEEEAAgVAChxxySKj26TbWTbR6+omCz8aPH+8FhqbbV7bW69u3b+inHGnbYZ+MlDhe3YysTLSpFD0BZujQod6P2letWtU6dOjgBR9GgxCVuSNbRTeP6nPSTagKilSm2FwWV9Cmttu8eXqZUnI55qLoO8gp06Be7VPQXIkrY7DLRBmxTznlFFcT37rNNtvMty6o4owzzrBbbrnFXDdER/vQxcqvvvrK+9HTz5TRRjc8KMBXgb56wlVQpu5oX0X1W3NArrL99tu7qlOqU/Azgb0pUdEIAQQQQAABBBBAAIESKaB5iNiyYX0kZmNd/HX84e88G9uE18VIQDfPfvblWHvj7Y/t67ETbOIPU/Iim+tB3TtnRXHBwr+c/TRvtrWzPqhyjw5tgpokrZ81e17S5bELe/e/N/ZtVl9P/W16iQ/sVWC6q2y3bebxQ+12aU1grwuZOgQiAgT2xhwGW2+9te2xh39K9Zimxe6lMvgUZQkK1PQb20477eRXFWp5Ue5/uvt+wgknhNrHTBvPn+/+hznoYlWm249dvyg/L41Dn1k6jy2N3QdeI4AAAggggAACCCCAQMkVUNBdrooy7t5333322GOP5TxANOw+lC1b1s4777ywq2WlvTKJjho1ygYNGhS6vxUrVtiIESO8n/79+3tBxt27d/cCJw8++GDTfqVT1OfNN9/sZdBVkOOmKH///bczwFs3+2bjyUebYl9yvY2geY5sBEDrhmwFifvdTJ9uxt4LLrjAypQpkxaRAmzTLQrAHzJkiHXr1s13n/z6VlZxZdXWj/5+aRwKatWT0ZTZuG7dun6rFtnyhQsXOredjWMkW3ObzoFSiQACCCCAAAIIIIAAAnkrEPQ0mbwdOANzCixZuszuuO9xe/bFNyIZeYs2FifZQHduvV2yxaGWLVu2InBuoEXTxqH6TGxcv27txEUpvV+42B1wnFInGTSaFRD0mkHXebGq5jl1jLtK86aZZ4TecYdtXZugDgEEIgLpzRCXULpMJr7znSRoojrX41eG1XTKFltskc5qcev8888/tmTJkrhlm/JNuvu+qY/HoGDaTRnYW1yP1015XLEtBBBAAAEEEEAAAQQQKDqBJk2a5GTjr7/+urVs2dJ69eqVd0G92mGdp2Yz021YxIEDB9pZZ50VdrVC7ZcuXeoFLx5++OFedtuXXgr3aD5lgj3ssMO84EcF926qoF7tSFCwqoJ6FdxLMQua52jRokXGTAq+VaIAv6L5qHTmhfQkpqIqe+21l/f9qFmzZkZDUKCvso5fe+21XrD5hRdeaH/9VbQX3hJ3KGj+KRvHSOvWrb2/nYnb5j0CCCCAAAIIIIAAAggggEDxFHjquSHWsu3+kcDeJ/IyqFdzFVs1yjzOJih4tlq1KpGb56tl9CFWrZrek9EXBmQSzmhQKay8uIgDi1MYYkZNFi12x1fVqL651apZI6NtaOUdd2iZcR90gEBJFyCwt6R/wv+/f8uXLy/SPS3KiXtl5inKUpT7Hma/dWHTVTJ9bKqr78S60ny8JlrwHgEEEEAAAQQQQAABBPJPIBc3Yj7wwANeZss///wz/3Y4T0ZUsWJFe+KJJ+zVV1/NWlba6dOnm56Yc+yxx5qy4QaVX375xTp16mRvv/12UNOc1AfNMeRjVtScQKTQaZBVNm4m1zC23HJL52jmzQt+PKSzgyKoVOD6hAkTTBmts1H03VJgfqtWrWzcuHHZ6DLjPhR4vHLlSmc/2ZgLq1KlilWuXNm5HSoRQAABBBBAAAEEEEAAAQSKh0Dv/vfaeZf0sYWL8uvG1VzoVQy46Xj16jUZbzZdx6BsshkPLKCDv5a4s9kGrJ731StWrnKOMVtz43Xr1HJuh0oEEDAjhUcpOQqqVcvsTplMmdLJTpLpNqPrV61aNfqySH4vXry4SLYbdqMNGjRwrjJjxgxnfTYrS/Pxmk1H+kIAAQQQQAABBBBAAIHiIfDUU09Zz5490xqsgl0VWKhzus0228x0DjxmzBibM2dOWv0Vh5WOOeYYO+KII2zo0KE2aNAg+/jjj01P68mkDBkyxHT+/sEHH1jZsmWTdqUMsMpmOnfu3KT1roWa8FbQbcOGDa1GjRre56T277zzjmu1QnVBWVTTGVuhjZSQBXXq1HHuSVBGX+fKMZVBAcTVq1ePaV18Xir7s47PH374wR555BEvoD7T42v27NnWtWtXGz58uLVr165IMfSdVOCu60Z31WUa3KuswEEBxEUKwcYRQAABBBBAAAEEEEAAAQRSEhhwx8N2+32Pp9Q2sVHlypVsywb1rH692pE5oSpWtUpl+3jUF7Z8ufuG08R+NuX7BvXrWMWKFSI3wicP4NVc3PLlK6xatfTjcWbMSm/+skrEsyhLUEbbohxbNrZdPSATs26WzkaZ9sfMbHRDHwiUaAECe0v0x/u/nQuHr3bMAAA/mklEQVS68KPJ+tNPP/1/K2T5Vdu2bbPcY+rd6RGUuri5bFnyu2b0KILrr78+9Q5Dtiwu2XKaNm3q3LPffvvNWZ/NyqDj9bzzzrN69eplc5Nxfe25555x73mDAAIIIIAAAggggAACCORKQDfCXn311Sl1r8yPBx54oJcxtk2bNqZHvCcLXrzjjjvsmmuuSanP4tpI5/rHHXec96OAXAUKKsD3008/tR9//NHSmWBWH/fee69deeWVSVk0d5BqYKPmQfbff3/Tb31WjRs3tvLly8f1q4DQoPPfuBUibxTErWBuv+zCyvi8du3aQttK7Kc0vG/WrJlzN3/99VdnfaqVQf0k+46m2nc+tNthhx1MGcXvu+8+++abb+zDDz+0UaNG2ddff23pPCVLwbKagxw/fnyRH6f169d3BvYqQ/euu+6a0ccwderUjNZnZQQQQAABBBBAAAEEEEAAgaIXmPr7H3bbPY+mNJDNI0GRB3fvYh1229l22XF7a7Vdc6tZo/BNv5dec7M99PjzKfVZFI10Q2zTrRvZT1P840SmTJ1ubXdulfbw/vhzVlrr1qi+uXM9eXfZq72zTSaV3bp0zGT1vF9XfprH1BxjsvLXkqVe1uratWokq0552W+R7xWlZAnsvUfCjfxlK1hBmfg58ZK1x7nfGwJ7c2+cF1tQNhhX6dKli/Xv39/VpFjXaf/9AnubN29eovc91Q8u6ILXpgzsDTpezzzzTGvfPnf/EUvVjHYIIIAAAggggAACCCCAQKYCvXv3NmV0dJUtttjCBgwYYD169NiY6dXVPp2gVld/+V6n4Fhl8dWPigJ9lbX4iy++8H6++uqrlDNmyvniiy/2gmdj93vcuHH2xBNPxC4q9Fo3Dp911lleULXmGoJKOp+TLqo0adLEfv7556Tdr1+/3qZNm2bbbLNN0vrStDBoniMoIDcVq1mzZjmPLWXrTQzoTqXffGyjTNa7776799OnTx8vS/aECRM2fs/0ffvjj9QuyCgL8Isvvminnnpqke6qbhpX8K5f0TFCYK+fDssRQAABBBBAAAEEEEAAgdIjcEWv22zNmuRBjlGF5k0b24Del9jhB3ezChUqRBf7/k5nXsi3sxxVNAkI7P116rSMAntffeP9tEZevfpmzvUuPPsE69crvaejOTsuRZV169S0WbPn+e7xr79Nt0wDe6dO+9O3fyqKp8Dwd56NG3hBpTpWtnLduGW8CSdQJlxzWhdXAV0EdD067rvvviuuu5bSuLfbbjvfdgpY9Qv69V2pBFYEZeydMmXKJttr1+elQZT043WTQbMhBBBAAAEEEEAAAQQQKFIBnYs+9thjzjHoRlydjylgtGrV1B5tp8DO0lwU6HvQQQfZTTfdZCNGjDBlxv3kk0/s3HPPNWX6dRVlE/3oo48KNbnnnntMQbN+pVq1ajZy5Ejv80wlqFf9pPs5BQWskiH0308paJ4jG4G9QX00bNjQ75Ap9sv1XVLQqwLhFaQ7ffp007GnzL5bb7114P4NGTIksE2uGyhjr6so+3em5d133820C9ZHAAEEEEAAAQQQQAABBBAoQoEpv06zdz8Y5RzB0YfvbxPHvGXHHnlgSkG96mzaHzOdfeZDZbNIYK+rfDTyC1e1s27+gkU29K0PnW38Kps12cqvyls+6cdfnPVUBgvUr1vb2ciVydm5YkzlsA9Hx7zjJQIIJBMgsDeZSglcpowurgwTkyZNsjlz5mS056+99ppNnDgxoz5ytXK7dgnpvmM2tG7dOu9CX8yi0C91gVCPIVRfxbUEXRjU4xa//fbbtHdP2VyU+WjYsGE2b57/nT3agOvzUn2yi6xanmpRRp2XX37Zy+KU6jq0QwABBBBAAAEEEEAAAQSyLfD99987zyMbNGhg77zzjiloNEzhZsh4LWVM3WuvvezRRx81BdkFZVDV+W9iCTJVgPbee++duJrzfVCffisHnb8PHjzYb9XA5Qo2fvjhh70srCtXrgxsn88NgpwUiD1jxoyMdkFzC64S9phw9VUc6mR+ySWXmP62tW3b1jnkZN8z5wo5qNxhhx2cvT7++OO2atUqZxtXpQKdX3rpJVcT6hBAAAEEEEAAAQQQQAABBPJcYML37ps+d9i+hQ1+/M6UA3qjuzth0k/Rl3n7u3mzxs6xPfPC6zZuwmRnG7/KgU++GJgF2W/dunVqWeNGW/pV22djxjrnXH1XjKnQfq1e/XfMktL1stV27qeBPfTYYMsk6/Toz762L74aX7pQ2VsE0hAgsDcNtOK6SocOHXyHrj+4CrpMt/z000927LHH2s4772wtWrSwq6++2vSoy0z+kKc7lmTrufZd7bXv6Y7177//tuOPP966du1quuh69tlne8Gra9asSTaUvF1Wt25dq13bfddN37590xr//Pnz7eabbzYF9yprkjKiNG7c2I466ihvuQKjY4sy9upxlX5l6NChpmD0dMttt93mPcJW49h///29i7tz585NtzvWQwABBBBAAAEEEEAAAQTSEgi6OfaCCy5IOUtvdACLFy/O25tuo2MM+3vt2rWmp+0oEHPQoEGmc9PTTjvNOw9/5plnQnXXvXt3u/zyy53rJN74rPP+n3/+2XedrbbaypsX8G3gUzF6dHpZKYIyAit7arqZRp9++mn7z3/+Y506dfKe/LTjjjva6aefbg8++KB9+eWXJoviUjRHs9lm/o9mXL16td14441p746y9Srw01W6devmqs67Os3fKOBW2XTvuusuu+iii+yQQw7x5m/CDFbur776qnMVbcuVBdu5cpYqNUflKrox/P7773c1cdZp/qk4JwFw7hyVCCCAAAIIIIAAAgggkJKAYhBif9atnGdrF02O+0mpIxoVmcD3P0xxbvuSC04LfEJUYge/TfvTZs7K//iE4486yCpWrJA4/I3vdWxfcnX4WJvRn39jt9z1yMZ+0nnRrm1r39UWLvrLnn7+dd/6oIqJP/xsHboeYw226WQ9zrjMXhn6XuQp4CuCVitR9Qfu505gMH7ijxGXYWnv8y13P5r2uqyIQGkSILC3FH3aemxnmTL+H7myy+jxnumUfv36bQyMVTaKO++803bffXcveLNnz57OC2DpbC/sOpqob9TI/zEBY8eOTTuDxsCBAzdmO16wYIE9+eSTXvBqvXr17OSTT/Yy+YYdb1G112NJXeW9997zLuS52iSre+SRRwpdrPnzzz/t9ddft969excKKtdxquPVr+jCzzXXXONX7Vyu7ENPPfWU10YXhz/88EM7//zzbcstt/SyK+mCTVFfWHLuAJUIIIAAAggggAACCCAQSkD/78/XoptkXWXbbbd1VSet0zl4cc+0GrtjyqhZqVIlUzDrPvvsY2eeeab179/fnn32We98++67745tntLr3XbbzdluyZIlcfWa5/jnn3/ilsW+0Q3OrvmW2LbR1wrq1T6kU3RzcYUK/hdVdE6bTsCqvivPPffcxiEpIFE31Sp4+uKLL7aOHTva8OHDN9an+2JTficVlOwqChR3BW271tV8hmtfdEzoJvDiUG6//XbvJgLNZbVv3967ef+qq66yhx56yMtyrfkbBXaHKcreW6tWLd9VdHwtX77ct35TVGhf69Sp49yUgnMXLVrkbJOscty4cWl/x5P1xzIEEEAAAQQQQAABBBBAAIHsCKx1zPEk28JPv/yWbPHGZdu0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nTVXTVtsNj7FbL89IcV5H+165tnp6enn/vMax3TRRRYuzJxcuBl/8cUKQfbLp89uvnHhKXODekKT1LEDAv0XXz13b/FNuUQVGwjsreDwgQABAs0lUM/Fnj98zXXM1IYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfkr0AzjrPXUQWDv/D1PlF6/wDWFmYr3/69j0qv/ei0d8V/7pv8z5fD6dy7bMiZg2GmPg9K1N9xetrTybUxo8OqTd/WYANfK2vtEoHcKCOzt/OPep/OzlCMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9GSBd955N33jsMlpxy99oxjUG235yRnnpv9z6i+LT8xqpG1vv/1O2v/Q72cG9UZ+W0zYUFBvI7C2JUBggRQwY+8CeVg1igCBBUWgnrs4zdi7oBxt7SBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoDMEmmGctZ46mLG3M462PLpK4K6//j199RtHp6effaFqERM2GZfOPu0HaeUVV6i6vrRwzpw56cprb02H/+8fpRemv1xaXPP1hsvPSxM3/UzN9VYQINB8ArfdMbWiUi0LLZr6DFikYtnEiRMrPvuQLSCwN9vHWgIECMxXgXou9gT2ztdDpHACBAgQIECAAAECBAgQIECgnQKPPvpouvTSS9u5d/t222677dKnP/3p9u1sLwIECBAgQIAAAQIEeoxAM4yz1lMHgb095pTqdRX9/WXXpj33PbyuWXnHfXrttNN2kwoBvsunJZdcPPXt0zfNeO319Mqrr6U777k/XX39bWn2m2/VZbj9NpunP110Vl3bLsgb3T31gXTjrXd1axP3/ML2aaUxy3drmQpbcAVaBg5PfQctueA2sBta1q8bylAEAQIECBAgQIAAAQIECBAgQIAAAQIECBCoELjlllvS5MmTK5Z19YelllpKYG9XI8ufAAECBAgQIECAAAECBHq8wPrrrZVGL79ceua56bltmXrfgyl+OpqGL7FYOuXEozuazQKx/+VX3ZhOOfPX3dqWcYVjLrC3W8kVRiBTQGBvJo+VBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBoTaHsj49w576S5/363sUxsTWA+CURQ761XX5i22WXf9OjjT3V5LYYNG5Ku+v3/TSuOHtXlZSmAAAECPUFAYG9POErqSIAAAQIECBAgQIAAAQIECBAgQIAAAQIdFhg6dGiH85ABAQIECBAgQIAAAQIE6hGYMmVKxWYfvzcjffz+axXLfCDQzALLjlgq3XzlBWnH3b+e7r1/WpdVdbVVV0rnnnViWm+d1busDBnnCwwZOjh/I1sQINBtAi1zC6nbSlMQAQIECDQk0NLSkru9X+O5RDYgQIAAAQIECBAgQIAAAQIEmlDgueeeS9Omdd3AYNsm9+/fP2211Vapnv6Wtvv6TIAAAQIECBAgQIBAzxKo5//93T3OKrC3Z51DavuJwEcffZTOOf/SNPnEM9LrM2d9sqKD74YMGZyO/Oa+6cj/2jcNGDCgg7ktWLvHLMlPP/tCtzVq6NAhacLGG3RbeQpa8AVaBg5PfQctueA3tAtbKLC3C3FlTYAAgY4KNOMFZ0fbZH8CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0pUAzjrMK7O3KIy7v7hCYNfvN9OPTz0mXXXlj+ueTz7aryD59+qQtJmyYvvylndLnt5uUBg8e1K587ESAQHMLCOzt+PER2NtxQzkQIECgywSa8YKzyxorYwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSCQDOOswrs7YQDK4umEXh++kvpxlvuSvc98HCa+cbs4s+sWbPTrNlvFZ+Us8jCQ9PCCw9LCw8bmpZZenhaZ82xad21V0trrb5KGjRoYNO0Q0UIEOgaAYG9HXcV2NtxQzkQIECgywSa8YKzyxorYwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSCQDOOswrs7YQDKwsCBAgQ6BECAns7fpj6dTwLORAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPQ2gf6Lr57b5Llz5+ZuY4NPBPp88tY7AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTml4DA3vklr1wCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECZQL9yt57S4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBABwUmTpxYkcPcj+ek9NGHFctuuvKCis8+ECBAgAABAgRCoGVuIaEgQIAAgeYUaGlpya2YX+O5RDYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAXCTTDOGs9dZgz85FedFQ0lQABAgQWVIH+i6+e2zTxTblEFRv0qfjkAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC80VAYO98YVcoAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUoBgb2VHj4RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmC8C/eZLqQolQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDo0QKbbbR+Zf37DkgtffpXLvOpIYGWuYXU0B42JkCAAIFuE2hpackty6/xXCIbECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQiwSaYZy1njrMmflILzoqmkqAAAECvUWgZeDw1HfQkr2luV3Szj5dkqtMCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoSEBgb0NcNiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQNQL9uiZbuRIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDonQJz586taPjH781IH7//WsUyHwgQIECAAAEC1QTM2FtNxTICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC3SwgsLebwRVHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoJqAwN5qKpYRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6GYBgb3dDK44AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUE+lVbaBkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBLIHjfvSzitUt/Yekln6DK5ZNmTKl4rMP2QItcwspexNrCRAgQGB+CbS0tOQW7dd4LpENCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoRQLNOM768Xsz0sfvv9aLjoKmEiBAgEBvEei/+Oq5TRXflEtUsUGfik8+ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwXwT6zZdSFUqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgARW49dZbK1r28Qez0twPZ1csm7DJuIrPPhAgQIAAAQIEQqClMMXxXBQECBAg0JwCzfiImOaUUisCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj8R6AZxlnrqcOcmY84ZAQIECBAoMcL9F989dw2CFPNJarYoE/FJx8IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJgvAgJ75wu7QgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUCvSr/OgTAQIECPQ0gXoe4dLT2qS+BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6I0CW+6wd7r9znszmz5n5iOZ628r7D+pkE9WOuaog9KxRx+StUlSl+o8XLiUBHyPShKVr1wqPUqfeqNLqe1eGxcwY2/jZvYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0OkCZuztdFIZEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGiHwNy57dipzS6dkUdk2Rn5dEYe6tLmAJd97AzfzsjDMSo7KG3edoZvZ+ThGLU5MGUfO8O3M/Lowcfoxit+UwaaUstCi6Y+AxapWOZDYwICexvzsjUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBrhFoael4vp2RR9SiM/LpjDzUpfY50Rm+nZGHY+QY1RaovqYzzrvOyMO5W/34NOgyYZNxFfm0DBye+g5asmKZD40JCOxtzMvWBAgQ6FaBvn37po8++qhby1QYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEFmSBGIedH2mzTTdKEws/pdSnEPg0T+rTf55FbRdU3a9so5b+C5d9qv62pd/glJdPUpfqeFy4/I+A71H1U4ELlzgHpI4JCOztmJ+9CRAg0KUCo0ePTk899VSXliFzAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9CaBGIedH2nzLT6bpkyZkll0n74DMtfHyj45syD2HbhYbh4t/Yfk5qMu1Rm5cCkJ+B6VJCpfuVR6lD71RpdS2702LtCn8V3sQYAAAQLdJbDXXnt1V1HKIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQK8QMA7bKw6zRhIgQIAAgR4rILC3xx46FSdAoDcIHH300Wn8+PG9oanaSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgS4XiPHXGIeVCBAgQIAAAQLNKiCwt1mPjHoRIECgIDBo0KB00003pWOPPTattNJKqW/fvlwIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoAGBGGeN8dYYd43x1xiHlQgQIECAAAECzSrQMreQmrVy6kWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgtwiYsbe3HGntJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGoBgb1NfXhUjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLcICOztLUdaOwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJpaQGBvUx8elSNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgtAgJ7e8uR1k4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGmFhDY29SHR+UIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR6i4DA3t5ypLWTAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgqQUE9jb14VE5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB3iIgsLe3HGntJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGoBgb1NfXhUjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLcICOztLUdaOwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJpaQGBvUx8elSNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgtAgJ7e8uR1k4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGmFhDY29SHR+UIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR6i4DA3t5ypLWTAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgqQUE9jb14VE5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB3iIgsLe3HGntJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGoBgb1NfXhUjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLcICOztLUdaOwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJpaQGBvUx8elSNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOgtAgJ7e8uR1k4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGmFhDY29SHR+UIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR6i4DA3t5ypLWTAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgqQUE9jb14VE5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB3iIgsLe3HGntJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGqB/w/MQvvPsHgN/gAAAABJRU5ErkJggg==\" width=800>","metadata":{"id":"Dbg911SON80e"}},{"cell_type":"markdown","source":"**about this format**\n\nOn both Kaggle and Colab, training and inference can be run on this single notebook!\n\n1. Training\n    \n    Set `CFG.train = True` and run.\n\n2. Inference\n\n    Set `CFG.train = False` and run.\n\nThe duration of `transactions_df` and `target_df` is automatically changed by True/False of `CFG.train`.","metadata":{"id":"uLXUw84cOWbT"}},{"cell_type":"code","source":"!nvidia-smi","metadata":{"id":"TLNV_u2j3hk0","outputId":"d22f3a66-218a-4e58-c814-4eb471cbaa0b","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:11:40.539766Z","iopub.execute_input":"2025-12-04T18:11:40.540082Z","iopub.status.idle":"2025-12-04T18:11:40.834474Z","shell.execute_reply.started":"2025-12-04T18:11:40.540047Z","shell.execute_reply":"2025-12-04T18:11:40.833553Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Libraries","metadata":{"id":"OL4dWeDU3GLB"}},{"cell_type":"code","source":"# ====================================================\n# import libraries\n# ====================================================\n\nimport warnings\nwarnings.filterwarnings('ignore')\nimport math\nimport json\nimport os\nimport numpy as np\nimport pandas as pd\nimport gc\nimport time\nimport torch\nimport random\nimport sys\nfrom tqdm import tqdm\nfrom pathlib import Path\nimport itertools\nimport collections\nimport joblib\nfrom gensim.models import word2vec\nimport datetime\nfrom datetime import timedelta\nimport hashlib\nimport matplotlib.pyplot as plt\nfrom sklearn.base import BaseEstimator, TransformerMixin\nimport numpy as np\nfrom collections import defaultdict, Counter\nfrom PIL import Image\nfrom pathlib import Path\nimport pickle\nfrom contextlib import contextmanager\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import StratifiedKFold, GroupKFold, KFold\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.linear_model import RidgeCV\nimport lightgbm as lgb\nimport typing as tp\nfrom sklearn.preprocessing import LabelEncoder\nimport seaborn as sns\nfrom sklearn.utils.class_weight import compute_sample_weight\nfrom sklearn.metrics.pairwise import cosine_similarity\nfrom sklearn.decomposition import TruncatedSVD\nimport torch\nfrom logging import getLogger, INFO, StreamHandler, FileHandler, Formatter\n\ntqdm.pandas()\npd.set_option('display.max_rows', 500)\npd.set_option('display.max_columns', 500)\n\nif torch.cuda.is_available():\n    device = torch.device('cuda')\nelse:\n    device = torch.device('cpu')\n    \nprint(f'Using device: {device}')","metadata":{"id":"ZAX1B3vO3GLF","outputId":"44e93739-83b8-4155-d782-7464a991cf27","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:11:40.836296Z","iopub.execute_input":"2025-12-04T18:11:40.836916Z","iopub.status.idle":"2025-12-04T18:12:12.157541Z","shell.execute_reply.started":"2025-12-04T18:11:40.836889Z","shell.execute_reply":"2025-12-04T18:12:12.156763Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Config","metadata":{"id":"low8Ncyj3GLG"}},{"cell_type":"code","source":"# ==============================================\n#  Config\n# ==============================================\n\nclass CFG:\n    colab = \"google.colab\" in sys.modules\n    exp = \"120\"\n    train = True\n    submit = False\n    api_path = '/content/drive/My Drive/kaggle.json'\n    seed = 42\n    used_fold = [0,1,2,3,4]\n    fold = 5\n    part = 0\n    target = \"target\"\n    \nval_start_date = '2020-09-16'","metadata":{"id":"CpIy7UsA3GLG","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:12.158665Z","iopub.execute_input":"2025-12-04T18:12:12.159426Z","iopub.status.idle":"2025-12-04T18:12:12.163599Z","shell.execute_reply.started":"2025-12-04T18:12:12.159401Z","shell.execute_reply":"2025-12-04T18:12:12.162860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ==============================================\n#  Catboost parameters\n# ==============================================\n\nDROP_COLS = [\n    \"customer_id\",\n    \"article_id\",\n    #\"product_code\",\n    #\"product_type_no\",\n    #\"graphical_appearance_no\",\n    #\"colour_group_code\",\n    #\"index_group_no\",\n    #\"section_no\",\n    #\"garment_group_no\",\n]\n\n\nCATEGORICAL_COLS = [\n    # ---------------------------------------------------------\n    # Article features\n    # ---------------------------------------------------------\n    #\"product_code\",\n    #\"product_type_no\",\n    #\"graphical_appearance_no\",\n    #\"colour_group_code\",\n    #\"index_group_no\",\n    #\"section_no\",\n    #\"garment_group_no\",\n    # ---------------------------------------------------------\n    # Customer features\n    # ---------------------------------------------------------\n    #\"FN\",\n    #\"Active\",\n    #\"club_member_status\",\n    #\"fashion_news_frequency\",\n    #\"postal_code\",\n]\n\nPARAMS = {\n    'loss_function': 'Logloss',\n    'learning_rate': 0.02,\n    'max_depth': 6,\n    'random_state': CFG.seed,\n    'thread_count': 2,\n    'task_type': 'GPU',\n    'scale_pos_weight': 100,\n    'num_boost_round': 15000,\n}","metadata":{"id":"gSuGMbVUAu3m","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:12.165305Z","iopub.execute_input":"2025-12-04T18:12:12.165605Z","iopub.status.idle":"2025-12-04T18:12:12.175013Z","shell.execute_reply.started":"2025-12-04T18:12:12.165578Z","shell.execute_reply":"2025-12-04T18:12:12.174263Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if CFG.colab:\n    print(\"==============================================\")\n    print(\"This environment is Google Colab\")\n    print(\"==============================================\")\n\n    # Google Drive\n    from google.colab import drive, files\n    drive.mount('/content/drive')\n    %cd \"drive/My Drive/h-and-m/\"\n\n    # Kaggle API\n    f = open(CFG.api_path, 'r')\n    json_data = json.load(f) \n    os.environ[\"KAGGLE_USERNAME\"] = json_data[\"username\"]\n    os.environ[\"KAGGLE_KEY\"] = json_data[\"key\"]\n\n    # Directory Setting\n    if not os.path.exists(f\"output/exp{CFG.exp}/\"):\n        os.makedirs(f\"output/exp{CFG.exp}/\")\n\n    DATA_DIR = \"input/\"\n    OUTPUT_DIR = f\"output/exp{CFG.exp}/\"\n    MODEL_DIR = OUTPUT_DIR\n\n    if not os.path.exists(OUTPUT_DIR + f\"exp{CFG.exp}/\"):\n        os.makedirs(OUTPUT_DIR + f\"exp{CFG.exp}/\")\n    \n    # Data Loading\n    if not os.path.isfile(os.path.join(DATA_DIR, \"transactions_train.csv.zip\")):\n        !kaggle competitions download -c h-and-m-personalized-fashion-recommendations -p $DATA_DIR\n    \n    # Libraries\n    !pip install -q catboost\n    !pip install -q transformers\n    \nelse:\n    print(\"==============================================\")\n    print(\" This environment is Kaggle Notebook\")\n    print(\"==============================================\")\n\n    # Directory Setting\n    OUTPUT_DIR = \"./\"\n    DATA_DIR = \"../input/h-and-m-personalized-fashion-recommendations/\"\n\n# ====================================================\n# import libraries2\n# ====================================================\n\nfrom catboost import CatBoost, Pool\nimport transformers","metadata":{"id":"HV9Do4Qs4ida","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:12.175861Z","iopub.execute_input":"2025-12-04T18:12:12.176112Z","iopub.status.idle":"2025-12-04T18:12:13.677679Z","shell.execute_reply.started":"2025-12-04T18:12:12.176085Z","shell.execute_reply":"2025-12-04T18:12:13.676743Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Helper Functions","metadata":{"id":"lGwvMFZXxj2E"}},{"cell_type":"code","source":"def get_swap_dict(d):\n    return {v: k for k, v in d.items()}","metadata":{"id":"TrirIqxMhTAT","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.678589Z","iopub.execute_input":"2025-12-04T18:12:13.680048Z","iopub.status.idle":"2025-12-04T18:12:13.683695Z","shell.execute_reply.started":"2025-12-04T18:12:13.680024Z","shell.execute_reply":"2025-12-04T18:12:13.682849Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def reduce_mem_usage(df, verbose=True):\n    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n    start_mem = df.memory_usage().sum() / 1024**2    \n    for col in df.columns:\n        col_type = df[col].dtypes\n        if col_type in numerics:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)  \n            else:\n                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)    \n    end_mem = df.memory_usage().sum() / 1024**2\n    if verbose: print('Memory usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))\n    return df","metadata":{"id":"VeqV1MGS5a_e","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.684564Z","iopub.execute_input":"2025-12-04T18:12:13.684916Z","iopub.status.idle":"2025-12-04T18:12:13.696999Z","shell.execute_reply.started":"2025-12-04T18:12:13.684890Z","shell.execute_reply":"2025-12-04T18:12:13.696345Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def compare_vectors(v1, v2):\n    intersection = len(set(v1) & set(v2))\n    denominator = np.sqrt(len(v1) * len(v2))\n    return intersection / denominator\n\ndef flatten(x):\n    return [e for i in x for e in i]","metadata":{"id":"xO1GfvYY61qS","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.697772Z","iopub.execute_input":"2025-12-04T18:12:13.698040Z","iopub.status.idle":"2025-12-04T18:12:13.711277Z","shell.execute_reply.started":"2025-12-04T18:12:13.698016Z","shell.execute_reply":"2025-12-04T18:12:13.710646Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"@contextmanager\ndef timer(name: str):\n    t0 = time.time()\n    print(f\"[{name}] start\")\n    yield\n    msg = f\"[{name}] done in {time.time() - t0:.0f} s\"\n    print(msg)","metadata":{"id":"-kZhIkMGOpCg","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.711909Z","iopub.execute_input":"2025-12-04T18:12:13.712220Z","iopub.status.idle":"2025-12-04T18:12:13.722135Z","shell.execute_reply.started":"2025-12-04T18:12:13.712192Z","shell.execute_reply":"2025-12-04T18:12:13.721492Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def seed_everything(seed=42):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False\n\ndef hashfxn(x):\n    return int(hashlib.md5(str(x).encode()).hexdigest(), 16)\n\nseed_everything(CFG.seed)","metadata":{"id":"QsnGPtqmLUfe","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.724568Z","iopub.execute_input":"2025-12-04T18:12:13.724847Z","iopub.status.idle":"2025-12-04T18:12:13.736925Z","shell.execute_reply.started":"2025-12-04T18:12:13.724830Z","shell.execute_reply":"2025-12-04T18:12:13.736189Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def init_logger(log_file=OUTPUT_DIR+'train.log'):\n    logger = getLogger(__name__)\n    logger.setLevel(INFO)\n    logger.hasHandlers()\n    handler1 = StreamHandler()\n    handler1.setFormatter(Formatter(\"%(message)s\"))\n    handler2 = FileHandler(filename=log_file)\n    handler2.setFormatter(Formatter(\"%(message)s\"))\n    logger.addHandler(handler1)\n    logger.addHandler(handler2)\n    return logger\n\nLOGGER = init_logger()","metadata":{"id":"HHkDY3YXEx1X","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.737713Z","iopub.execute_input":"2025-12-04T18:12:13.737958Z","iopub.status.idle":"2025-12-04T18:12:13.743759Z","shell.execute_reply.started":"2025-12-04T18:12:13.737935Z","shell.execute_reply":"2025-12-04T18:12:13.743161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ====================================================\n#  Calculate MAP@12\n# ====================================================\n# Reference: https://www.kaggle.com/kaerunantoka/h-m-how-to-calculate-map-12\n\ndef apk(actual, predicted, k=12):\n    \"\"\"\n    Computes the average precision at k.\n    This function computes the average prescision at k between two lists of\n    items.\n    Parameters\n    ----------\n    actual : list\n             A list of elements that are to be predicted (order doesn't matter)\n    predicted : list\n                A list of predicted elements (order does matter)\n    k : int, optional\n        The maximum number of predicted elements\n    Returns\n    -------\n    score : double\n            The average precision at k over the input lists\n    \"\"\"\n    if len(predicted)>k:\n        predicted = predicted[:k]\n\n    score = 0.0\n    num_hits = 0.0\n\n    for i,p in enumerate(predicted):\n        if p in actual and p not in predicted[:i]:\n            num_hits += 1.0\n            score += num_hits / (i+1.0)\n\n    if not actual:\n        return 0.0\n\n    return score / min(len(actual), k)\n\ndef mapk(actual, predicted, k=12):\n    \"\"\"\n    Computes the mean average precision at k.\n    This function computes the mean average prescision at k between two lists\n    of lists of items.\n    Parameters\n    ----------\n    actual : list\n             A list of lists of elements that are to be predicted \n             (order doesn't matter in the lists)\n    predicted : list\n                A list of lists of predicted elements\n                (order matters in the lists)\n    k : int, optional\n        The maximum number of predicted elements\n    Returns\n    -------\n    score : double\n            The mean average precision at k over the input lists\n    \"\"\"\n    return np.mean([apk(a,p,k) for a,p in zip(actual, predicted)])","metadata":{"id":"hAS43i-wAklN","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.744498Z","iopub.execute_input":"2025-12-04T18:12:13.745005Z","iopub.status.idle":"2025-12-04T18:12:13.757246Z","shell.execute_reply.started":"2025-12-04T18:12:13.744981Z","shell.execute_reply":"2025-12-04T18:12:13.756660Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ARTICLE_FEATURES = [\"product_code\", \"product_type_no\", \"graphical_appearance_no\", \"colour_group_code\", \"index_group_no\", \"section_no\", \"garment_group_no\"]","metadata":{"id":"Hb1dClzAyf6t","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.758003Z","iopub.execute_input":"2025-12-04T18:12:13.758240Z","iopub.status.idle":"2025-12-04T18:12:13.771128Z","shell.execute_reply.started":"2025-12-04T18:12:13.758223Z","shell.execute_reply":"2025-12-04T18:12:13.770504Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Loading","metadata":{"id":"CPrIe0GM3GLH"}},{"cell_type":"code","source":"with timer(\"Data Loading\"):\n    transactions_df = reduce_mem_usage(pd.read_csv(DATA_DIR + \"transactions_train.csv\"))\n    articles_df = reduce_mem_usage(pd.read_csv(DATA_DIR + \"articles.csv\"))\n    customers_df = reduce_mem_usage(pd.read_csv(DATA_DIR + \"customers.csv\"))\n    sub_df = reduce_mem_usage(pd.read_csv(DATA_DIR + \"sample_submission.csv\"))\n    transactions_df['customer_id'] = transactions_df['customer_id'].apply(lambda x: int(x, 16))\n    sub_df['customer_id'] = sub_df['customer_id'].apply(lambda x: int(x[-16:], 16))","metadata":{"id":"OagzUEps3GLH","outputId":"5e6a1e65-64f8-4a27-efc2-b94e5feedf60","trusted":true,"execution":{"iopub.status.busy":"2025-12-04T18:12:13.771826Z","iopub.execute_input":"2025-12-04T18:12:13.772018Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if CFG.train:\n    target_df = transactions_df.query(f\"t_dat >= '{val_start_date}'\").reset_index(drop=True)\n    transactions_df = transactions_df.query(f\"t_dat < '{val_start_date}'\").reset_index(drop=True)\nelse:\n    target_df = sub_df.copy()\n    del sub_df\n    gc.collect()\n\ndisplay(transactions_df.head(5))\ndisplay(target_df.head(5))","metadata":{"id":"buJpnANHwUzy","outputId":"e57ae6cc-f8c9-429f-d584-529509ae5125","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def original_df_features(original_df):\n    original_df[\"t_dat\"] = pd.to_datetime(original_df[\"t_dat\"])\n    \n    original_df[\"week\"] = ((original_df.t_dat.max() - original_df.t_dat).dt.days // 7).astype(\"int8\")\n    original_df[\"day\"] = ((original_df.t_dat.max() - original_df.t_dat).dt.days).astype(\"int16\")\n    original_df[\"sales_channel_id\"] = original_df[\"sales_channel_id\"]-1\n    return original_df","metadata":{"id":"RDKNxr84ZuMF","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def make_df(original_df):\n\n    # ==========================================================================\n    #  Step1: Top300 popular items\n    # ==========================================================================\n\n    tmp1 = pd.DataFrame(target_df[\"customer_id\"].unique()).rename(columns={0: \"customer_id\"})\n\n    # For memory measures, the customer is divided into 14 parts when inferring.\n    if not(CFG.train):\n        a = 100000*CFG.part\n        b = 100000*(CFG.part+1)\n        tmp1 = tmp1.query(f\"{a}<=customer_id<{b}\").reset_index(drop=True)\n\n    if CFG.train:\n        tmp2 = pd.DataFrame(target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300])\n    else:\n        tmp2 = pd.DataFrame(original_df.query(f\"t_dat >= '{val_start_date}'\").groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300])\n\n    tmp1[\"tmp\"] = 0\n    tmp2[\"tmp\"] = 0\n\n    df = pd.merge(tmp1, tmp2, on=\"tmp\", how=\"outer\")\n\n    # ==========================================================================\n    #  Step2: items with the same product code as previously purchased items\n    # ==========================================================================\n\n    tmp3 = original_df[[\"article_id\", \"customer_id\"]].reset_index(drop=True)\n    tmp3 = tmp3[tmp3[\"customer_id\"].isin(tmp1[\"customer_id\"])].reset_index(drop=True)\n    tmp3 = pd.merge(tmp3, articles_df[[\"article_id\", \"product_code\"]], on=\"article_id\", how=\"left\")\n    tmp3 = tmp3.drop_duplicates([\"customer_id\", \"product_code\"])[[\"customer_id\", \"product_code\"]].reset_index(drop=True)\n\n    tmp4 = articles_df[articles_df[\"product_code\"].isin(tmp3[\"product_code\"].unique())][[\"article_id\", \"product_code\"]].reset_index(drop=True)\n    tmp4 = pd.merge(tmp3, tmp4, on=\"product_code\", how=\"outer\")[[\"customer_id\", \"article_id\"]]\n\n    if CFG.train:\n        tmp4 = tmp4[tmp4[\"article_id\"].isin(target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index)].reset_index(drop=True)\n    else:\n        tmp4 = tmp4[tmp4[\"article_id\"].isin(original_df.query(f\"t_dat >= '{val_start_date}'\").groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index)].reset_index(drop=True)\n\n    df = pd.concat([df, tmp4]).drop_duplicates([\"customer_id\", \"article_id\"], keep=\"last\").reset_index(drop=True)\n\n    # ==========================================================================\n    #  Make label\n    # ==========================================================================\n    if CFG.train:\n        tmp5 = target_df.drop_duplicates([\"customer_id\", \"article_id\"])[[\"article_id\", \"customer_id\"]].reset_index(drop=True)\n        tmp5[\"target\"] = 1\n\n        df = pd.merge(df, tmp5, on=[\"customer_id\", \"article_id\"], how=\"left\")\n        df[\"target\"] = df[\"target\"].fillna(0).astype(\"int8\")\n\n        del tmp5\n\n    del tmp1, tmp2, tmp3, tmp4, df[\"tmp\"]\n    gc.collect()\n\n    return df","metadata":{"id":"Ju2R2H5wMToS","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def add_article_information(df):\n    df = pd.merge(df, articles_df[[\"article_id\"]+ARTICLE_FEATURES], on=\"article_id\", how=\"left\")\n    return df","metadata":{"id":"hs8hsCrdRbbY","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def add_customer_information(df):\n    df = pd.merge(df, customers_df[[\"customer_id\", \"age\"]], on=\"customer_id\", how=\"left\")\n    return df","metadata":{"id":"jKSpW8gSWuKZ","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def cf_features(original_df, df):\n    def get_sim_item(df, user_col, item_col, use_iif=False):  \n        user_item_ = df.groupby(user_col)[item_col].agg(set).reset_index()  \n        user_item_dict = dict(zip(user_item_[user_col], user_item_[item_col]))\n\n        del user_item_\n        gc.collect()\n        \n        sim_item = {}\n        item_cnt = defaultdict(int)  \n        for user, items in tqdm(user_item_dict.items()):  \n            for i in items:\n                item_cnt[i] += 1\n                sim_item.setdefault(i, {})\n                for relate_item in items:  \n                    if not relate_item in popular_item:  \n                        continue  \n                    sim_item[i].setdefault(relate_item, 0)  \n                    if not use_iif:  \n                        sim_item[i][relate_item] += 1  \n                    else:  \n                        sim_item[i][relate_item] += 1 / math.log(1 + len(items))  \n        sim_item_corr = sim_item.copy()  \n        for i, related_items in tqdm(sim_item.items()):  \n            for j, cij in related_items.items():  \n                sim_item_corr[i][j] = cij/math.sqrt(item_cnt[i]*item_cnt[j])  \n    \n        return sim_item_corr, user_item_dict\n\n    def recommend(sim_item_corr, user_item_dict, user_id):  \n        rank = {}\n        interacted_items = user_item_dict[user_id]  \n        for i in interacted_items:\n            for j, wij in sorted(sim_item_corr[i].items(), key=lambda d: d[1], reverse=True): \n                rank.setdefault(j, 0)  \n                rank[j] += wij  \n        return sorted(rank.items(), key=lambda d: d[1], reverse=True)\n    \n    popular_item = target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n    item_sim_list, user_item = get_sim_item(transactions_df, user_col = 'customer_id', item_col = 'article_id', use_iif=True)\n\n    # Lấy danh sách unique customers và chia thành 14 phần\n    unique_customers = transactions_df[\"customer_id\"].unique()\n    total_customers = len(unique_customers)\n    customers_per_part = total_customers // 14\n    \n    for i in range(14):\n        # Tính chỉ số bắt đầu và kết thúc cho phần thứ i\n        start_idx = i * customers_per_part\n        if i == 13:  # Phần cuối cùng lấy hết customers còn lại\n            end_idx = total_customers\n        else:\n            end_idx = (i + 1) * customers_per_part\n        \n        # Lấy customers cho phần hiện tại\n        selected_customers = unique_customers[start_idx:end_idx]\n        \n        new_df = []\n        for c in tqdm(selected_customers):\n            if c in user_item:  # Kiểm tra customer có trong user_item dict\n                tmp = pd.DataFrame(recommend(item_sim_list, user_item, c))\n                tmp[\"customer_id\"] = c\n                new_df.append(tmp)\n        \n        if len(new_df) > 0:  # Chỉ concat nếu có data\n            new_df = pd.concat(new_df).reset_index(drop=True)\n            new_df = new_df.rename(columns={0: \"article_id\", 1: \"cf_score\"})\n            with open(OUTPUT_DIR + f\"cf_score_test{i}.pickle\", mode=\"wb\") as f:\n                pickle.dump(new_df, f, protocol=4)\n\n    for feature in [\"article_id\"]+ARTICLE_FEATURES:\n        if CFG.train:\n            with open(OUTPUT_DIR + f\"cf_score_{feature}.pickle\", 'rb') as f:\n                cf_score_df = pickle.load(f)\n        else:\n            with open(OUTPUT_DIR + f\"cf_score_{feature}_test{CFG.part}.pickle\", 'rb') as f:\n                cf_score_df = pickle.load(f)\n        \n        df = pd.merge(df, cf_score_df, on=[feature, \"customer_id\"], how=\"left\")\n        df[f\"cf_score_{feature}\"] = df[f\"cf_score_{feature}\"].astype(\"float16\")\n        \n        del cf_score_df\n        gc.collect()\n    \n    if CFG.train:\n        with open(OUTPUT_DIR + f\"cf_score_article_with_channel.pickle\", 'rb') as f:\n            cf_score_df = pickle.load(f)\n    else:\n        with open(OUTPUT_DIR + f\"cf_score_article_with_channel_test{CFG.part}.pickle\", 'rb') as f:\n            cf_score_df = pickle.load(f)\n    \n    cf_score_df[\"sales_channel_id\"] = cf_score_df[\"article_id\"].apply(lambda x: int(x[-1]))\n    cf_score_df[\"article_id\"] = cf_score_df[\"article_id\"].apply(lambda x: int(x[:-2]))\n\n    tmp1 = cf_score_df.pivot_table(values=['cf_score_article_with_channel'], index=['customer_id', 'article_id'], columns=['sales_channel_id'], aggfunc='sum').reset_index()\n    tmp1.columns = [\"customer_id\", \"article_id\", \"cf_score_article_offline\", \"cf_score_article_online\"]\n    tmp1 = tmp1.fillna(0)\n\n    tmp2 = cf_score_df.groupby([\"customer_id\", \"article_id\"])[\"cf_score_article_with_channel\"].agg(\"sum\").reset_index()\n\n    df = pd.merge(df, tmp1, on=[\"article_id\", \"customer_id\"], how=\"left\")\n    df = pd.merge(df, tmp2, on=[\"article_id\", \"customer_id\"], how=\"left\")\n\n    df[\"cf_score_article_with_channel\"] = df[\"cf_score_article_with_channel\"].astype(\"float16\")\n    df[\"cf_score_article_offline\"] = df[\"cf_score_article_offline\"].astype(\"float16\")\n    df[\"cf_score_article_online\"] = df[\"cf_score_article_online\"].astype(\"float16\")\n    \n    return df","metadata":{"id":"5Tvz0ytKcAKe","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def cf_features2(original_df, df):\n    def get_sim_item2(df, user_col, item_col, use_iif=False):  \n        user_item_ = df.groupby(user_col)[item_col].agg(set).reset_index()  \n        user_item_dict = dict(zip(user_item_[user_col], user_item_[item_col]))\n\n        del user_item_\n        gc.collect()\n        \n        sim_item = {}\n        item_cnt = defaultdict(int)  \n        for user, items in tqdm(user_item_dict.items()):  \n            for i in items:\n                item_cnt[i] += 1\n                sim_item.setdefault(i, {})\n                for relate_item in items:  \n                    if not relate_item in popular_item:  \n                        continue  \n                    sim_item[i].setdefault(relate_item, 0)  \n                    if not use_iif:  \n                        sim_item[i][relate_item] += 1  \n                    else:  \n                        sim_item[i][relate_item] += 1 / math.log(1 + len(items))  \n        sim_item_corr = sim_item.copy()  \n        for i, related_items in tqdm(sim_item.items()):  \n            for j, cij in related_items.items():  \n                sim_item_corr[i][j] = cij/item_cnt[i]  \n    \n        return sim_item_corr, user_item_dict\n\n    def recommend(sim_item_corr, user_item_dict, user_id):  \n        rank = {}\n        interacted_items = user_item_dict[user_id]  \n        for i in interacted_items:\n            for j, wij in sorted(sim_item_corr[i].items(), key=lambda d: d[1], reverse=True): \n                rank.setdefault(j, 0)  \n                rank[j] += wij  \n        return sorted(rank.items(), key=lambda d: d[1], reverse=True)\n    \n    popular_item = target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n    item_sim_list, user_item = get_sim_item2(transactions_df, user_col = 'customer_id', item_col = 'article_id', use_iif=False)\n\n    for i in range(14):\n        a = 100000*i\n        b = 100000*(i+1)\n        new_df = []\n        for c in tqdm(transactions_df.query(f\"{a}<=customer_id<{b}\")[\"customer_id\"].unique()):\n            tmp = pd.DataFrame(recommend(item_sim_list, user_item, c))\n            tmp[\"customer_id\"] = c\n            new_df.append(tmp)\n        new_df = pd.concat(new_df).reset_index(drop=True)\n        new_df = new_df.rename(columns={0: \"article_id\", 1: \"cf_score\"})\n        with open(OUTPUT_DIR + f\"cf_score_test{i}.pickle\", mode=\"wb\") as f:\n            pickle.dump(new_df, f, protocol=4)\n\n    if CFG.train:\n        with open(OUTPUT_DIR + \"cf_score_v2.pickle\", 'rb') as f:\n            cf_score_df = pickle.load(f)\n    else:\n        with open(OUTPUT_DIR + f\"cf_score_v2_test{CFG.part}.pickle\", 'rb') as f:\n            cf_score_df = pickle.load(f)\n    \n    cf_score_df = cf_score_df.rename(columns={\"cf_score\": \"cf_score2\"})\n    \n    df = pd.merge(df, cf_score_df, on=[\"article_id\", \"customer_id\"], how=\"left\")\n    df[\"cf_score2\"] = df[\"cf_score2\"].astype(\"float16\")\n    \n    del cf_score_df\n    gc.collect()\n    \n    return df","metadata":{"id":"D0IpQ5zBO2AY","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_sim_item2(df, user_col, item_col, use_iif=False):  \n    user_item_ = df.groupby(user_col)[item_col].agg(set).reset_index()  \n    user_item_dict = dict(zip(user_item_[user_col], user_item_[item_col]))\n\n    del user_item_\n    gc.collect()\n    \n    sim_item = {}\n    item_cnt = defaultdict(int)  \n    for user, items in tqdm(user_item_dict.items()):  \n        for i in items:\n            item_cnt[i] += 1\n            sim_item.setdefault(i, {})\n            for relate_item in items:  \n                if not relate_item in popular_item:  \n                    continue  \n                sim_item[i].setdefault(relate_item, 0)  \n                if not use_iif:  \n                    sim_item[i][relate_item] += 1  \n                else:  \n                    sim_item[i][relate_item] += 1 / math.log(1 + len(items))  \n    sim_item_corr = sim_item.copy()  \n    for i, related_items in tqdm(sim_item.items()):  \n        for j, cij in related_items.items():  \n            sim_item_corr[i][j] = cij/item_cnt[i]  \n\n    return sim_item_corr, user_item_dict","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def cf_features3(original_df, df):\n    def get_sim_item3(df, user_col, item_col, use_iif=False):  \n        user_item_ = df.groupby(user_col)[item_col].agg(set).reset_index()  \n        user_item_dict = dict(zip(user_item_[user_col], user_item_[item_col]))\n\n        del user_item_\n        gc.collect()\n        \n        sim_item = {}\n        item_cnt = defaultdict(int)  \n        for user, items in tqdm(user_item_dict.items()):  \n            for i in items:\n                item_cnt[i] += 1\n                sim_item.setdefault(i, {})\n                for relate_item in items:  \n                    if not relate_item in popular_item:  \n                        continue  \n                    sim_item[i].setdefault(relate_item, 0)  \n                    if not use_iif:  \n                        sim_item[i][relate_item] += 1  \n                    else:  \n                        sim_item[i][relate_item] += 1 / math.log(1 + len(items))  \n        sim_item_corr = sim_item.copy()  \n        for i, related_items in tqdm(sim_item.items()):  \n            for j, cij in related_items.items():  \n                sim_item_corr[i][j] = cij/item_cnt[j]\n    \n        return sim_item_corr, user_item_dict\n\n    def recommend(sim_item_corr, user_item_dict, user_id):  \n        rank = {}\n        interacted_items = user_item_dict[user_id]  \n        for i in interacted_items:\n            for j, wij in sorted(sim_item_corr[i].items(), key=lambda d: d[1], reverse=True): \n                rank.setdefault(j, 0)  \n                rank[j] += wij  \n        return sorted(rank.items(), key=lambda d: d[1], reverse=True)\n    \n    popular_item = target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n    item_sim_list, user_item = get_sim_item2(transactions_df, user_col = 'customer_id', item_col = 'article_id', use_iif=False)\n\n    for i in range(14):\n        a = 100000*i\n        b = 100000*(i+1)\n        new_df = []\n        for c in tqdm(transactions_df.query(f\"{a}<=customer_id<{b}\")[\"customer_id\"].unique()):\n            tmp = pd.DataFrame(recommend(item_sim_list, user_item, c))\n            tmp[\"customer_id\"] = c\n            new_df.append(tmp)\n        new_df = pd.concat(new_df).reset_index(drop=True)\n        new_df = new_df.rename(columns={0: \"article_id\", 1: \"cf_score\"})\n        with open(OUTPUT_DIR + f\"cf_score_test{i}.pickle\", mode=\"wb\") as f:\n            pickle.dump(new_df, f, protocol=4)\n\n    if CFG.train:\n        with open(OUTPUT_DIR + \"cf_score_v3.pickle\", 'rb') as f:\n            cf_score_df = pickle.load(f)\n    else:\n        with open(OUTPUT_DIR + f\"cf_score_v3_test{CFG.part}.pickle\", 'rb') as f:\n            cf_score_df = pickle.load(f)\n    \n    cf_score_df = cf_score_df.rename(columns={\"cf_score\": \"cf_score3\"})\n    \n    df = pd.merge(df, cf_score_df, on=[\"article_id\", \"customer_id\"], how=\"left\")\n    df[\"cf_score3\"] = df[\"cf_score3\"].astype(\"float16\")\n    \n    del cf_score_df\n    gc.collect()\n    \n    return df","metadata":{"id":"CuviW9PFQlm5","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def pair_ratio(original_df, df):\n    \"\"\"\n    pair.pickle is made by this code.\n    ----------------------------------------------------\n    new_df = pd.DataFrame()\n    for article in tqdm(df[\"article_id\"].unique()):\n        USERS = original_df.loc[original_df.article_id==article, \"customer_id\"].unique()\n        vc = original_df.loc[(original_df.customer_id.isin(USERS))&(original_df.article_id!=article)].drop_duplicates([\"customer_id\", \"article_id\"])[\"article_id\"].value_counts().reset_index()\n        vc.columns = [\"article_id\", \"pair_score\"]  # Đặt tên cột rõ ràng\n        vc[\"pair_score\"] = (vc[\"pair_score\"]/len(USERS)).astype(\"float16\")\n        tmp = pd.merge(original_df[[\"customer_id\", \"article_id\"]], vc, on=\"article_id\", how=\"left\")\n        tmp = tmp.groupby(\"customer_id\")[\"pair_score\"].agg([\"max\", \"mean\"]).reset_index().rename(columns={\"max\": \"max_pair_score\", \"mean\": \"mean_pair_score\"})\n        tmp[\"article_id\"] = article\n        new_df = pd.concat([new_df, tmp]).reset_index(drop=True)\n    ----------------------------------------------------\n    \"\"\"\n    \n    # Tạo pair.pickle nếu chưa tồn tại - lưu vào /kaggle/working\n    pair_file = \"/kaggle/working/\" + (\"pair.pickle\" if CFG.train else \"pair_test.pickle\")\n    \n    if not os.path.exists(pair_file):\n        print(f\"Creating {pair_file}...\")\n        new_df = pd.DataFrame()\n        \n        for article in tqdm(df[\"article_id\"].unique()):\n            USERS = original_df.loc[original_df.article_id==article, \"customer_id\"].unique()\n            vc = original_df.loc[(original_df.customer_id.isin(USERS))&(original_df.article_id!=article)].drop_duplicates([\"customer_id\", \"article_id\"])[\"article_id\"].value_counts().reset_index()\n            \n            # Sửa lỗi: đặt tên cột rõ ràng sau value_counts\n            vc.columns = [\"article_id\", \"pair_score\"]\n            vc[\"pair_score\"] = (vc[\"pair_score\"]/len(USERS)).astype(\"float16\")\n            \n            tmp = pd.merge(original_df[[\"customer_id\", \"article_id\"]], vc, on=\"article_id\", how=\"left\")\n            tmp = tmp.groupby(\"customer_id\")[\"pair_score\"].agg([\"max\", \"mean\"]).reset_index().rename(columns={\"max\": \"max_pair_score\", \"mean\": \"mean_pair_score\"})\n            tmp[\"article_id\"] = article\n            new_df = pd.concat([new_df, tmp]).reset_index(drop=True)\n        \n        # Lưu pair_ratio_df vào /kaggle/working\n        with open(pair_file, \"wb\") as f:\n            pickle.dump(new_df, f, protocol=4)\n        print(f\"Saved {pair_file}\")\n        pair_ratio_df = new_df\n    else:\n        # Load pair.pickle từ /kaggle/working nếu đã tồn tại\n        with open(pair_file, \"rb\") as f:\n            pair_ratio_df = pickle.load(f)\n    \n    df = pd.merge(df, pair_ratio_df, on=[\"customer_id\", \"article_id\"], how=\"left\")\n    df[\"max_pair_score\"] = df[\"max_pair_score\"].fillna(0).astype(\"float16\")\n    df[\"mean_pair_score\"] = df[\"mean_pair_score\"].fillna(0).astype(\"float16\")\n\n    del pair_ratio_df\n    gc.collect()\n\n    return df","metadata":{"id":"wNNfeCfSey5r","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def last_purchase_date(original_df, df):\n    \n    for feature in [\"article_id\"]+ARTICLE_FEATURES:\n        tmp = original_df.groupby([\"customer_id\", f\"{feature}\"])[\"day\"].agg(\"min\").reset_index().rename(columns={\"day\": f\"last_{feature}\"})\n        df = pd.merge(df, tmp, on=[\"customer_id\", f\"{feature}\"], how=\"left\")\n        df[f\"last_{feature}\"] = df[f\"last_{feature}\"].fillna(9999).astype(\"int16\")\n\n    del tmp\n    gc.collect()\n\n    return df","metadata":{"id":"OObP46atSUpg","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def weekly_count_features(original_df, df, week=5):\n\n    for col in [\"article_id\", \"product_code\"]:\n        tmp = original_df.query(f\"week<{week}\").groupby([col, \"week\"])[\"customer_id\"].nunique().unstack()\n        tmp.columns = [f\"{col}_week{i}_count\" for i in range(week)]\n        tmp = tmp.reset_index()\n        df = pd.merge(df, tmp, on=col, how=\"left\")\n        df[[f\"{col}_week{i}_count\" for i in range(week)]] = df[[f\"{col}_week{i}_count\" for i in range(week)]].fillna(0).astype(\"int16\")\n        df[f\"{col}_week0_change_rate\"] = (df[f\"{col}_week0_count\"]/df[f\"{col}_week1_count\"]).replace([np.inf, -np.inf], np.nan).astype(\"float16\")\n\n        del tmp\n        gc.collect()\n\n    return df","metadata":{"id":"XjuHMK9NAFJR","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def daily_count_features(original_df, df, day=7):\n\n    for col in [\"article_id\", \"product_code\"]:\n        tmp = original_df.query(f\"day<{day}\").groupby([col, \"day\"])[\"customer_id\"].nunique().unstack()\n        tmp.columns = [f\"{col}_day{i}_count\" for i in range(day)]\n        tmp = tmp.reset_index()\n        df = pd.merge(df, tmp, on=col, how=\"left\")\n        df[[f\"{col}_day{i}_count\" for i in range(day)]] = df[[f\"{col}_day{i}_count\" for i in range(day)]].fillna(0).astype(\"int16\")\n        df[f\"{col}_day0_change_rate\"] = (df[f\"{col}_day0_count\"]/df[f\"{col}_day1_count\"]).replace([np.inf, -np.inf], np.nan).astype(\"float16\")\n\n        del tmp\n        gc.collect()\n\n    return df","metadata":{"id":"mCjcgnrBHas0","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def last_year_count_features(original_df, df):\n\n    if CFG.train:\n        tmp1 = original_df.query(\"'2019-09-29'>=t_dat>='2019-09-09'\")\n    else:\n        tmp1 = original_df.query(\"'2019-10-06'>=t_dat>='2019-09-16'\")\n\n    for col in ARTICLE_FEATURES:\n        tmp2 = tmp1.groupby([\"customer_id\", col])[\"t_dat\"].count().reset_index().rename(columns={\"t_dat\": f\"last_year_{col}_count\"})\n        df = pd.merge(df, tmp2, on=[\"customer_id\", col], how=\"left\")\n        df[f\"last_year_{col}_count\"] = df[f\"last_year_{col}_count\"].fillna(0).astype(\"int16\")\n\n        del tmp2\n        gc.collect()\n\n    return df","metadata":{"id":"Z1PJe8npyym5","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def age_features(original_df, df):\n    # Tạo bản copy và chuyển đổi kiểu dữ liệu age\n    original_df_filtered = original_df[\n        (original_df['age'].notna()) & \n        (original_df['age'] > 0) & \n        (original_df['age'] < 120)\n    ].copy()\n    \n    # Chuyển age sang float32 hoặc int để tránh lỗi float16\n    original_df_filtered['age'] = original_df_filtered['age'].astype('float32')\n    \n    for feature in [\"article_id\"] + ARTICLE_FEATURES:\n        # Đếm số lượng unique customers cho mỗi age\n        tmp1 = (original_df_filtered\n                .groupby(\"age\")[\"customer_id\"]\n                .nunique()\n                .reset_index()\n                .rename(columns={\"customer_id\": \"user_count\"}))\n        \n        # Đếm số lượng unique customers đã mua feature đó ở mỗi age\n        tmp2 = (original_df_filtered\n                .groupby([\"age\", feature])[\"customer_id\"]\n                .nunique()\n                .reset_index()\n                .rename(columns={\"customer_id\": f\"{feature}_purchase_user_count\"}))\n        \n        # Merge và tính tỷ lệ\n        tmp2 = pd.merge(tmp2, tmp1, on=\"age\", how=\"left\")\n        \n        # Tính purchase rate\n        tmp2[f\"{feature}_purchase_rate_by_age\"] = (\n            tmp2[f\"{feature}_purchase_user_count\"] / tmp2[\"user_count\"]\n        ).fillna(0).astype(\"float16\")\n        \n        # Merge vào df chính\n        df = pd.merge(\n            df, \n            tmp2[[\"age\", feature, f\"{feature}_purchase_rate_by_age\"]], \n            on=[\"age\", feature], \n            how=\"left\"\n        )\n        \n        # Fill NaN với 0\n        df[f\"{feature}_purchase_rate_by_age\"] = (\n            df[f\"{feature}_purchase_rate_by_age\"]\n            .fillna(0)\n            .astype(\"float16\")\n        )\n        \n        del tmp1, tmp2\n        gc.collect()\n\n    del original_df_filtered\n    gc.collect()\n    \n    return df","metadata":{"id":"an3AcCqsA4FX","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def price_features(original_df, df):\n    tmp1 = original_df.groupby(\"customer_id\")[\"price\"].agg([\"max\", \"mean\"]).reset_index().rename(columns={\"max\": \"max_price_by_customer\", \"mean\": \"mean_price_by_customer\"})\n    df = pd.merge(df, tmp1, on=\"customer_id\", how=\"left\")\n    \n    tmp2 = original_df.query(\"week<4\").groupby(\"article_id\")[\"price\"].agg(\"mean\").reset_index().rename(columns={\"price\": \"mean_price_4w\"})\n    df = pd.merge(df, tmp2, on=\"article_id\", how=\"left\")\n    \n    del tmp1, tmp2\n    gc.collect()\n\n    df[\"higher_than_max_price\"] = 0\n    target_index = df[df[\"mean_price_4w\"]<=df[\"max_price_by_customer\"]].index\n    df.loc[target_index, \"higher_than_max_price\"] = 1\n    df[\"higher_than_max_price\"] = df[\"higher_than_max_price\"].astype(\"int8\")\n\n    df[\"higher_than_mean_price\"] = 0\n    target_index = df[df[\"mean_price_4w\"]<=df[\"mean_price_by_customer\"]].index\n    df.loc[target_index, \"higher_than_mean_price\"] = 1\n    df[\"higher_than_mean_price\"] = df[\"higher_than_mean_price\"].astype(\"int8\")\n    \n    return df","metadata":{"id":"x-UNSgTpVUB3","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def channel_features(original_df, df):\n\n    for w in [999, 3, 0]:\n        tmp1 = original_df.query(f\"week<={w}\").groupby(\"customer_id\")[\"sales_channel_id\"].agg([\"mean\", \"max\"])\n        tmp1.columns = [f\"mean_channel_{w}w_by_customer\", f\"max_channel_{w}w_by_customer\"]\n        df = pd.merge(df, tmp1, on=\"customer_id\", how=\"left\")\n\n        df[f\"max_channel_{w}w_by_customer\"] = df[f\"max_channel_{w}w_by_customer\"].fillna(0).astype(\"int8\")\n        df[f\"mean_channel_{w}w_by_customer\"] = df[f\"mean_channel_{w}w_by_customer\"].astype(\"float16\")\n\n        tmp2 = original_df.query(f\"week<={w}\").groupby(\"article_id\")[\"sales_channel_id\"].agg([\"mean\", \"max\"])\n        tmp2.columns = [f\"mean_channel_{w}w_by_article\", f\"max_channel_{w}w_by_article\"]\n        df = pd.merge(df, tmp2, on=\"article_id\", how=\"left\")\n\n        df[f\"max_channel_{w}w_by_article\"] = df[f\"max_channel_{w}w_by_article\"].fillna(0).astype(\"int8\")\n        df[f\"mean_channel_{w}w_by_article\"] = df[f\"mean_channel_{w}w_by_article\"].astype(\"float16\")\n    \n        df[f\"channel_score_mean_mean_{w}w\"] = (df[f\"mean_channel_{w}w_by_customer\"]*df[f\"mean_channel_{w}w_by_article\"] + (1-df[f\"mean_channel_{w}w_by_customer\"])*(1-df[f\"mean_channel_{w}w_by_article\"])).astype(\"float16\")\n        df[f\"channel_score_max_mean_{w}w\"] = (df[f\"max_channel_{w}w_by_customer\"]*df[f\"mean_channel_{w}w_by_article\"] + (1-df[f\"max_channel_{w}w_by_customer\"])*(1-df[f\"mean_channel_{w}w_by_article\"])).astype(\"float16\")\n        df[f\"channel_score_mean_max_{w}w\"] = (df[f\"mean_channel_{w}w_by_customer\"]*df[f\"max_channel_{w}w_by_article\"] + (1-df[f\"mean_channel_{w}w_by_customer\"])*(1-df[f\"max_channel_{w}w_by_article\"])).astype(\"float16\")\n        df[f\"channel_score_max_max_{w}w\"] = (df[f\"max_channel_{w}w_by_customer\"]*df[f\"max_channel_{w}w_by_article\"] + (1-df[f\"max_channel_{w}w_by_customer\"])*(1-df[f\"max_channel_{w}w_by_article\"])).astype(\"float16\")\n\n        del tmp1, tmp2\n        gc.collect()\n    \n    return df","metadata":{"id":"wzNZVrGyTxLi","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def purchase_ratio(original_df, df):\n    for feature in ARTICLE_FEATURES:\n        tmp1 = original_df.groupby([\"customer_id\", feature])[\"t_dat\"].count().reset_index().rename(columns={\"t_dat\": f\"purchase_ratio_{feature}\"})\n        tmp2 = original_df.groupby([\"customer_id\"])[\"t_dat\"].count().reset_index().rename(columns={\"t_dat\": \"tmp\"})\n        tmp1 = pd.merge(tmp1, tmp2, on=\"customer_id\", how=\"left\")\n        tmp1[f\"purchase_ratio_{feature}\"] = tmp1[f\"purchase_ratio_{feature}\"]/tmp1[\"tmp\"]\n        df = pd.merge(df, tmp1[[\"customer_id\", feature, f\"purchase_ratio_{feature}\"]], on=[\"customer_id\", feature], how=\"left\")\n        df[f\"purchase_ratio_{feature}\"] = df[f\"purchase_ratio_{feature}\"].fillna(0).astype(\"float16\")\n\n        del tmp1\n        gc.collect()\n\n    return df","metadata":{"id":"xLiQfp2KZNz6","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def gender_featuers(original_df, df):\n    \"\"\"\n    \"gender\" row is made using this function.\n    ----------------------------------------------------\n    def gender_flg(row):\n\n        row[\"gender\"] = \"Unknown\"\n        if row[\"index_group_name\"] in [\"Ladieswear\", \"Divided\"]:\n            row[\"gender\"] = \"Female\"\n        if row[\"index_group_name\"] == \"Menswear\":\n            row[\"gender\"] = \"Male\"\n        if row[\"index_group_name\"] == \"Sport\":\n            if \"men\" in row[\"department_name\"].lower():\n                row[\"gender\"] = \"Male\"\n            if \"ladies\" in row[\"department_name\"].lower():\n                row[\"gender\"] = \"Female\"\n\n        return row[\"gender\"]\n    ----------------------------------------------------\n    \"\"\"\n\n    with open(DATA_DIR + f\"gender.pickle\", 'rb') as f:\n        gender_df = pickle.load(f)\n    \n    original_df = pd.merge(original_df, gender_df, on=\"article_id\", how=\"left\")\n    df = pd.merge(df, gender_df, on=\"article_id\", how=\"left\")\n\n    tmp = original_df[original_df[\"gender\"]!=\"Unknown\"].reset_index(drop=True)\n    tmp[\"gender\"] = tmp[\"gender\"].apply(lambda x: 1 if x==\"Male\" else 0)\n    tmp = tmp.groupby([\"customer_id\"])[\"gender\"].agg(\"mean\").reset_index().rename(columns={\"gender\": \"gender_mean_by_customer\"})\n    df = pd.merge(df, tmp, on=\"customer_id\", how=\"left\")\n\n    target_index = df[df[\"gender\"]==\"Male\"].index\n    df[\"gender_score\"] = 1 - df[\"gender_mean_by_customer\"]\n    target_value = df.loc[:, \"gender_score\"].to_numpy()\n    target_value[target_index] = df[df[\"gender\"]==\"Male\"][\"gender_mean_by_customer\"].to_numpy()\n    df[\"gender_score\"] = target_value\n\n    df[\"gender_score\"] = df[\"gender_score\"].astype(\"float16\")\n    df[\"gender_mean_by_customer\"] = df[\"gender_mean_by_customer\"].astype(\"float16\")\n\n    del df[\"gender\"]\n    gc.collect()\n\n    return df","metadata":{"id":"OnSVp2mXQioI","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def datetime_features(original_df, df):\n    tmp = original_df.groupby([\"article_id\"])[\"day\"].agg(\"max\").reset_index().rename(columns={\"day\": \"release_date\"})\n    df = pd.merge(df, tmp, on=\"article_id\", how=\"left\")\n\n    original_df = pd.merge(original_df, tmp, on=\"article_id\", how=\"left\")\n    tmp = original_df.groupby([\"customer_id\"])[\"release_date\"].agg(\"mean\").reset_index().rename(columns={\"release_date\": \"mean_release_date_by_customer\"})\n    df = pd.merge(df, tmp, on=\"customer_id\", how=\"left\")\n    df[\"diff_mean_release_date\"] = df[\"mean_release_date_by_customer\"] - df[\"release_date\"]\n\n    df[\"release_date\"] = df[\"release_date\"].fillna(-1).astype(\"int16\")\n    df[\"diff_mean_release_date\"] = df[\"diff_mean_release_date\"].astype(\"float16\")\n    df[\"mean_release_date_by_customer\"] = df[\"mean_release_date_by_customer\"].astype(\"float16\")\n\n    return df","metadata":{"id":"d023ej5l2s19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def w2v_features(original_df, df):\n    \"\"\"\n    model_w2v is made by this code.\n    ----------------------------------------------------\n    popular_item = transactions_df.query(\"week <= 3\").groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:3000]\n    train_item2vec = transactions_df[transactions_df[\"article_id\"].isin(popular_item)].reset_index(drop=True)\n    train_item2vec = train_item2vec.query(f\"week <= 4\").reset_index(drop=True)\n    display(train_item2vec.head(5))\n\n    train_w2v = []\n    train_w2v_dict = {}\n    for i, v in train_item2vec.groupby(['customer_id']):\n        train_w2v.append(list(v.article_id))\n        train_w2v_dict[i] = list(v.article_id)\n\n    model_w2v = word2vec.Word2Vec(train_w2v,\n                            sg=1,\n                            hs=0,\n                            ns_exponent=0.5,\n                            window=4000,\n                            min_count=1,\n                            negative=15,\n                            seed=CFG.seed,\n                            workers=5,\n                            hashfxn=hashfxn,\n                            epochs=100)\n    ----------------------------------------------------\n    \"\"\"\n\n    with open(DATA_DIR + f\"model_w2v.pickle\", \"rb\") as f:\n        model_w2v = pickle.load(f)\n\n    if CFG.train:\n        popular_item3000 = target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:3000]\n        popular_item300 = target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n    else:\n        popular_item3000 = original_df.query(f\"t_dat >= '{val_start_date}'\").groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:3000]\n        popular_item300 = original_df.query(f\"t_dat >= '{val_start_date}'\").groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n        \n    df = original_df[original_df[\"article_id\"].isin(popular_item3000)].reset_index(drop=True)\n    df = df.query(f\"week <= 3\").reset_index(drop=True)\n\n    w2v_list = []\n    for i, v in df.groupby(['customer_id']):\n        w2v_list.append(list(v.article_id))\n    \n    customer_vec = np.array([np.sum(model_w2v.wv[v], axis=0) for v in w2v_list]).reshape(-1, 100)\n    popular_item300_vec = model_w2v.wv[list(popular_item300)]\n\n    new_df = pd.DataFrame(cosine_similarity(customer_vec.reshape(-1, 100), popular_item300_vec.reshape(-1, 100)))\n    new_df.columns = list(popular_item300)\n    new_df.index = df.sort_values(\"customer_id\")[\"customer_id\"].unique()\n    new_df = new_df.unstack().reset_index()\n    new_df.columns = [\"article_id\", \"customer_id\", \"w2v_cosine_similarity\"]\n\n    df = pd.merge(df, new_df, on=[\"customer_id\", \"article_id\"], how=\"left\")\n\n    del df, new_df\n    gc.collect()\n\n    return df","metadata":{"id":"XypVYmYfQkvz","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def repeat_features(original_df, df):\n    tmp1 = original_df.drop_duplicates([\"customer_id\", \"article_id\", \"t_dat\"]).reset_index(drop=True)\n    tmp1 = tmp1.groupby([\"customer_id\", \"article_id\"])[\"t_dat\"].agg(\"count\").reset_index().rename(columns={\"t_dat\": \"repeat_count\"})\n\n    tmp2 = tmp1.groupby([\"customer_id\"])[\"repeat_count\"].agg([\"mean\", \"max\", \"std\", \"count\", \"sum\"])\n    tmp2.columns = [\"mean_repeat_count_by_customer\", \"max_repeat_count_by_customer\", \"std_repeat_count_by_customer\", \"unique_count_by_customer\", \"count_by_customer\"]\n    tmp2[\"repeat_rate_by_customer\"] = (tmp2[\"count_by_customer\"]-tmp2[\"unique_count_by_customer\"])/tmp2[\"count_by_customer\"]\n\n    tmp3 = tmp1.groupby([\"article_id\"])[\"repeat_count\"].agg([\"mean\", \"max\", \"std\", \"count\", \"sum\"])\n    tmp3.columns = [\"mean_repeat_count_by_article_id\", \"max_repeat_count_by_article_id\", \"std_repeat_count_by_article_id\", \"unique_count_by_article_id\", \"count_by_article_id\"]\n    tmp3[\"repeat_rate_by_article_id\"] = (tmp3[\"count_by_article_id\"]-tmp3[\"unique_count_by_article_id\"])/tmp3[\"count_by_article_id\"]\n\n    tmp4 = original_df.groupby([\"customer_id\"])[\"day\"].agg(\"max\").reset_index().rename(columns={\"day\": \"max_day_by_customer\"})\n\n    df = pd.merge(df, tmp2, on=\"customer_id\", how=\"left\")\n    df = pd.merge(df, tmp3, on=\"article_id\", how=\"left\")\n    df = pd.merge(df, tmp4, on=\"customer_id\", how=\"left\")\n\n    del tmp1, tmp2, tmp3, tmp4\n    gc.collect()\n\n    df[\"multi_repeat_rate\"] = (df[\"repeat_rate_by_customer\"]*df[\"repeat_rate_by_article_id\"]).astype(\"float16\")\n    df[\"sub_repeat_rate\"] = (df[\"repeat_rate_by_customer\"]-df[\"repeat_rate_by_article_id\"]).astype(\"float16\")\n    df[\"span_by_customer\"] = (df[\"max_day_by_customer\"]/df[\"count_by_customer\"]).astype(\"float16\")\n\n    df[[\"max_repeat_count_by_article_id\", \"unique_count_by_article_id\", \"count_by_article_id\"]] = df[[\"max_repeat_count_by_article_id\", \"unique_count_by_article_id\", \"count_by_article_id\"]].fillna(0).astype(\"int16\")\n    df[[\"max_repeat_count_by_customer\", \"unique_count_by_customer\", \"count_by_customer\"]] = df[[\"max_repeat_count_by_customer\", \"unique_count_by_customer\", \"count_by_customer\"]].fillna(0).astype(\"int16\")\n    df[\"max_day_by_customer\"] = df[\"max_day_by_customer\"].fillna(-1).astype(\"int16\")\n\n    df[[\"mean_repeat_count_by_article_id\", \"std_repeat_count_by_article_id\", \"repeat_rate_by_article_id\"]] = df[[\"mean_repeat_count_by_article_id\", \"std_repeat_count_by_article_id\", \"repeat_rate_by_article_id\"]].astype(\"float16\")\n    df[[\"mean_repeat_count_by_customer\", \"std_repeat_count_by_customer\", \"repeat_rate_by_customer\"]] = df[[\"mean_repeat_count_by_customer\", \"std_repeat_count_by_customer\", \"repeat_rate_by_customer\"]].astype(\"float16\")\n    return df","metadata":{"id":"qL4I05dnxvsb","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def time_features(original_df, df):\n    \"\"\"Thêm features về thời gian mua hàng\"\"\"\n    \n    # Ngày trong tuần (0=Monday, 6=Sunday)\n    original_df[\"day_of_week\"] = original_df[\"t_dat\"].dt.dayofweek\n    \n    # Customer mua vào ngày nào trong tuần nhiều nhất?\n    tmp = original_df.groupby(\"customer_id\")[\"day_of_week\"].agg([\"mean\", \"std\"]).reset_index()\n    tmp.columns = [\"customer_id\", \"mean_dow_by_customer\", \"std_dow_by_customer\"]\n    df = pd.merge(df, tmp, on=\"customer_id\", how=\"left\")\n    df[\"mean_dow_by_customer\"] = df[\"mean_dow_by_customer\"].astype(\"float16\")\n    df[\"std_dow_by_customer\"] = df[\"std_dow_by_customer\"].fillna(0).astype(\"float16\")\n    \n    # Article được mua vào ngày nào nhiều nhất?\n    tmp = original_df.groupby(\"article_id\")[\"day_of_week\"].agg(\"mean\").reset_index()\n    tmp.columns = [\"article_id\", \"mean_dow_by_article\"]\n    df = pd.merge(df, tmp, on=\"article_id\", how=\"left\")\n    df[\"mean_dow_by_article\"] = df[\"mean_dow_by_article\"].astype(\"float16\")\n    \n    # Độ khớp ngày mua giữa customer và article\n    df[\"dow_match_score\"] = (1 - abs(df[\"mean_dow_by_customer\"] - df[\"mean_dow_by_article\"]) / 7).astype(\"float16\")\n    \n    del tmp\n    gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def customer_activity_features(original_df, df):\n    \"\"\"Features về mức độ active của customer\"\"\"\n    \n    tmp = original_df.groupby(\"customer_id\").agg({\n        \"t_dat\": [\"count\", \"nunique\"],  # Số lần mua, số ngày khác nhau\n        \"article_id\": \"nunique\",         # Số article unique đã mua\n        \"price\": [\"sum\", \"std\"],         # Tổng chi tiêu, độ biến động giá\n    })\n    tmp.columns = [\n        \"total_purchases\", \"active_days\", \n        \"unique_articles_bought\", \n        \"total_spending\", \"price_std_by_customer\"\n    ]\n    tmp = tmp.reset_index()\n    \n    # Tần suất mua (purchases per active day)\n    tmp[\"purchase_frequency\"] = (tmp[\"total_purchases\"] / tmp[\"active_days\"]).astype(\"float16\")\n    \n    # Diversity score (unique articles / total purchases)\n    tmp[\"diversity_score\"] = (tmp[\"unique_articles_bought\"] / tmp[\"total_purchases\"]).astype(\"float16\")\n    \n    # Convert dtypes\n    tmp[\"total_purchases\"] = tmp[\"total_purchases\"].astype(\"int16\")\n    tmp[\"active_days\"] = tmp[\"active_days\"].astype(\"int16\")\n    tmp[\"unique_articles_bought\"] = tmp[\"unique_articles_bought\"].astype(\"int16\")\n    tmp[\"total_spending\"] = tmp[\"total_spending\"].astype(\"float16\")\n    tmp[\"price_std_by_customer\"] = tmp[\"price_std_by_customer\"].fillna(0).astype(\"float16\")\n    \n    df = pd.merge(df, tmp, on=\"customer_id\", how=\"left\")\n    \n    del tmp\n    gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def interaction_depth_features(original_df, df):\n    \"\"\"Độ sâu tương tác giữa customer và các thuộc tính article\"\"\"\n    \n    # Đảm bảo original_df có các cột ARTICLE_FEATURES\n    if \"product_code\" not in original_df.columns:\n        original_df = pd.merge(original_df, articles_df[[\"article_id\"]+ARTICLE_FEATURES], on=\"article_id\", how=\"left\")\n    \n    for feature in ARTICLE_FEATURES:\n        # Số lượng unique values của feature mà customer đã mua\n        tmp = original_df.groupby(\"customer_id\")[feature].nunique().reset_index()\n        tmp.columns = [\"customer_id\", f\"unique_{feature}_count\"]\n        tmp[f\"unique_{feature}_count\"] = tmp[f\"unique_{feature}_count\"].astype(\"int16\")\n        df = pd.merge(df, tmp, on=\"customer_id\", how=\"left\")\n        \n        del tmp\n        gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def price_sensitivity_features(original_df, df):\n    \"\"\"Features về độ nhạy giá\"\"\"\n    \n    # Đảm bảo original_df có cột product_code\n    if \"product_code\" not in original_df.columns:\n        original_df = pd.merge(original_df, articles_df[[\"article_id\", \"product_code\"]], on=\"article_id\", how=\"left\")\n    \n    # Giá trung bình theo product_code\n    tmp1 = original_df.groupby(\"product_code\")[\"price\"].mean().reset_index()\n    tmp1.columns = [\"product_code\", \"mean_price_by_product_code\"]\n    \n    # Giá trung bình của article\n    tmp2 = original_df.groupby(\"article_id\")[\"price\"].mean().reset_index()\n    tmp2.columns = [\"article_id\", \"article_price\"]\n    \n    # Merge qua article_id trước (df đã có article_id và product_code từ add_article_information)\n    df = pd.merge(df, tmp2, on=\"article_id\", how=\"left\")\n    \n    # Merge tmp1 qua product_code (df đã có product_code)\n    if \"product_code\" in df.columns:\n        df = pd.merge(df, tmp1, on=\"product_code\", how=\"left\")\n    else:\n        # Nếu df chưa có product_code, merge qua article_id\n        tmp1_with_article = pd.merge(articles_df[[\"article_id\", \"product_code\"]], tmp1, on=\"product_code\", how=\"left\")\n        df = pd.merge(df, tmp1_with_article[[\"article_id\", \"mean_price_by_product_code\"]], on=\"article_id\", how=\"left\")\n    \n    # Article đắt/rẻ hơn trung bình của product_code?\n    df[\"price_vs_product_code\"] = ((df[\"article_price\"] - df[\"mean_price_by_product_code\"]) / (df[\"mean_price_by_product_code\"] + 0.01)).astype(\"float16\")\n    \n    df[\"mean_price_by_product_code\"] = df[\"mean_price_by_product_code\"].astype(\"float16\")\n    df[\"article_price\"] = df[\"article_price\"].astype(\"float16\")\n    \n    del tmp1, tmp2\n    gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def sequence_features(original_df, df):\n    \"\"\"Features về chuỗi mua hàng - sản phẩm thường được mua sau sản phẩm nào\"\"\"\n    \n    # Sort theo thời gian\n    tmp_df = original_df.sort_values([\"customer_id\", \"t_dat\"]).reset_index(drop=True)\n    tmp_df[\"prev_article\"] = tmp_df.groupby(\"customer_id\")[\"article_id\"].shift(1)\n    \n    # Đếm cặp (prev_article, article) xuất hiện bao nhiêu lần\n    pair_count = tmp_df.dropna(subset=[\"prev_article\"]).groupby(\n        [\"prev_article\", \"article_id\"]\n    ).size().reset_index(name=\"pair_freq\")\n    \n    # Normalize theo prev_article\n    prev_total = pair_count.groupby(\"prev_article\")[\"pair_freq\"].sum().reset_index(name=\"prev_total\")\n    pair_count = pd.merge(pair_count, prev_total, on=\"prev_article\")\n    pair_count[\"transition_prob\"] = (pair_count[\"pair_freq\"] / pair_count[\"prev_total\"]).astype(\"float16\")\n    \n    # Last article của mỗi customer\n    last_article = original_df.sort_values(\"t_dat\").groupby(\"customer_id\")[\"article_id\"].last().reset_index()\n    last_article.columns = [\"customer_id\", \"last_bought_article\"]\n    \n    df = pd.merge(df, last_article, on=\"customer_id\", how=\"left\")\n    \n    # Merge transition probability\n    pair_count = pair_count[[\"prev_article\", \"article_id\", \"transition_prob\"]]\n    pair_count.columns = [\"last_bought_article\", \"article_id\", \"transition_prob\"]\n    \n    df = pd.merge(df, pair_count, on=[\"last_bought_article\", \"article_id\"], how=\"left\")\n    df[\"transition_prob\"] = df[\"transition_prob\"].fillna(0).astype(\"float16\")\n    \n    # Clean up\n    del df[\"last_bought_article\"]\n    del tmp_df, pair_count, prev_total, last_article\n    gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def recency_weighted_features(original_df, df):\n    \"\"\"Features có trọng số theo recency - ngày gần hơn = weight cao hơn\"\"\"\n    \n    # Đảm bảo original_df có các cột cần thiết\n    if \"product_code\" not in original_df.columns:\n        original_df = pd.merge(original_df, articles_df[[\"article_id\", \"product_code\", \"colour_group_code\"]], on=\"article_id\", how=\"left\")\n    \n    # Tính weight theo recency (chỉ 1 lần)\n    original_df[\"recency_weight\"] = (1 / (original_df[\"day\"] + 1)).astype(\"float32\")\n    \n    # Weighted popularity cho article\n    tmp = original_df.groupby(\"article_id\")[\"recency_weight\"].sum().reset_index()\n    tmp.columns = [\"article_id\", \"recency_weighted_popularity\"]\n    tmp[\"recency_weighted_popularity\"] = tmp[\"recency_weighted_popularity\"].astype(\"float16\")\n    \n    df = pd.merge(df, tmp, on=\"article_id\", how=\"left\")\n    df[\"recency_weighted_popularity\"] = df[\"recency_weighted_popularity\"].fillna(0).astype(\"float16\")\n    \n    del tmp\n    gc.collect()\n    \n    # Tính customer total 1 lần duy nhất\n    customer_total = original_df.groupby(\"customer_id\")[\"recency_weight\"].sum().reset_index()\n    customer_total.columns = [\"customer_id\", \"recency_weight_total\"]\n    \n    # Weighted category preference cho customer\n    for feature in [\"product_code\", \"colour_group_code\"]:\n        tmp1 = original_df.groupby([\"customer_id\", feature])[\"recency_weight\"].sum().reset_index()\n        tmp1 = pd.merge(tmp1, customer_total, on=\"customer_id\")\n        tmp1[f\"recency_weighted_{feature}_pref\"] = (tmp1[\"recency_weight\"] / tmp1[\"recency_weight_total\"]).astype(\"float16\")\n        \n        # Merge qua article_id nếu df không có feature\n        if feature in df.columns:\n            df = pd.merge(df, tmp1[[\"customer_id\", feature, f\"recency_weighted_{feature}_pref\"]], \n                          on=[\"customer_id\", feature], how=\"left\")\n        else:\n            # Merge qua article_id\n            tmp1_with_article = pd.merge(articles_df[[\"article_id\", feature]], \n                                          tmp1[[\"customer_id\", feature, f\"recency_weighted_{feature}_pref\"]], \n                                          on=feature, how=\"left\")\n            df = pd.merge(df, tmp1_with_article[[\"customer_id\", \"article_id\", f\"recency_weighted_{feature}_pref\"]], \n                          on=[\"customer_id\", \"article_id\"], how=\"left\")\n        \n        df[f\"recency_weighted_{feature}_pref\"] = df[f\"recency_weighted_{feature}_pref\"].fillna(0).astype(\"float16\")\n        \n        del tmp1\n        gc.collect()\n    \n    # Clean up\n    del original_df[\"recency_weight\"], customer_total\n    gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def article_trend_features(original_df, df):\n    \"\"\"Xu hướng popularity của article theo thời gian\"\"\"\n    \n    # Tính popularity tuần 0 vs tuần 2-3 (trend dài hạn hơn)\n    week0 = original_df.query(\"week==0\").groupby(\"article_id\")[\"customer_id\"].nunique()\n    week23 = original_df.query(\"week>=2 and week<=3\").groupby(\"article_id\")[\"customer_id\"].nunique() / 2\n    \n    trend = (week0 - week23) / (week23 + 1)  # +1 để tránh chia 0\n    trend = trend.reset_index()\n    trend.columns = [\"article_id\", \"popularity_trend\"]\n    \n    df = pd.merge(df, trend, on=\"article_id\", how=\"left\")\n    df[\"popularity_trend\"] = df[\"popularity_trend\"].fillna(0).astype(\"float16\")\n    \n    # Rank của article trong tuần gần nhất (percentile)\n    rank = original_df.query(\"week==0\").groupby(\"article_id\")[\"customer_id\"].nunique()\n    rank = rank.rank(ascending=False, pct=True).reset_index()\n    rank.columns = [\"article_id\", \"popularity_rank_pct\"]\n    \n    df = pd.merge(df, rank, on=\"article_id\", how=\"left\")\n    df[\"popularity_rank_pct\"] = df[\"popularity_rank_pct\"].fillna(1).astype(\"float16\")\n    \n    del trend, rank\n    gc.collect()\n    \n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def make_dataset(original_df=transactions_df):\n\n    with timer(\"Make original_df features\"):\n        original_df = original_df_features(original_df=original_df)\n    \n    with timer(\"Make df\"):\n        df = make_df(original_df=original_df)\n    \n    # with timer(\"Make w2v features\"):\n    #    df = w2v_features(original_df=original_df, df=df)\n\n    with timer(\"Add article features\"):\n        original_df = add_article_information(df=original_df)\n        df = add_article_information(df=df)\n\n    with timer(\"Add customer features\"):\n        original_df = add_customer_information(df=original_df)\n        df = add_customer_information(df=df)\n    \n    with timer(\"Make repeat features\"):\n        df = repeat_features(original_df=original_df, df=df)\n    \n    with timer(\"Make last purchase features\"):\n        df = last_purchase_date(original_df=original_df, df=df)\n\n    with timer(\"Make weekly count features\"):\n        df = weekly_count_features(original_df=original_df, df=df)\n    \n    with timer(\"Make daily count features\"):\n        df = daily_count_features(original_df=original_df, df=df)\n    \n    with timer(\"Make last year count features\"):\n        df = last_year_count_features(original_df=original_df, df=df)\n\n    with timer(\"Make price features\"):\n        df = price_features(original_df=original_df, df=df)\n    \n    with timer(\"Make channel features\"):\n        df = channel_features(original_df=original_df, df=df)\n\n    with timer(\"Make purchase ratio features\"):\n        df = purchase_ratio(original_df=original_df, df=df)\n    \n    with timer(\"Make datetime features\"):\n        df = datetime_features(original_df=original_df, df=df)\n\n    # with timer(\"Make cf features\"):\n    #     df = cf_features(original_df=original_df, df=df)\n    \n    # with timer(\"Make cf features2\"):\n    #     df = cf_features2(original_df=original_df, df=df)\n\n    # with timer(\"Make time features\"):\n    #     df = time_features(original_df=original_df, df=df)\n    \n    # with timer(\"Make customer activity features\"):\n    #     df = customer_activity_features(original_df=original_df, df=df)\n    \n    # with timer(\"Make article trend features\"):\n    #     df = article_trend_features(original_df=original_df, df=df)\n    \n    # with timer(\"Make interaction depth features\"):\n    #     df = interaction_depth_features(original_df=original_df, df=df)\n    \n    with timer(\"Make price sensitivity features\"):\n        df = price_sensitivity_features(original_df=original_df, df=df)\n    \n    # with timer(\"Make sequence features\"):\n    #     df = sequence_features(original_df=original_df, df=df)\n    \n    # with timer(\"Make recency weighted features\"):\n    #     df = recency_weighted_features(original_df=original_df, df=df)\n\n        \n    display(df.head(10))\n\n    return df","metadata":{"id":"TkT1mF5QIg6i","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def calculate_and_save_cf_features(original_df, target_df):\n#     \"\"\"\n#     Tính toán và lưu các cf_score features\n#     \"\"\"\n#     def get_sim_item(df, user_col, item_col, use_iif=False):  \n#         user_item_ = df.groupby(user_col)[item_col].agg(set).reset_index()  \n#         user_item_dict = dict(zip(user_item_[user_col], user_item_[item_col]))\n\n#         del user_item_\n#         gc.collect()\n        \n#         sim_item = {}\n#         item_cnt = defaultdict(int)  \n#         for user, items in tqdm(user_item_dict.items()):  \n#             for i in items:\n#                 item_cnt[i] += 1\n#                 sim_item.setdefault(i, {})\n#                 for relate_item in items:  \n#                     if not relate_item in popular_item:  \n#                         continue  \n#                     sim_item[i].setdefault(relate_item, 0)  \n#                     if not use_iif:  \n#                         sim_item[i][relate_item] += 1  \n#                     else:  \n#                         sim_item[i][relate_item] += 1 / math.log(1 + len(items))  \n#         sim_item_corr = sim_item.copy()  \n#         for i, related_items in tqdm(sim_item.items()):  \n#             for j, cij in related_items.items():  \n#                 sim_item_corr[i][j] = cij/math.sqrt(item_cnt[i]*item_cnt[j])  \n    \n#         return sim_item_corr, user_item_dict\n\n#     def recommend(sim_item_corr, user_item_dict, user_id):  \n#         rank = {}\n#         interacted_items = user_item_dict[user_id]  \n#         for i in interacted_items:\n#             for j, wij in sorted(sim_item_corr[i].items(), key=lambda d: d[1], reverse=True): \n#                 rank.setdefault(j, 0)  \n#                 rank[j] += wij  \n#         return sorted(rank.items(), key=lambda d: d[1], reverse=True)\n    \n#     # Lấy top 300 popular items\n#     if CFG.train:\n#         popular_item = target_df.groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n#     else:\n#         popular_item = original_df.query(f\"t_dat >= '{val_start_date}'\").groupby([\"article_id\"])[\"customer_id\"].nunique().sort_values(ascending=False).index[:300]\n    \n#     print(\"Calculating item similarity matrix...\")\n#     item_sim_list, user_item = get_sim_item(original_df, user_col='customer_id', item_col='article_id', use_iif=True)\n\n#     # Tính cho article_id\n#     print(\"\\n=== Calculating cf_score for article_id ===\")\n#     if CFG.train:\n#         new_df = []\n#         for c in tqdm(original_df[\"customer_id\"].unique()):\n#             if c in user_item:\n#                 tmp = pd.DataFrame(recommend(item_sim_list, user_item, c))\n#                 tmp[\"customer_id\"] = c\n#                 new_df.append(tmp)\n#         new_df = pd.concat(new_df).reset_index(drop=True)\n#         new_df = new_df.rename(columns={0: \"article_id\", 1: \"cf_score_article_id\"})\n#         with open(OUTPUT_DIR + \"cf_score_article_id.pickle\", mode=\"wb\") as f:\n#             pickle.dump(new_df, f, protocol=4)\n#         print(f\"Saved cf_score_article_id.pickle\")\n#     else:\n#         # Chia thành 14 phần cho inference\n#         unique_customers = original_df[\"customer_id\"].unique()\n#         total_customers = len(unique_customers)\n#         customers_per_part = total_customers // 14\n        \n#         for i in range(14):\n#             start_idx = i * customers_per_part\n#             if i == 13:\n#                 end_idx = total_customers\n#             else:\n#                 end_idx = (i + 1) * customers_per_part\n            \n#             selected_customers = unique_customers[start_idx:end_idx]\n            \n#             new_df = []\n#             for c in tqdm(selected_customers):\n#                 if c in user_item:\n#                     tmp = pd.DataFrame(recommend(item_sim_list, user_item, c))\n#                     tmp[\"customer_id\"] = c\n#                     new_df.append(tmp)\n            \n#             if len(new_df) > 0:\n#                 new_df = pd.concat(new_df).reset_index(drop=True)\n#                 new_df = new_df.rename(columns={0: \"article_id\", 1: \"cf_score_article_id\"})\n#                 with open(OUTPUT_DIR + f\"cf_score_article_id_test{i}.pickle\", mode=\"wb\") as f:\n#                     pickle.dump(new_df, f, protocol=4)\n#                 print(f\"Saved cf_score_article_id_test{i}.pickle\")\n\n#     # Merge với articles_df để có các ARTICLE_FEATURES\n#     original_df_with_features = pd.merge(\n#         original_df[['customer_id', 'article_id']], \n#         articles_df[['article_id'] + ARTICLE_FEATURES], \n#         on='article_id', \n#         how='left'\n#     )\n    \n#     # Tính cho từng feature trong ARTICLE_FEATURES\n#     for feature in tqdm(ARTICLE_FEATURES):\n#         print(f\"\\n=== Calculating cf_score for {feature} ===\")\n        \n#         # Tạo sim_item cho feature này\n#         feature_sim_list, feature_user_item = get_sim_item(\n#             original_df_with_features, \n#             user_col='customer_id', \n#             item_col=feature, \n#             use_iif=True\n#         )\n        \n#         if CFG.train:\n#             new_df = []\n#             for c in tqdm(original_df[\"customer_id\"].unique()):\n#                 if c in feature_user_item:\n#                     tmp = pd.DataFrame(recommend(feature_sim_list, feature_user_item, c))\n#                     tmp[\"customer_id\"] = c\n#                     new_df.append(tmp)\n#             new_df = pd.concat(new_df).reset_index(drop=True)\n#             new_df = new_df.rename(columns={0: feature, 1: f\"cf_score_{feature}\"})\n#             with open(OUTPUT_DIR + f\"cf_score_{feature}.pickle\", mode=\"wb\") as f:\n#                 pickle.dump(new_df, f, protocol=4)\n#             print(f\"Saved cf_score_{feature}.pickle\")\n#         else:\n#             # Chia thành 14 phần\n#             unique_customers = original_df[\"customer_id\"].unique()\n#             total_customers = len(unique_customers)\n#             customers_per_part = total_customers // 14\n            \n#             for i in range(14):\n#                 start_idx = i * customers_per_part\n#                 if i == 13:\n#                     end_idx = total_customers\n#                 else:\n#                     end_idx = (i + 1) * customers_per_part\n                \n#                 selected_customers = unique_customers[start_idx:end_idx]\n                \n#                 new_df = []\n#                 for c in tqdm(selected_customers):\n#                     if c in feature_user_item:\n#                         tmp = pd.DataFrame(recommend(feature_sim_list, feature_user_item, c))\n#                         tmp[\"customer_id\"] = c\n#                         new_df.append(tmp)\n                \n#                 if len(new_df) > 0:\n#                     new_df = pd.concat(new_df).reset_index(drop=True)\n#                     new_df = new_df.rename(columns={0: feature, 1: f\"cf_score_{feature}\"})\n#                     with open(OUTPUT_DIR + f\"cf_score_{feature}_test{i}.pickle\", mode=\"wb\") as f:\n#                         pickle.dump(new_df, f, protocol=4)\n#                     print(f\"Saved cf_score_{feature}_test{i}.pickle\")\n\n#     # Tính cf_score_article_with_channel\n#     print(\"\\n=== Calculating cf_score_article_with_channel ===\")\n    \n#     # Thêm cột sales_channel_id vào article_id để tạo key kết hợp\n#     original_df_channel = original_df.copy()\n#     original_df_channel['article_channel'] = original_df_channel['article_id'].astype(str) + '_' + original_df_channel['sales_channel_id'].astype(str)\n    \n#     channel_sim_list, channel_user_item = get_sim_item(\n#         original_df_channel,\n#         user_col='customer_id',\n#         item_col='article_channel',\n#         use_iif=True\n#     )\n    \n#     if CFG.train:\n#         new_df = []\n#         for c in tqdm(original_df[\"customer_id\"].unique()):\n#             if c in channel_user_item:\n#                 tmp = pd.DataFrame(recommend(channel_sim_list, channel_user_item, c))\n#                 tmp[\"customer_id\"] = c\n#                 new_df.append(tmp)\n#         new_df = pd.concat(new_df).reset_index(drop=True)\n#         new_df = new_df.rename(columns={0: \"article_channel\", 1: \"cf_score_article_with_channel\"})\n        \n#         # Tách article_id và sales_channel_id\n#         new_df[['article_id', 'sales_channel_id']] = new_df['article_channel'].str.split('_', expand=True)\n#         new_df['article_id'] = new_df['article_id'].astype(int)\n#         new_df['sales_channel_id'] = new_df['sales_channel_id'].astype(int)\n#         new_df = new_df.drop('article_channel', axis=1)\n        \n#         with open(OUTPUT_DIR + \"cf_score_article_with_channel.pickle\", mode=\"wb\") as f:\n#             pickle.dump(new_df, f, protocol=4)\n#         print(f\"Saved cf_score_article_with_channel.pickle\")\n#     else:\n#         # Chia thành 14 phần\n#         unique_customers = original_df[\"customer_id\"].unique()\n#         total_customers = len(unique_customers)\n#         customers_per_part = total_customers // 14\n        \n#         for i in range(14):\n#             start_idx = i * customers_per_part\n#             if i == 13:\n#                 end_idx = total_customers\n#             else:\n#                 end_idx = (i + 1) * customers_per_part\n            \n#             selected_customers = unique_customers[start_idx:end_idx]\n            \n#             new_df = []\n#             for c in tqdm(selected_customers):\n#                 if c in channel_user_item:\n#                     tmp = pd.DataFrame(recommend(channel_sim_list, channel_user_item, c))\n#                     tmp[\"customer_id\"] = c\n#                     new_df.append(tmp)\n            \n#             if len(new_df) > 0:\n#                 new_df = pd.concat(new_df).reset_index(drop=True)\n#                 new_df = new_df.rename(columns={0: \"article_channel\", 1: \"cf_score_article_with_channel\"})\n                \n#                 # Tách article_id và sales_channel_id\n#                 new_df[['article_id', 'sales_channel_id']] = new_df['article_channel'].str.split('_', expand=True)\n#                 new_df['article_id'] = new_df['article_id'].astype(int)\n#                 new_df['sales_channel_id'] = new_df['sales_channel_id'].astype(int)\n#                 new_df = new_df.drop('article_channel', axis=1)\n                \n#                 with open(OUTPUT_DIR + f\"cf_score_article_with_channel_test{i}.pickle\", mode=\"wb\") as f:\n#                     pickle.dump(new_df, f, protocol=4)\n#                 print(f\"Saved cf_score_article_with_channel_test{i}.pickle\")\n\n#     print(\"\\n=== Finished calculating all cf_features ===\")\n\n# # Gọi hàm này trước khi chạy make_dataset\n# calculate_and_save_cf_features(transactions_df, target_df)","metadata":{"id":"PiPeSalycYZ-","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = make_dataset(original_df=transactions_df)\ndf = df.drop('age', axis=1)","metadata":{"id":"yjo-qerZU0Kv","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\n# Create the directory if it doesn't exist\nexp_dir = os.path.join(OUTPUT_DIR, f\"exp{CFG.exp}\")\nos.makedirs(exp_dir, exist_ok=True)\n\nif CFG.train:\n    with open(os.path.join(exp_dir, \"df.pickle\"), mode=\"wb\") as f:\n        pickle.dump(df, f, protocol=4)\nelse:\n    with open(os.path.join(exp_dir, f\"test{CFG.part}.pickle\"), mode=\"wb\") as f:\n        pickle.dump(df, f, protocol=4)","metadata":{"id":"duoMpRH-4K17","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"del transactions_df\ngc.collect()","metadata":{"id":"yc8xaIoR_0Oo","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model","metadata":{"id":"od_0VyUTcIFM"}},{"cell_type":"code","source":"def make_fold(df, seed=CFG.seed, folds=CFG.fold):\n    unique_customer = df[\"customer_id\"].unique()\n    fold = np.zeros(len(df), dtype=int)\n    kf = KFold(n_splits=folds, shuffle=True, random_state=seed)\n    for i_fold, (tr_group_idx, va_group_idx) in enumerate(kf.split(unique_customer)):\n        tr_groups, va_groups = unique_customer[tr_group_idx], unique_customer[va_group_idx]\n        is_va = df[df[\"customer_id\"].isin(va_groups)].index\n        fold[is_va] = i_fold\n    return fold","metadata":{"id":"qxizlIvPiR5M","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def calc_score(X_val, val_pred):\n    X_val[\"prediction\"] = val_pred\n    X_val = X_val.sort_values(\"prediction\", ascending=False).reset_index(drop=True)\n    new_df = X_val.groupby([\"customer_id\"])[\"article_id\"].apply(list).reset_index().rename(columns={\"article_id\": \"prediction\"})\n    new_df[\"prediction\"] = new_df[\"prediction\"].apply(lambda x: x[:12])\n    \n    # Sửa ở đây: cần group article_id từ target_df thành list\n    target_grouped = target_df.groupby(\"customer_id\")[\"article_id\"].apply(list).reset_index()\n    new_df = pd.merge(new_df, target_grouped, on=\"customer_id\", how=\"left\")\n    \n    score = mapk(new_df['article_id'], new_df['prediction'], k=12)\n    return score","metadata":{"id":"lld5OoschGxQ","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def run_catboost(param, df):\n    \n    oof_pred = np.zeros(len(df))\n    feature_importance_df = pd.DataFrame()\n    score_list = []\n    \n    folds_idx = make_fold(df)\n    oof_pred = np.zeros(len(df))\n\n    for fold in range(CFG.fold):\n\n        if fold in CFG.used_fold:\n\n            LOGGER.info(f\"==============================================\")\n            LOGGER.info(f\"▶︎ Start fold{fold} Training\")\n            LOGGER.info(f\"==============================================\")\n\n            tr_idx = np.argwhere(folds_idx != fold).reshape(-1)\n            va_idx = np.argwhere(folds_idx == fold).reshape(-1)\n            X_trn, X_val = df.loc[tr_idx].reset_index(drop=True), df.loc[va_idx].reset_index(drop=True)\n            y_trn, y_val = df.loc[tr_idx, CFG.target].reset_index(drop=True), df.loc[va_idx, CFG.target].reset_index(drop=True)\n\n            LOGGER.info(f\"train_shape: {X_trn.shape}, val_shape: {X_val.shape}\")\n\n            train = Pool(X_trn.drop(columns=[CFG.target]+DROP_COLS), y_trn, cat_features=CATEGORICAL_COLS)\n            valid = Pool(X_val.drop(columns=[CFG.target]+DROP_COLS), y_val, cat_features=CATEGORICAL_COLS)\n\n            model = CatBoost(param)\n            model = model.fit(\n                        train,\n                        eval_set=valid,\n                        use_best_model=True,\n                        early_stopping_rounds=100,\n                        verbose_eval=200\n                        )\n            \n            # ==============================================\n            #  Feature Importances\n            # ==============================================\n\n            fold_importance_df = pd.DataFrame()\n            fold_importance_df[\"feature\"] = model.feature_names_\n            fold_importance_df[\"importance\"] = model.feature_importances_\n            fold_importance_df[\"fold\"] = fold\n            feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n\n            # ==============================================\n            #  Calculate Score\n            # ==============================================\n            val_pred = model.predict(X_val.drop(columns=[CFG.target]+DROP_COLS), prediction_type='Probability').T[1]\n            score = calc_score(X_val, val_pred)\n\n            LOGGER.info(f\"fold{fold} score: {score:.6f}\")\n\n            oof_pred[va_idx] = val_pred\n            score_list.append([fold, score])\n\n            # ==============================================\n            # Save model\n            # ==============================================\n            pickle.dump(model, open(OUTPUT_DIR + f'model_fold{fold}.pkl', 'wb'))\n            \n            del model, X_trn, X_val, y_trn, y_val, train, valid\n            gc.collect()\n    \n    score_df = pd.DataFrame(\n        score_list, columns=[\"fold\", \"IoU\"])\n \n    return oof_pred, score_df, feature_importance_df\n\ndef show_feature_importance(feature_importance_df):\n    order = list(feature_importance_df.groupby(\"feature\").mean().sort_values(\"importance\", ascending=False).index)\n    plt.figure(figsize=(10, 15))\n    sns.barplot(x=\"importance\", y=\"feature\", data=feature_importance_df, order=order)\n    plt.title(\"feature importance\")\n    plt.tight_layout()\n    plt.savefig(OUTPUT_DIR+'feature_importance.png')","metadata":{"id":"9DF7kcKPCy_K","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if CFG.train:\n    oof_pred, score_df, feature_importance_df = run_catboost(PARAMS, df)\n    display(score_df)","metadata":{"id":"exUpRIsZCzCA","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Inference","metadata":{"id":"HI8LD3bFQqD4"}},{"cell_type":"code","source":"def inference(X_test):\n    tmp_test_pred = np.zeros(len(X_test))\n    for fold in tqdm(range(CFG.fold)):\n        if fold in CFG.used_fold:\n            with open(MODEL_DIR + f\"model_fold{fold}.pkl\", 'rb') as f:\n                model = pickle.load(f)\n            tmp_test_pred += model.predict(X_test.drop(columns=DROP_COLS), prediction_type='Probability').T[1]\n    tmp_test_pred = tmp_test_pred / len(CFG.used_fold)\n    X_test = X_test[[\"customer_id\", \"article_id\"]]\n    X_test[\"prediction\"] = tmp_test_pred\n    return X_test","metadata":{"id":"kyaCFpIOCzFx","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(14):\n    with open(DATA_DIR + f\"exp{CFG.exp}/test{i}.pickle\", \"rb\") as f:\n        test = pickle.load(f)\n    test = inference(test)\n    with open(OUTPUT_DIR + f\"exp{CFG.exp}/test{i}.pickle\", mode=\"wb\") as f:\n        pickle.dump(test, f)\n    del test\n    gc.collect()","metadata":{"id":"IMDsL-9kCzH6","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if not(CFG.train):\n\n    output_df = pd.DataFrame()\n    for i in tqdm(range(14)):\n        with open(OUTPUT_DIR + f\"exp{CFG.exp}/test{i}.pickle\", \"rb\") as f:\n            df = pickle.load(f)\n        df = df[[\"customer_id\", \"article_id\", \"prediction\"]]\n\n        # convert to submission format\n        df = df.sort_values(\"prediction\", ascending=False)\n        df = df.groupby(\"customer_id\")[\"article_id\"].apply(list).reset_index()\n        df = df.rename(columns={\"article_id\": \"prediction\"})\n        df[\"prediction\"] = df[\"prediction\"].apply(lambda x: x[:12])\n\n        output_df = pd.concat([output_df, df]).reset_index(drop=True)\n        del df\n        gc.collect()\n\n    # convert numbers to customer_id/article_id\n    with open(MODEL_DIR + \"num_to_customer_id.pkl\", 'rb') as f:\n        customer_id_dict = pickle.load(f)\n    with open(MODEL_DIR + \"num_to_article_id.pkl\", 'rb') as f:\n        article_id_dict = pickle.load(f)\n\n    output_df[\"customer_id\"] = output_df[\"customer_id\"].map(customer_id_dict)\n    output_df[\"prediction\"] = output_df[\"prediction\"].apply(lambda x: sorted(set(x), key=x.index)[:12])\n    output_df[\"prediction\"] = output_df[\"prediction\"].apply(lambda x: [article_id_dict[e] for e in x])\n    output_df[\"prediction\"] = output_df[\"prediction\"].apply(lambda x: \" \".join(x))\n\n    output_df[[\"customer_id\", \"prediction\"]].to_csv(OUTPUT_DIR + \"submission.csv\", index=False)\n#    !kaggle competitions submit -c h-and-m-personalized-fashion-recommendations -f\"{OUTPUT_DIR}submission.csv\" -m f\"exp{CFG.exp}\"","metadata":{"id":"tk8q0UpQQzSd","trusted":true},"outputs":[],"execution_count":null}]}