hate these ads?, log in or register to hide them
Page 125 of 125 FirstFirst ... 2575115122123124125
Results 2,481 to 2,495 of 2495

Thread: <xml><thread isTerrible="true" isUnderstandable="false" /></xml> - Coding help thread

  1. #2481
    Donor halbarad's Avatar
    Join Date
    April 9, 2011
    Posts
    4,962
    Customers are the best, I'm dealing with one who are finally moving from TFS 2008 and their build process is all sorts of fucked up.

    They've got a tool which checks out files, updates values in it and checks it back in, all on a different part of the code base to what they are building. They have some steps that copy files from "temp build" folders on entirely different drives (hard coded of course) with no one sure why it's doing it. And a whole pile of other fuckery that I haven't even delved into yet.

    I can't wait to get them onto VSTS and get their builds working a more sensible way. Then we can deal with their VB6 builds after that.

  2. #2482

    Join Date
    April 13, 2011
    Posts
    6,498
    Quote Originally Posted by Hel OWeen View Post
    Aha, didn't know that was possible. Browsing the "Price" section of Github for self-hosted Enterprise has that typical "Contact Sales", which often means it costs quite some bucks.
    It's expensive, but not extremely so. I think we're paying about $12/user/month. Given it's a business critical tool for everyone who uses it that's perfectly reasonable.

    So given that possibility vs. some other self-hosted alternatives which are free, i.e. GitLab community, what's the advantage of doing so? Is GitHub's functionality that much better (for enterprises)?
    No. Actually GitHub's functionality is absolute pants. It is very very good at being a repository, but almost every other feature is sub-par. The code search and navigation features are stone age, the issues system isn't used by anyone at all anywhere, the code review system is absolutely naff etc. etc. Beyond its core function Github is light years behind the competition. Put it next to likes of UpSource (which is _awesome_) or even Bitbucket and it looks like shit.

    What it is is very, very reliable, easy to manage and universally understood by anyone you're ever going to hire. Gitlab in particular is a good counter-example to this. Go take a look how many components they've glued together under the covers. It's a management nightmare.

  3. #2483
    halka's Avatar
    Join Date
    April 19, 2011
    Location
    SVK
    Posts
    2,023
    Quote Originally Posted by elmicker View Post
    Gitlab in particular is a good counter-example to this. Go take a look how many components they've glued together under the covers. It's a management nightmare.
    QFT. For a time we've tried to keep a local GitLab installation up-to-date by upgrading everything manually, which got to be a pain in the ass pretty soon. We've switched to omnibus distribution, which you can pretty much consider a black box, pretty soon after.
    All expressed opinions match those of my employers, hail satan

  4. #2484

    Join Date
    May 31, 2011
    Posts
    4,032
    Quote Originally Posted by elmicker View Post
    Gitlab in particular is a good counter-example to this. Go take a look how many components they've glued together under the covers. It's a management nightmare.
    I can't tell for the code base or the components, because I know not nearly enough about Linux, let alone specific components.

    But I, as a complete Linux noob (as in "know how to power on the virtual machine, but that's it" noob), set up a GitLab server for me here about ~ 2 years ago. It took me ~ 2 man days to have it up and running. That includes the Ubuntu server installation and have it authorize user login with our AD server. Since then, I just did the apt upgrade dance and with the exception of one time*), everything has worked ever since.

    Granted, I don't use most of the more advanced features, e.g. CI, so can't tell if those do a good job or if they're a mess as well.

    *) a Google search turned up that the community already found the issue and provided easy to follow (even for me) steps to fix it. The next day Gitlab followed up with an update.

  5. #2485
    NoirAvlaa's Avatar
    Join Date
    April 12, 2011
    Location
    Liverpool, laaaa
    Posts
    4,918
    For those that use VS Code:

    https://www.visualstudio.com/services/live-share/

    Looks nice :>

  6. #2486

    Join Date
    April 13, 2011
    Posts
    6,498
    Quote Originally Posted by I Legionnaire View Post
    Thanks for this, interesting video. I had a good chuckle at "JavaScript is the best dynamic language", because terrifyingly that really is how web developers think.

    I've got to fundamentally disagree with at least one of the things he thinks he got wrong. Obviously fucking up futures and some of the internals of node_modules are a colossal fuckup, but other aspects like the verbosity of package.json are actually a really good thing - the core issue with the packaging in node is the close coupling to NPM the company and lack of diversity and governance in repo management. Npm the software apes Maven in many ways, and that's a good thing. It should ape Maven's conventions even further imo - what he's proposing for deno looks like a nightmare for long term maintainability. Mixing resolution mechanisms like that looks cool, but it's a bad idea. Conforming to the "way web does it" is not a sensible approach for server side work.

    The general idea of a "secure" node with some of the issues fixed is nice - protobuf message passing in particular is a neat trick. My concern there is that it does make extension more difficult for developers, which will slow ecosystem growth. Ultimately at the end of the day it's never going to challenge Python for dominance in the world of dynamic languages/scientific computing and most people have long since given up on the idea of server-side JS as a good idea for anything serious.

  7. #2487

    Join Date
    May 30, 2011
    Location
    asleep
    Posts
    6,271
    help me FHC, you are my only hope!

    I've downloaded some powershell from the internet again, and it works but is ugly as sin.
    The end result is to pull a JPG from our HR SQL DB, and inject it into O365 so staff photos work.

    The code linked at the bottom, from HERE works, but uses all manner of disgusting ADO.net, file.IO bytestreams and whatever, and has to write to filesystem rather than just fill a variable with the image, so I can then pipe it up to O365 using Set-UserPhoto.

    This code seems to be streaming the content byte by byte into a file, which seems silly, but the code is the only example of people doing it on the internet, which make me think i'm 'doing it wrong'.

    (does this make sense?)
      Spoiler:
    Code:
    ## Export of "larger" Sql Server Blob to file            
    ## with GetBytes-Stream.         
    # Configuration data            
    $Server = ".\SQL105CTP3";         # SQL Server Instance.            
    $Database = "AdventureWorks2008";            
    $Dest = "D:\Export\";             # Path to export to.            
    $bufferSize = 8192;               # Stream buffer size in bytes.            
    # Select-Statement for name & blob            
    # with filter.            
    $Sql = "SELECT [FileName]
                  ,[Document]
            FROM Production.Document
            WHERE FileExtension = '.doc'";            
                
    # Open ADO.NET Connection            
    $con = New-Object Data.SqlClient.SqlConnection;            
    $con.ConnectionString = "Data Source=$Server;" +             
                            "Integrated Security=True;" +            
                            "Initial Catalog=$Database";            
    $con.Open();            
                
    # New Command and Reader            
    $cmd = New-Object Data.SqlClient.SqlCommand $Sql, $con;            
    $rd = $cmd.ExecuteReader();            
                
    # Create a byte array for the stream.            
    $out = [array]::CreateInstance('Byte', $bufferSize)            
                
    # Looping through records            
    While ($rd.Read())            
    {            
        Write-Output ("Exporting: {0}" -f $rd.GetString(0));                    
        # New BinaryWriter            
        $fs = New-Object System.IO.FileStream ($Dest + $rd.GetString(0)), Create, Write;            
        $bw = New-Object System.IO.BinaryWriter $fs;            
                   
        $start = 0;            
        # Read first byte stream            
        $received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1);            
        While ($received -gt 0)            
        {            
           $bw.Write($out, 0, $received);            
           $bw.Flush();            
           $start += $received;            
           # Read next byte stream            
           $received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1);            
        }            
                
        $bw.Close();            
        $fs.Close();            
    }            
                
    # Closing & Disposing all objects            
    $fs.Dispose();            
    $rd.Close();            
    $cmd.Dispose();            
    $con.Close();            
                
    Write-Output ("Finished");


    and for good measure, a photo 'string/blob/item' from SQL (the column is varBinary(max):
      Spoiler:

    Code:
    0xFFD8FFE000104A46494600010101006000600000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC000110801E0028003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00EB82FB5205F6A9B1462826E458A36D4DB6936D0047B79A36D4BB6936FB503222B462A5DBED48568022238A6EDCF5A976F3498A0646168DB9A93146DA008F6E4526DA976D1B68022DBC526DC54BB68DB4808B6D26DA976D1B69811E3346DA936D1B69011ED146DE2A4DB4BB68023DB46D3E9526280BC52023DB4BB69F8A5DB4C08F6D2EDA936D007B520230BE94BB6A4DB4BB696C046168DBC631526DA5C516019B78A36D498A3145808B6E7A51B6A4DB4BB452B74021C51B6A6DB498A76022C5376D4DB69001496FA0116DA6EDA94E17A900500646698116DA4DB52EDA423D29349B022DB4856A5DB49B695F556022DB49B6A5C526DA1DC08B68A4DBDAA5C526DA2E045B79E69A56A7DB4D65E295F502A48B55235FF4A1C55F916A9A0FF4A5A8605B0B57F4F1CB7A553C7357F4F1F337D29016F6D26DA908F6A4C0F4A3A81115A61153E38A66DA6041B6B2F5A5FF0041E7FBC2B5C8ACCD6C7FA01FF7850B740736A3DAA5038A620E2A5506AEDB0098A5C53B03A52E38A7D2E0444518ED5260526DA006629B8F6A936F34629D808F6D262A4C5263D28BA023DB476A7E2900A7D006638E94629F8E2931480663348471D2A4C526DA77023C6693152114D228B81DE8068DBCD70EBE3DBFC63FE11BBD27D85483C7D743EF7873511F4427FA55DD13CACED36D1B6B8D1F104E32FA0EA6BFF6C49FE94E1F10ED7A3E93A929FF00AE0DFE140ECCEC00E68DA2B91FF8585603EFE9FA92FD6DDBFC29C3E22E8E7EFC37A9EBBADDBFC2803ACDB4D22B988FE20E84EEAA64990B1006E8C8EB5D4BA90C41EA0E28022C7E1498A936D1B6818C028DB4F0B4BB68023DB9EB463DA9F8A314011EDA36D3F14638A0066DED498A93146DA4047B6976D3C0A31400C0BED4629F8A28019B68C53F14B8A56023DBC52E29FB68C62980DC51B69F8A5DB400CDB4A169C16942E28019B6976D3F14B8A40336D2EDA7E28C52023DB46DA65D5DDBDA207B89D224271B9DB02B85F10F8D6F74ED57C88A18C4206E1BF3FBC07A1041E47D284076B73776F691192E278A141FC523851FAD605FF8D74AB3E1253707B794323F3AF2ABED46F6EEEDEE3509CCFB893F31C05CF603B0AAC97285BE48C8E7B669D8691E8B3FC45465FF0046B2CB63AC8F802B32E3C6BA8DD311B9228FFBB1E467F1EBF9572ABE6CAA06C63CFBD5BB585C1C791D7DB9A5B0F95EE69B7886E5DC3476F0C447F1A825BF3EB5A167E2DBB05526B82147418C67F1ACD8E153C32BA28F5CD288A155082E4A0C71BBE606A79BA31F21DCD9789609117CDE063191CD6D5BCF15D44B2C4728C320D79C5BF9B1F2230EB8EAA41CD68D97885ECCF93195661C08E4C8FCA9277138D8EEB83C0A31CD73BA778BEDAE1FCBBE55B66CE15F7654FD7D2BA500103A10790477AADB7248F6E693152EDA4DB52D8116D146DA931498E945F50232B4D2B8A971485696C0549055203FD296B464154318B95FAD4B7702DE2AFE9C3E66FA552C7157B4FF00BEDF4A405E239A6E2A4229314011E298454A47AD37142B81163D2B2F5B1FF12F6C8E8C2B5C8ACCD6C7FC4B9F3EA2AA3BA03985153019151A019A9D455000A314E028C7145C066293069F8C52639A6B70232B463D69F8ED476A008F1C5262A4C0A4DB434C08F1FA5262A4239A4DA29BBA019B69314F028C7E346C033148053F1C526DA2F6D180CDB4840CD498A4C73F5A403F6A95A5046290648C1A06715C875D80839CE4535136BE6A4519E69A40A45589C1C0EB4A5CEDE09FCEA31D29327140AC50D55C8D2EE98B101632C7F0E6BD11BE625BFBDF37E75E77A90DDA55E8233981FF00F4135E8566C26B1B6947F1C11B0FC541AE9A0F468C2B2D50628C7B549B7B5262BA0C86628DB4FC7B5295A008F028DB4FDBC518A008F6FB51B6A4C52628023DB46DE2A4DB462900C0B49B6A4C518A008F6FB51B6A4C51B680198A36D3F14014806814629F8A5C77A60336D2E29C077A5DB480605A5DB4F028DB4C0685A50BCD3B14B8A40371595AB6BDA768E47DAEE1518E303A9ACBF14F8B9346B7961B3093DD8054FCDC44D8EFEFED5E4D3DDB5F9924B9024B991BF7AF272C48E3AD160343C4BABCFAFDDB5C4523A59C7C449BBB77CFB9AC7B6B59EED8430AEEC0C631D2B52CAD8C876B3613D07715D369D0C5022A41033B74E0526EDB1AC29F36E61DA787272A3CF3903B56947A224032215233DC57576F6D29E5902FFB3D6A7F218291B7AFB565CCDEE754692472D1E985067CB038CD59D3D20B3B8592580B479E4AF5ADD589B73291C77A510A82A180C538EA270EC446DECAE2177B7B8018900239C609F6AA5A8E951C25A246571C03B3915A6B6A8A4B24CD1B139F9696586E252A1A6F300F551CD3BA337092391FECE9918C96E1A3038F949C551D42C6E1D59D21797CBE58AAF4AECCDBBAC3BA5660A7F841C0AB16D1AA3F98A378C8C8EE2937662E43CB1642079B1B647461E9EC45741A3F8AE7D3424208300C7EE9B903FDDF4FA5743E27F0C5A6A120BEB05582E1F22551D24E383F5AE02F74BBCD36E1629D186F1943D73EB551926672858F5DD2359B6D6212F01C3AFDE43D47FF005AB4715E2B61A95D585EC771112B2447820E323D0FA835EB1A26B76BAE5909E06F9D789233D50FF87BD36BA991A38A36D3E931536B00CDB48471526293149815641C567B0FF495FAD69C8B59CC0FDA97EB50C0B78E39ABBA7E77B7D2A9E39ABDA70FDE37D29202FE33498A9314DC55011E29B8A908A4C51A81115ACCD6C7FC4B5FEA2B58D65EB4B9D31FEA3F9D0B74072E99A9D467B544838A9D4552000314B8E29714B8A76023C7B50453E936D3B80C229314E23B526280198A314FC526296A0336D0453B18A4C51AB019B6908A79A36D20180518E69E07EB484537A00CC7B52639A7E3F0A4C7146E022F0B8A01E08A0536B90EDB0F5EA286F6A4EF487BD2EA3B0E07BD29191C5341A5ED405882E1435B4CA7A346C0FE55D97876433F86349998005ECA16207FB82B948EDDEEE64B64237CC446BB8F193C5759E1CB77B4F0CE996B2105E0B64858AF4257E53FCABAB0EB730AFD0D1C52629FB69315D0603714629F8A31400CC51B69F8A4C500331ED46DA7E28C52019B68C0A7E29314C066DA36D3F1462900CC51B69F8A31400CC734B8F5A7E280280198A5C53B14B8A006E28C53B14B8E68EA03714629D8A50280198AC7F13EAA348D0E6984A239DC148B9E73DC8FA0C9AD3BCBA86C6D64B9B999218631979243802BC2BC5FE227D67C406E567692D2391E285318C4638E9EA7AFE54580CED42E976796BD58E5C8EAC4D6B687A23DE0591F27272722A8E95A59BCB9566C6C0335EAFA0E8A21B75CAF38E454CE5646D4A9F33BB28D8E811228C40BEB9DB5B9158A2AE4A818F6AD510054E1703DAA1618C81586A77452E85728A1462900DCD4F238C5038C9029A459135B6395A05B865E7AF6AB21B3D3B54B1AEEED571426AC65FD9007248FD297ECDF3064383FECD6B346074151BAA83C0A76690924CA4620536B8C81EA2AAB5B6D6FDD9381E86B464438C75A448805E462A1872A32CF9A240369E3915435AB05D5AD5A171B58728D8FBA7B56F18C75C542CAB9F9B9153E84B82B1E47A858DD5AC989016C71CF6F6AAFA6EB971A1EA91DD4432A08DEB9FBC3D2BD4351D2A1BC47529C95C06EE2BCB75AD39EC26789D7047DD3D88AD69CAE7155A6E3A9EE5A7DE43A8D8C37701CC72AEE1EA3D8FB8AB38AF3AF86BAE79E92E9F216DD12020139E3A67FA7E15E8E003CD3968623714D2B52E29A454302AC838359CE31729F5AD4907159B20C5CA7D6A3A816F15734FF00F5ADF4AA956EC3894FD2A56E068E2929D47E15A20186998A908A6F028019599ADAFF00C4B64E3A11FCEB548ACCD647FC4B651F4FE7496E072D18A9D054482A7519A6018A314E0297157A5C08F14114FDB498A1EF640331498A7E293142DC0660D27D0D3C8A31427DC08F1C5262A4C5371CD480CC518A76293140098A4A78FA5262860331EB46334EC518A76B010E299DE9C3A7349CD721DC18FC8D0C38F7A5E68340C074FC297B7348053B191CD004966C1751B5665CA8993231FED0AED74E411D8AA039DAEE33FF00036AE1E1C8B980E71895391DBE615DCE9E498660CD92B712827FE066BA70FB339ABFC48B38A4C734EC520AE8311B8A5C52D18A006E28C734EC51400DC518A7638A31400D02936D3F14500478A314FC518A006EDA314EA00A006E28C53B1ED4629008050052E33401400807146053A8C5002521E0678C7A9A762B9FF18DF1B0D06594007FD9FEF7B71401C0FC42F1547A8DDA69968EAD6F6EFF00BC901C876E9C7AE2BCF6383CD9D22EBCF5A590B6EDC40DCDC918E95A3A5423CE5909049E82981E8DE19D053FB3524230C4FE62BBCB2558C04CE38AC0F0FC805846807007415ACB2ED9739AE793BB3BA9C7DDB22FCECA8BC0FC2A9939C934E66C8CD333C51A1B456844396E98A76DE68DDEC2947D29D8D06EDC1A9E19368E7E94CA4624118FE556AC4BD494BE71C5309C9C91F4A4F98B673F850492791C501622DC4F7A7120A9C76A6375E291781C77A895EFA8EC2600E9D3DE98CA339A9304F622A339EBD854010C8BC5719E31D3BCEB3695065979AEBE69001C91599A92ACB66EBD722A53B3B995449AB1E67E0DD55F48F14DBDC7FCB393F7520EA083FF00D7C57BCC4E2440CA0807D6BE70BFB7FB36A522A9DA33C115EEFE0FD464D4BC3B6925C3A99D50231CF2D81C1FC4574CB5573CE6AC6EE38A69152629A4566F7115A41C5664D8FB4AF1DEB565ACC9C62743CF5A97B822CF6AB761FEBB1ED54F9AB761FEBFF0A9406A5369E0556B9BCB7B5C095F1938E066AD81276A6638A60BEB5740CB2707D4527DB6DB1FEB3F4A96C0931C567EAE3FE25D2F3D07F5AB897504C76C6C090335535507FB3E6F4C535BA03968EA751C5429DAA751C552DC0701462940E28C556C0348A6E2A4A4C53B00CC53714F229314BA80DC5253B146286EFA00CC518A7629314D240371498A7E293143403714629D8A3153A00CC76A4DB525371459015B1C1A43D69F8E6984735C877201D297181D295453B1C0CD0031734FED8A4029E47CA3140C8DB1807686C10707BD759E1ABCFB7E993DCF9421DD793831839DB86AE571C735D0F83011A65EA9E82FE6C7E3B4FF005ADE83D5A31AE95AE743462971495D4730514B8A00A004C514B8A314009494EA31400DC518A5C52E2801B8A314EC5262801314629D8A31400DC518A5C518A004C518A5A4A0028A28A003B5713F11E5923D1544280B31DACC7F841EF5DB570BF12E1BA9F498844988518B4AE5BE51E831EB401E2F72479802AE1456AE9009914FBE2B35E23904E7731C62B42C2730CEAAA70578E281ADCF54D065D96EA49E6B684E3CD00FD6B90D166DC8A09FA575098C67BD73C96A77537A1A01C6DC034E0010322AB46463B5584CE075A499B21DB73D29318FAD4807AD2607A55C52286927269A41CFB1A1B27A76A42DC0E79AB4315896E05231FA669A48CFBD37906920B0FE707FC29303231D69C369FC3A52EDE013C7D0D435D40898E073DAA0793E5C819CFA558906455091B69C566C44170E0822B2AFA6DB090C715766396ACBD51775B31F6A4B73296C79CEB39FB69279CF7AF44F8557124B67710EECA46C0E3D2BCCB54626E7924E38AEE3E16C845EDC2F18001F7AEAE963CF96E7AEE29314EED4959125797A565CFF00EBD3EB5AB25655D1C4CBF5A87B8CB156F4FF00F8F8FC2A9F156F4FFF008F91F4A4846C28E45717E39DCB6636E33E777AED80E6B97F1359A5E868E597CA412673C0A7B4931A3CA6E25995BEF04FF773CD5632CD907CC63F8D76B378674F900DD7C38FF696A31E10B391498AF19F0704820E3F2ADBDA445634FC0CCC74D42DD7730AEA3521FF0012E9BFDDAC5F0F69EBA685B6562C064E4FBD6DEA3FF20D9BFDDFEB59369CAE80E59055851C54118AB0A2AF4B00EA29C052629A7DC04C537BD3A9314D6A037148453B149EF42DC06E33494FA40295B501B8A4C53B1C5263DA9F50131498A776A31ED4806D2629C3A518A4C06E28C53B1498A3CC0ABDE9A47352530F279AE44770A8334B8E685A7628018053F1C1F6A00E69C7A13400D51D2B77C1B916BA9A1FE1BE63F9A21AC54E95B5E10C67565CFF00CBD2371EF1AFF856D43E232ADF09D2628C734EA3BD759CC368A7628A006E28A7628A006E28A752628013146296971400DA314EC73462801B8A36D3F146280198A314FC52638A008F06B93D5FC6062D45B4ED1E14BBB888E2E2566FDD447FBB91D5BD8545F11B57BDD2B46B78ECE6300BA9BCA9645FBE14F5DA7B67D6B06D2CAEB4FD32136DA798ECC8F91F61C1F7CF724E79A97248DA9509554DAB69DDD8DAFF00849B5DCF36961FF7DB527FC24DAE7FCF9D88FF0081B567ADBEB4DB5D74E95E3DBBFE54392BEB5CEAF882F6EAE6E45B2C0218E4289E603B881DCF34B9D5AECBFAA5472E58D9BF268ECBFE127D77BD9D97FDF6D58BE25D6B52BDD38ADCDB5BC6832731B13FCE99E1E9351D675FB7D3A69208924566DE8849E067D6B7FC4FE0E921D1AE647BFDCB1C65B1B369247E34D34D5D18D5A72A52E5A8ACCF149652391D71C134FB123CD05B3C9A8655396607201DA0FAD5BD1ED5AEEF1571900D50A2AEEC7A1787C128AC4F4F6AEAA3F98561E9B6A2DA155EF5BD02AECDCC7007AD73C9DD9DF05CA89E31CE2AC2B638C5674BA9DAC239957F3AAAFAF5A607EF56AA316C6E6975374C9C014090639EF5CEFF006F5A31C2CA2A64D5E091B092024F7CD6A902A88DD04139EF4C38079ACE4BD53C0393522DCEE1CF183458D2F72EE327FAD18F4AAC275F2FAD35AE401D41F5A2C34CB442AAF5A6F9CB9E3A76ACC9750403EF5536D5E14E1A5507EB4B9497348DC76C8E0D54108E83279CF26B224F105AC7C17FD6A54D7ED0AE44AA6A1C0CFDA2B9666830B9EE2B1351398997DAAFB6BD6D2B08F2327AB67A553BE009DC3A1AC5AE561CC9AD0F2DD641174DF5AEBBE1A5A99B50F3D650BE59E54F5FC2B9DF13DAB4138931F2B574DF0CE3533C9286656418CAF7FAD7541F323826ACCF58BDD56D34F8D5EE65DA18E170339359ABE26866996386163938CB1C551F11589BCD33CD0C4B43BA4551DCE2B9FD1E4125C4647A8A99C145D820B98F457E47359379FEB01F7AD266F96B2AF5B0C0D60D891614E40AB9A71FF4A5FA564C7264569696D9BB5A04740BD4571FE318239D5448AECAB36E01064838E0D75FD2B0F54D126BEBA3347752461BAAE78AA8B6A4981C2EC45C9115C13FEE1AD3D0624862B8DB1491867C9F3060B1C726B5FF00E116B8FF009FD7A4FF00845E7FF9FE93F3ADEA557523CAC85049DC9AC8FF00A62FD0D5FBF19D3A7FF76AB69DA2358CC647B86938C7CD572FC634F9FF00DC35CD648B3944156145411F6AB0B576D6C0380E2971F952D14D00CC1F5A4C53B18E9484555C06D253A93146A804C52014EC5252B80946297145201B814629D8A314DEE0331463D29D4628E50198A31CD3B1463B52BEA053A6E0E69C7AF349904D721DE098DD52E38A881C1A957EED310A1413D28C75CD28EB4948428E95B1E1423ED7AB2F70F131FC54FF0085642735A9E14E357D587AA427FF004215B50F88CEB7C27558A314B45759CC2628ED4B45002638A314B45002631462968C7340098A314B8A5C500201C518A5A5A004C514B8A00A004A434FC54729DA9401CC78AECADB52B2292DBA4CF082E9BFA0207A558D11A3BEF0369BE64524A3CBFBB19E4FCC6A4BC5CC6FFED70699E06623C2D68A08F959D39F6634AD766974E938F9AFD4D8D319A49C29B69208D620815BA75AF06D31365C5E274DB2915F454458C8B923191DBAD78D5A68564D2DCCE6EDD2496666230180E4E3BFA5454B289D1974D52AB796C4FE0AC0F1DE9F9FEE49FF00A0D7A6789EC66D4F46B8B483EFCA36839C62B81D1ACA0D2B5DB6D456E3CDF24302B8C6EC8C576B3F896D7EC52CBF3A32A16E39E7D3EB5349A4AD70CD25ED6B73D3D8F9A6F50DB6A3756C4FFAA95E3233E848FE95D5F82ACD4AC970DEB815C9EA92349AADD4ACBB5A5959F6FA64938AEEFC25130D1A22A7059B2D91DAAE7F098515799D4C655393DAB0F5BF1236EFB3419C0E38EF56F5090ADB95048C8ED5CDC56C3CC2CC0E73DEB38257D4EA9B6DD9146696FA5F99549CD5278F53233E59C7D6BA47B88A1187201AAF25F478FBA71EFC56C9993A6BA9CC19AFA06F983D5FB2D56E11875E0D4D3DDABFFCB2247A820D409223729D7D08A2E28C23D19D5596B0CCC327AFBD6CC5A864727F0AE1ADEE30E011835BF69BA523145CE885CDEFB590BF7BAFBD412DFED5EBFAD43340EB08383581797A50914AE5B64FA86AADC8424102B96B9BCB969090589ED56DE6323138A8F7AA9E9B8FA014EE73C95CA31C57F72D9F9BF1ABF169D7E707CDC73D2AE5BC93118587F5AB26E9E31F342C3DC72282153899AF6D7B17CDBF3815B3A56AAF730FD9A6277AF426AB7DAD665E0D476D18176B2018A896A87CB6D50CF17A8FECF8DFFDAC56F7C3BB4921B269D5C0593AA91FAD62F8A577E8E0FA38CD761E0F16D6DE1EB37B89E2864112E77B0538FA7D29D1DB531ADB9D15D4AC97F6D6C3E60D1962BEB5CA59DB1D3F5C96D79DA8F943EAA7A56CCFE27D0D354DED741982040E14918F6ACDD57C43A4DC5FDB490CC0F9670EFB4F22B6A8D332A7249EE7645B2BD6B2AFDF02A6B4BC86FAD56E2DE4DF1B6403F4AA5A83902B89AB14875ABEE5CD6B692D9BE5FC6B06CDBE41CD6D68E7FE2611FE34C47534D34EC0A69A760186929D8A691C500308CD53D43FE41F3FB2D5D22A9EA03FD066FF0070D26072B1819AB0955E3AB0955D4078E94B4014B8A7B80DC73498A752629A01BDA9314EC52628EB601B8A4ED4F02931E947501B452E28A4F5D404C52629C052629A402518A752548098CD2014EA28033CF4A4EF4EC0207B530A8DDC1AE53B96A28C139A952A1A91073421B44B4DC7BD28349D39C5024891062B53C33C6B5A80FEF5BC67F266ACC5EB5A3E1AFF0090FDCFBDAAFF00E875AD1F8919D4F84EB31462968AEC3944C518A5A5C5002518A5A4C5201052D1D68A6018A5A29450018A5C518A5C5002629714A0514005559CF19AB0C6A9CC680336E4656B03412CDA3C31EF8822DDCE9B1C1393BBDABA294641AC5F0840977A6DDC5217023D426236B63A9229ADCA5B32DDD34FA55A9B9B678639BC92B0A2C6E7271803935CC685F0E75892DA365D54C0187CE06700FA63BD75DA85B8B599638DE431ED040790B73D3BD6EE80C4DB91EF4849B5B1C7AFC3AD663887FC4FAD647C721ED4FF00306A9DEF87759D1B4FB8BCBCFB2CD0438CF92C7272719C1AF526703A8CD62789B64BE1FBC439E547F3152E299A46ACEFB9F397896289B5313C0414939E062BB8D062F2B4D8571805735CAEBD67E55B5B4C070F3941EDC576FA7C423B28863185031533F86C74A8A559A4457D1EF5F535CF5E4A6DD1B60DCDD85764F0078FA638AC79749899F32722B34CB68E2CCB712B15846E93BB91D3E958D711B0B96174D2B9538386AF427B08631FBADA2B32EF4886EE4F324501B182CA719ADA324D18CE936CE5748B06B8BF11C659508CE7D2B527B39AD662AE3201C0715AB059A596E106413D5875A6340CE7AB119E41626AB4146938B2BDBDB1215F22BAFD0ACC48C091C561DB58B3BAA80428EB5DAE930086318F4A89CADA1D14A17772ECF648D6EC0AF6AF39D72D3C8BC6E3826BD48E1A3C77C5719AED9F9ECD8EA0D66A5666B529E87112A08D40CE49EC296E2C2E62D326B8C18B61C6D1D7AD6A0D3F272539153A8023689B76D618604E41ADD58E39424D591C2328D8312CA65EF9E82B4AC66BE8EDFCC1233A2B630C735B2FA1D9B11B1A45278EA0D5A4B148EDD628D02A2FA9A4DF7255169E865C132DCB798176B9E187AD6D594248CE3A5456DA523396180D9ED5BF059AC710C75EF584A4B646CA2CC0F11C40E8929EF95EBF5ACA9EEDE658C8E02C6AA3F015D0789507F625C7B01FCEB968741D7C22C8B1168D8020311D2AE9BD35393114A737CB0446C4EE069E92385E99E7AD5C5D17516505EDF69EE370A53E18959F7343CF53F355F3C7B9852C2D78BD60FEE3D07C1C73E19849FEFBFF003AB1A91F92A8F86A58F4DD163B69FE4656638EBC76A9EF6EA299711B67F0AC66D736874FD5EAA5771632CDFE5EB5BBA3367518BEBFD2B99B57E2BA0D15B1A8C3EE7FA53B6A6276BDA999A5A6D35600C5329F4D353601A6AA6A1FF1E13FFB86ADD55BF1FE8337FB868D40E4E3AB09D2ABA5584AA68090518A514B4D680369314B453B5C06D181E94B452B00DC52629D477A3A80DC71453B1498E29D90080668C52E28C5201B8F4A5C52E2928B2EA0262931CD3B1C5047BD2D00CC3D314DDD96A48E55913238A3183D7AD71B3BD0E0062A44ED51FF000D393A0E29812D21E94BDE93B50048BD8FAD68F87401E217F536A7FF0042159ABD062B474020788579E4DB38FD456B49FBE6557E13AFA3BD2515D8728B4B494B400514628A0031451463D68014528140FCA940A00314B4B8A3140098A0F4A5C535A802273D6AAC9CD586E955E4A00AAC322B9BF08CAE34ED6BCBE1D6F652B81EE6BA59A45863695CE1501663EC39AF3AF077896DF4FB7BC69D242679CC83681C673FE345D27766D4A129F328ABBB7EA8EB8C9733006E7713D06462BA6F0FF10C83DEB948B5DB7D5E50B0C732ECE497AEA7C3E7E5947BD174F6339C2507692B3360AD676B5079DA35DA8049F28918F6E7FA56AE29A5477191DC7AD049F3C78A54AD969D0F186B92D5D6403E4403D00AE7FC796874FBDB5B519D90DC14FC33C57416C3E48C1F4E6B19DEC77C1DEA397734238CBA722ABDC5A9DBD39ABF6C72B8ED569A08E50A48E9D2B346E91C65D59C99E05565B294F5FD6BB56B38F07201AA92D9A6405002D5467DC7ECDB3995D3BA6E39356134E017918ADC5B345E71514E15303AE6A9D4EC3F656DCA96D6AA3B719AD6B55E703A0AA36E77B045EE79ADC8E011A601FAD66D8E3B8D638538E9581380D33071D6B7DE3CA9EB591796F93B97A8A4CD24649B75DE540EBED55E4B3C1F996ADEE2261BBA835A2B1891338049ED4E3268C5C53D8E75EC81E54D3459499EBD6BA4FB12EE048C7B53D6C5436401B71DE9B9A62E4664D9E9CC306B41A02A3A62AFEC5893200FCAAB5C11B33ED59EA0E36392F13A94D2EE08CE78C73EF5A50EBBA5C1A5C76E6F37CB1C6103F24631D29B7B689A80FB3499D8E79C567FFC21367DD9BFEFA35A2A908AB4D934A1539DCA0AE4DFDBFA788590BA1666077F3918ED509D72C7FE7B7E9519F0459E30A5BF17342F822CC31DE5F69F46351CF476E63BBDB6295DFB3FC453AED8E3897F0C558B5BD4BA93F76AE540396DBC5553E0EB48A55684B32839218F5AB9A8DFBE93A72FFA146B0A9C6D8D8F1429526ED16635F118974DDE164496D27CC45743A2484EAD6E0F196FE95C7697A941784BC68CA57AE4D745A25C96D6AD71DE4AE9E5D4F0CF4CCD34647E34C0FC52E6A00767D2928ED451D404AAF7BFF1E537FB87F9558AAD77FF001E737FB86901C9475652AB47D6AD25535A8120A5A4029D8A100DC52629DCE79A4A6C06F7A28ED452E802514B4500368A752500201462968A76D406E29714B46284804C52629D498A9D80E6AD09312D5C0791552DD1A38C03D6AD2E78AE5677449392B4E4E299DA9D1F520D219203DCD04F6A3238A4E3347501E87E502AFE8631E2481BD60907F2AA09C0C55DD1CE3C4367EEB20FD3FF00AD574BE34454F859DA51DE8A05771C62D2D3697A5002D2D3452D0014B49450063F887C4F65E1A8E092F125713315511AE7A73583FF000B5744FF009F6BB3FF00011FE3547E2CAE74DD35FD2661FF008ED795014D203D84FC57D1B1C5A5D9FC07F8D34FC59D2BA8B1BB3F522BC831D69714F97503D68FC5BD3B1F2E9B727EAC0542FF0016ED3F874B98FD6415E578C518A7CA07A6BFC5788FDDD29FF197FF00AD5037C52DC78D2FF397FF00AD5E7405252B01DA6ADF10E5D434BB8B44B210F9A9B4BF99938EF5816E52DD500756CA86603B7B56449C46C7D053E3988BDBB23A79A78A8A8BA1DD809F2D53A8F0679F16B97B2CF70D22C885B96E07CDE9DABD97C367779B9AF14F0C499BE9867AC27FA57B1785AEA012346F3448EC3705770091F8D08C7134E34E7647538A42314FCA76743F461498DDD39FA5339CF28F18E951EA37F732904B473920E78E1AABC1C051ED8AD9F11892DAFEED307E66DDF4CF3585139CD633BB3D0A7B266946CC3A74157565E064F159C8428C83DB91566260002C3763A66A2C6D1DCB84FCBB98F06A12C0E05234DBF2091F4155CB7A9C62AB96E6F17A133328E33CD655ECFC6D1D454EF391F2939F7ACEBC91536BB0E030269F2AB93266AD9C2969B2594F3E95AC2EE09572B203ED5E7FABF886658CF9513487D16B274AF13BDC4EC92C3242EBDFB1A954DBD598CA6A32B1EAC5E3DA771E2B2EEDE35563BC63EB5CABF88C85C06C9AE6F56F14CC2710A2BBB1F4E956E1D10DD54B53B09CAB3EF43D2B46C5C32AB13F4AE374CD4A578C191082DD8D7556C4AA2923151CB676638BBEA6C16C9C529276E7155925CE3DEA477F9719E2871354324639EA460D54B890956E48A9E43952376323B55394909EB9F5A9EA65320B62BFDA116FFBACD83F9569BDC5BA121A400D62819BC8417DABE60DCC7B0CF3FA576326BFE088F874B57F730A9AA542157E2B9CEB173A0DF275301F50B25EB3818A88EADA7F7B85ADA7F13781173FE8B687FEDD14D57FF849BC040F367647FEDC179A7F52A3E7FD7C8BFED5ADD9192757D37FE7E53F2AA1ABDD69D7DA6CD00B9425978FAF6AE9478AFC001706C2D7AF5162A2AB5DF8AFC086CE75874FB5F30C4C108B251C91C7342C1D24EFAFF5F214B33AB256691E6BA3896D2775738461CF35D7E8127FC4E6CF9EB28AE726D4EC7C8608B1190A8E7CAC60FD6B4745D52D20D66D24927448D6504927802BB2AC211B72B3CD4EE7B2A9E94FDD581FF097680060EAD6DFF7D55CB0D774BD52568ACAF629DD46E2A9D85722BAE833501A5CD47DE9C2801D505DFF00C7A4DFEE1FE55354373FF1ED2FFBA7F950DEA07251D594AAD1F5AB29D2A9EAC09053874C77A6814E1D28BA5B0082929C69BDE9D9EE01494BD79A4A4D009452D18A7D404A29692A580628A28ED4C03145146292B805262971474A00C5C0CB0A4EF4F6E18F6A61E6B891DE85C64714F5FBD4C1C8A78EB4C63FB5267E6A5EDF8D0A39A04483AD5AD30E35ED3CFF00B6E3FF001C6AAA2A7B038D6F4D3FF4D88FCD1AAE0FDE44CFE16771D2B0B5EF122E8734319B632F98A581DD8C60D6ED70BF10D086B094770E9D7E86BB8E22E278D659555A3D265656E843707F4A6FFC26D3991A31A53EF419605F1819C5721A60F126A8B243A646AF05A155F9A6D982D93E9570F87FC6526FDD0C1975DAD9BAEA3D0F155A01BEDE3C78DCA3586D75C6E52F8238EF4DFF0084FA4ED64BFF007DD73E7C21E2966676B7B32CC724B5C1249FCA947833C51FF3CF4F1F598FF852D00DFF00F84F66E9F634FF00BECD27FC277718FF008F48FF00EFA3589FF084F89F3D74E1FF006D1BFC29C3C13E263FF2D74DFF00BEDBFC29AB75023F12EB2FE24B48609A258844FBC143C9E315CCFF0063C3FDF6AEB07817C487ADCE983F17A5FF00840BC41DEFB4E1FF00017A2E901C97F644007DE7A4FECA83B33D761FF080EBADD752B01F48DA93FE15F6B5DF55B21F485BFC68E60391FEC983D5BF3A3FB2E0FF006FF3AEC3FE15E6ADFC5AD5A8FA5BB7F8D2FF00C2BBD4B8CEBB00FA5B1FF1A5CC071FFD9707FB5F9D1FD9700EA0FE75D92FC3ABFC64EBF1FE16BFFD7A51F0EEEBF8BC403AF6B51FE345C0CAF08784F4DF106BE96178D2AC2D1B31D8D86381D335A1E35F03685E1D6B76D3DA6324E58CAB34B96E38C803A0E2A6FF008422F2C64596DBC4D2C538E8D1C0148FC73599AE7856EB4CB51A85C6BF2DF481C47B1D474393EBEB4AE98D3717747341CE9B7D0A597FAE9C1400E39C903BD26B165A8B5C493EA903EF40031F39485192001B4FA8354F5527ED702B2AC8A51B8638EE2A0B4B196EA56482DA262064E5CD52B6EC25294B5658934E167041713C124714FF00EAC89FAFE00E69E3C98F051A6523A7EF9BFC683A0DF860C2DADD48E8771348746D59BB43FAD3BA449D6E83AA46FA7182462590E3E6624907DCD5A5700F5FA57150693AC4326F8E4894FD0D75969E60B4844D8F3760DF8E99C7358CD26F43AE8D4D397B1A826DABC0E3BD4D0C995EBEF59EB2638C74A70930D806A794E94F534FCC40995FC7BD4124BBB83D2A89B821F07F4A04FB8F5E9556B17CC91631939278AAB78430D879CD31EF36B6D355E4B9DFD0F14F975B89D58949ED803BD4E08EA0D5490C699DB12EE3D4815799C9422AAB42096C8E9D0D558C6551BD8CA281D8B608A7AC0A486F2B247A8ABB6F681F712B904F19AD3FB090AB95E0D047348A7A65AB7DA165908DA3A0AE906C2076AC653E49214548B79F2FD3BD6728B6CDE1515B5353794390D4E59F70E5BA5658BE523E6351B5D047501BAF414B96C35511A524B8C9E99A81A43B7BD4066CF1DAA132127AE2A5A2672B94F58BC7B6B19648CFCD8DA3DB3C570FB8FD2BD1AD3428BC473B58CECEB185F30B2360F15787C29D20759AE4FF00DB435506A2B538AADDC8F2BDC7D68C9F5AF561F0AB46C72F719FFAEA6947C2CD0FBF9E7FEDAB7F8D573C4CEC793E68CE7BD7AE2FC2ED04758E53FF006D5BFC69CBF0CBC3E3FE58487EB2B7F8D1CF10B33C8323D6933EF5EC63E1B78707FCBA31FAC8DFE34F5F873E1BFF009F153F5627FAD1ED2216679C69FAAC11DBC284C5188C10E08E5F35D27C2E911B5EBC318FF961EBFED5696B9E07D0ACB46BB9E0B08D648E266561D8D55F8541567D4C0006027F334EE9A6D01EA5BA9C1AA014A2B21163754371FF001ED27FB87F9500F14D98E6093FDD343D80E563EB5652AB47D6ACA74AD3AD90128F4A75347AD3E93DC04A6D2F7A4ED4009452D253D2E014514B52F50128A5A4A2E01DE8A3DE900EB9A6AE02D1CFE14514BD404C514B49420315BEF9A69E0F1439F9E93BD711E80A0FAD4838E6A2A70C1E2981266941A67181429C9A2E162753D054B6C76EABA711FF003F283F3C8FEB55C139E29E8C16F2C18F6BC87FF460AA87C4899AF759E815C6FC415FF43B16F49587E95D976AE4BC7E33A4DB37A4FF00D2BBCE1381D06F35C5D7EEACF4B9992292249640141C90481D6BAE5B5F17BFFCBD4C3F05AA7F0F238BFB7F5391D49616D185FF00BE8D7A4899476A995FA20385FECFF16B7FCBE4DF98A3FB2FC584F37F3FFDF62BBBF387A51E70F4A579F6158E1BFB23C544FF00C7FCFF00F7F297FB0FC4EDD7519FFEFED773E70F4A3CEF6A2F319C30F0F7891BAEA371FF007F8D1FF08C6BE7AEA33FFDFE35DCF9DC74A3CFF6A2F30387FF00844F5A6EBA8CDEFF00BE349FF086EAC4F37F2FFDFD35DCF9C7D05279E474147BE07123C13A91EB7F27FDFD6A5FF841AF8FDEBE7FFBF8D5DB79EDE8290DC10327147BE07143C057047CD78DFF007DB53BFE15F39EB75FA9AEB86A0BF87D29DF6C39C63F4A2F3EE071BFF0AF3270671F8E6B2BC41E0F1A3E99F6C1206D8E0631D32715E92D745719AE7FC6F2B3784EEC71F7A33D3FDB145E7D40F15D638BAB73FEC37F4AD5F093037B38C75407F5AC8D6BFD6DB93DB77F4AD0F08B7FC4C24F78FF00AD5B7EE81DAB018A8881E94E273498AC1EA34376F351B0C38F7A9B03351CC308180E879A4B73484ACEE46720671CD319CFDEEBED4E0722A2746EA5BF0AD96A8E8BEA05C918EF555DCC64E4F4AB6B8C71D6A2BAB7CAEE069A1C9DCCC96ECB3F3CE7BE2A58B3C73F29EB9354A7B392597687651EAB4369577FC13B3AFA3532630BEE6B092D63E0C8391DA945EDA8E30585627D8A74382554FB8352A595CB0F9644FC683A234FC8E8A1BCD3E38F7918E318C5472EB368E71B70A3DAB0469D7F236D26203D4934B268D7318CFDAA23C74E682DAF234A6BAB4901F2E503DAB2EE2E3674359F269F3B3ED13863FEC8A9A0F0FCF27CD2CAEDE8B9E2A76DCC6706BA124770D21DA067E95A36D0348727A8EB9A9ED34C4B600327357C2C71270287B1928D9955805E9D6A2EBD696671BF033F4A85E40A849E2B3EA533A5F0642CF7D7371FC089B3A7527FFD55D967DAB0FC2766F6BA1A4920C3DCB79D82390081B7F4E7F1AD9CD44B7399BBB1F9A38A6668A44B43F3CD25328A036168E949DB34501D0CAF128DDE1BD48FA5BB9FD2B8AF85AC05E6A43A65579FC4D76BE24C7FC235A967FE7DDFF95703F0D8E2EB513FEC27FE855B535EE907AC657FBE2977263EF8ACB69F07691D4734F470142AF61D3D29F2203473E869B2FF00A97FF74D2444F94A4D24BFEA5FFDD359F901CD47D6AD475523EBE95692B47B8130A77E19A60A7638A000F149C514945BA8051451DE900514946684805A28A295EC02F18E94945155E4014BD2928EF520145251425D40C26FBC0FB5371EF43F5073499C570EC7A228A78E0D301E2941E6A809074FE542F5269BCE0D00D02255A49DF6089FB24F137E4EB429A83526DBA6DC3E7945DDF9734E3F12265F0B67A6918661E8715CAF8F467418CFA5C2FF00235D64BFEBA4FF0078FF003AE5FC72B9F0DB37F76643FCEBD0384E63C02FFF00151DF2FADA29FC9EBD1BB57997811B1E2B987F7ACCFE8C2BD2B3400FA5A8F34B9E28024CD14C068CD003C519A84B1DCA077A90E5533400ECD14801E87A8A6C84AB281DFAD003A91B9523D45251DA802BC4BF2E187E95381E94BDA8CFA52B21DD8E2A18609E2B07C6233E14BDF6087FF1F5ADBCF158FE2BE7C2BA8E7B459FC981A2C23C5B5600BDBE7D4FF2AB9E15206A4DD398CD51D53EEC273FC7FD2ACF861BFE267F5434C0EDFB519A603C669C0D6031C282032953DE928A434679262765EE29DBF2B4FBE42009074E86A9EECD6B0D8DE2EE8981C8232703B669C64C8DA781D2A00739C119A954F20119AA2AEC9E082365CF53DE976EC6F6A96203670706897E61851F8D06E9AE52191A2C61D4355332DBC793822AC49037527902B2E78DC9C72734C9539C762CFDBED7180ED9FA5452CD6B29FF0058D9ACF6B3C124934D86D4C8E064D01EDEA1A502C61B11AE49EF5B5691841B8F5C551B2B4589724D68160170075ACE4B52D49EEC65CC8B8EB5992DCF18278A9AE643B39C8AC599F706519A6999395D965E5246454BA659B6AFABC1698262277CA47641D7F3E9F8D65348CA9C9CD7A3784F453A669BE7CEB8BAB9019811CA2F65FAF734B44AE6339744453F88F527D4EEED74ED29268ED64F28BB4C146719E07A545FDB9E246242E8B6C30DB7E6B8EFF9579FF89FC41AA695E28D5EDECA778E392E0B305C75C0A7E8779E2BD5B13DBDF91B64C624E413D791DE928093A495A57B9E809A9F89E60C534EB05C1C733134AB79E2B91430B5D3573FED3571174BE3112CCE7526F379CC70E5727D80AE60F893C4592A6FAE810718F30D350F41F3D2ECFEF3DB7C3FAA5CEA56F702F2248E7B79DE170878256B5EB8DF86B2C971E1D926998B4B25C333B37249C0CE6BB1ACE4AD231F316928A43522337C45FF0022D6A5DBFD19FF009579F7C3623ED7A8FF00D735FF00D0ABD03C447FE29BD4876FB349FF00A09AF3CF876DB2E75338048841E7FDEADA9FC223D28C44FCF9E31CF1524719FBC3A11C714594865B4476EA476356862B411247FEA57E94D97FD537D282C7017B0A63FDC6CF4C5652566339D43CD584AAA9D7F1AB0955D40B029D518A776A005A4A4A28D405A2929292B80EA29BF4A5CD20168A6D28C9E00A602D14E11B9E829C2073E945FA011D1537D9A43CD225BBB93B4640382697901151529B62BF78F6CD412C9042C15E5E48CF029A4D05CC193B53295FA0C53735E7DCF4470E94E5CD460D3D698C93F86901A4CF14039AA10F53CD43A982DA4DE0F585FF0091A957AD36E17CCB399073BA36007AF14035A1E94B2092359074750DF98CD73BE3539F0CDCFB321FFC7856AE9F233691625C10E6D622C0F63B066B23C5BF3786AF07A053FF008F0AF44F38E33C12D8F170FF006AD241FAAD7A68AF2AF07BEDF18DA8FEF4128FD057A983400FA29B9A05021F4537340A0077F129F4A719438E8C3D6994940C7ACCAA4FCAC73DE867DF8E29945003C1A334DA4A007D14DA4A005CD64F8A39F0AEA9FF005ECE7F219AD4CD66788C67C31AA8FF00A7497FF413480F12D54FEEA2FF007FFA1A7F869FFE26EBEEA6A1D4F9B75F6714BE1C6FF89D45D3A375FA517D0677FDA977537B5737E24B899668A3490AAED2DC1EF592576074FBC51BD7B115E7265908F9A473FF000235BB61612DAC1F6DB9DE1997F771B75C1FE2357C81735A6BE13DD35B0FB8A3E6FC6AA17285948E9C550D35B024BB3F79E70339EC3FFD66B4AF62E772FF00FAEAE70B245D27B846F86CE7F3A944D9755DD9CFA5668720914E0E4003BD234BE86F472AFAF4A9C03B8632DDCD63DB5C6DE0919157FED203011B15E7934CA522FAC024386E3D69B2D946C015C67DEA14BBC9DA0F41EB528B8014EDE7EA3BD05A9A29369CED26188C77AB5169B140371C0CF606869F79C13F9512DCE5429F4EB4877481CC6322A9BCA51B20F19A6994093E56F4C9AA57972899E6958CDCC6DD5CAEF3DFD0D663B804906A196E0BB139A8558C922A7A9C50913CC8EBFC1DE1FF00ED1B91A95D27FA2C2F98D48E2471FD057A2F3DEB92F0F6B11D9C6965290205E10FF77FFAD5D775E7D6B3AA9A766629F36A797F883C1BAC5DF88AFAEEDEDE29219E4DEAC5F18E28D3FC37E26D350FD920861989FF0059E60381E838AF50C605371ED495476B035D4F2F6F0AF8B2590C8F731EF2796F38E6A14F87DAD33EE325AE4F5CB1AF56A4A3DA30B230BC27A24DA0E906D67915E46919CECE833DAB77345152DDDDD805368E9499A406678873FF0008E6A5D7FE3DA4FF00D04D79F7C3AE67D57FEBDC1FFC7ABD03C41FF22E6A59FF009F693FF4135E75F0F2454B8D5598E00B5CFF00E3D5AC3E1649E9DA59FF00897C5F4ABA0D73963E20D3A0B38D1E63B9472029A79F11E98ED9F366FF0080A915A88DF762245F7A5720C673E959D69A9417EEA61DD85EEC3157A4E10FD2B39EE3473ABD4FD6ACC7D2AAA9F9CFD6AC4669B02C034B4C5A776A4805268CD373499A603A9334DCD26696A03F34B9A8F3499A404BDA9377381C5479A6EECB535AB02C2B9F5A915C8EF554353C3D53405C57E3AD5CB63FBBE3819ACA0E2B46C9B746DF5A2DD4966478B351BAD2ECADEE2D991775C2C52165DD80D9FEB5C9E93A95F6A535D1B8864F36399A3C7964640E87A5755E3B43FF000885ECCA32602930FF0080B0AE06D3E29BA20492D950E79232D540B63A43D053334AC7E514CFAD7927A63C5381A8C1E29C2AAE04B9F96954E0547DA8CE2AAE32518A37FEF22FF7D7F9D479A6B37CCBFEF0FE75517EF264C97BAD1DD693299343B172724C0993F80AA1E24F9BC3D7E3D2127F220D4DA2B7FC48ACF8E91E3F2247F4A875D1BF42D407FD3BBFFE826BD17B9E72D8F3FF000A363C63A71CF5128FFC70FF00857AB66BC8FC30DB7C5DA67BC8E3FF001C6AF5BA431D9E2941A6034B9A043E806999A5A063F3499E29B9A2801D9A33CD368CD003BA52E6999C51400EC8A38A6D2D001ED547591BB42D453FBD6B28FF00C70D5CA82F806D3EE97B342E3FF1D352F703C17513FE860FFB4B4DF0EB7FC4EE1F7C8FD2A4FB2DCDFD8225BC2F2B90A4851F4AD9D13C27756B7497B773246139D8BC9F4AA03A419C561EB7A5DDDFDCC42DE3CE1482CC70056BCF7D0DB8DB1E19BA0F5A7C424085A53F39EBCF41E952A36D42E51D2743B4D3D84D74567B85E4647C89F41DCD41AC5C1999DB2715767E39CD62DE926323154041A665B495EFFBC7FF00D0AB4EDE5F3EDCA39F9D783599A290DA7BA7F725607F1C1A949682612A8C81D47AD763A5ED2924B72233E498EB8531B6453639030C9AB44A4D1061C83DEA8CB1327CCB5C763A6EF744C08E48C934F4BCD8300F3EF547CF2BC30A525241C1A09B97BED4118B039CF53522DFB1504B1E2B1D91C0C83C7A54664973EB405CE816FF00E5C16FD6A392F77725B27D2B0BCE907614C695CF4CD01CCCD77D4146E3939C77ACB9EE1A66F61DEAB9DCDCB528FF00679A0571F52DA8C5C2123BF151C6BDDAA5B57DCE5FAA8E055D38F34AC4CDD95CD3BCB97B6582E97E68D6411C83D8F4FE55E85E1AD585DDB2DB3B7CEA3284F71E9F8579CCB135DE877D1AF2E23F3107BAFCDFD2AD6877AE6DA1955C860010C3B555785D9107A1EB7CD27D2B1B46D716F23F2EE182CC0E324F0DFF00D7AD9E3B570B4D3344273E9494B494AC30FC290F3452E6810DA691CD3A994C0CCF107FC8BBA97FD7B49FFA09AF3AF873F36AB76A7A34183F9D7A2EBFFF0022FEA3CF3F6693FF004135E6FF000E4FFC4E6E3FEB8FF5AD61F0B24EBE4D2F6CAC162E33C52AE9A73C455D1A053D8548157D053E66066E996ED03F2BB456B39E0D20503A0A46E87E94A5A81CE8FBE71EB5612AB0FBEDF5AB094EFA813834ECD32968017349499A6E6935D8075349A696A696A97A00ECD19A8F750BB9CE14127DA937A80FC9F5A45A996C676192368F7A71B09D47EEC2B9F738A717A815CB6299F684FEFAFE753CB6D750A6E9605407D6403F9D566B386E07EF2DA507FBC8A187E86B5B88956607A115A3A6DD44929595B0ADD0D73571A542A498E5643E8EAC87F5154FEC57631E4DDB9F40B367F4CD026B43BED4A1B1D4B4BBAB195D5A39E268DB07D4578E4DF0F3578DDBCA82C24504804EE1915D3793ACC232259C8FF6933FD2905F6AD11E5D0FFBC98A351AD09B398C1A6679E69DC7974CEF5E53DCF456A85CD381C53075A514C64B9C519A613CD009CD30B8ECD3246C2139C639A0F5A434D3B6A27A9D6786EE63BAF0FDB4D0B6E46DF838C67E7356B514F334CBC4C7DE8241FF008E9ACAF06E07877603C25DDC281FF6D09FEB5B732EF8245FEF211F98AF493BAB9E7D8F26D01F1E27D21BD6E00FCD48AF62C9C578B684D8D734673FF3F5167F1207F5AF67FC698080E0D3C546464F14A1C74A40499A2980D2E6980E19C514828A402D14809A39C74A2E03A8A8CC88832CC17EA6AB3EA76A991E66E20745E6802EE68AC793582DFEA62FC5AA8DC6A77054EF9481E8BC5006F4F790DB8F9DC67D075AC3BED78BA3C71261581073D48AC6B8BA676C66ABAFF79A9D809A364B7B7554448A1418544181F9562DFEACD236C4271D29351BC27F763B554B1B43712EF6FB8BD4E2AD2EAC45FD3AD547EFE61B9CFDD07B5689E0124E6A1326DC0CE40181C5279DC63352C6579DCFBD665D0DC879C5684EC1FA1ACDB90361EBF9D349815F417C3DE43FED06ABF28EBC563696DE56B046789148FCAB72504D7A343E139EA6E544731B12A383D454FB9644C83F507B540DD6A33B81CA12A47714AB6194FDE8EE5D3ADCBA3D8964855BA5557B639C8E3E95656E109C4836B1EFEB5318D9972306BCF945C5D99D3752D5199B25EC7229844839DA2B41E375E429FCAA16FA1A91591419A4FEED3487CF5C55BD9DF06810B93F771406851DA4F3D7F0A9E387033563CA58C64F355A691A46DA9C7A914E31727640DA43247F30F929D3F88D58894E4281C5321878000AD086200038AEFA747951CB39DD9A1A6158DBE6C6DC720F7ACDD1479114B6CBC88A4641F40481FA54BE6157C2F53515B612F6E87AC99FCC0ACAB474B8E0CE86D25D8ADC735B165ABCD1C78DC7E99AE6E372BD6AFC58D808AE4363AB835B5603CC1F88ABA2FED76190CC8AA3A9638C57146674E723152C578338DC3FC6A1C105CEA8EB5A60FF0097FB7FC240690EB5A776BB43FEE827F90AC78354961C02729DB3DAB4A1D52293A92A6A391A1AB0F3AD58F69646C7F76173FD29A75AB4ECB727E96EFF00E1569640C32181FA1A70A9D0661EB5A924DA25F471DBDDB335BC807EE187F09F5AE07E1E1C6B53FF00D71FEA2BD3B51E34DBA3FF004C1FFF004135E5FF000FCE35B9BFEB8FF515A4361743D5636353A9CD538CD59434A4B5113669A4F06814C3DE901CF8E1DBEB5610F7AAA39909F7AB11D5DB502C0A5CD46297352F60149E29B9A426984D1D005269D1C12CC7E453F5351AB289013C8EE2B462D462E9B768F6A9516C075BE9918C199C9C7615782C7044591522451CBB1C63F1AE5FC43E3BB1D12416D6F179F765431DDC2A67A7D6BCF355F12EA1AE3FFA5DD968F3F2C60E107E15A283607A2EABE3AD1B4E2CB1C8F7D38FE187EEE7EB5C5DFF00C44D7EF98A592258C5D3E4196FCCD73C16311EEE59FD074A7DBDBDF6A2E21B744503A9621455A515B085B89EE2462F7974D2C87BB3124D3535097784B2F3F7F7084E49FC2BA6D3FC0918C49A84E643FDC4E07E75D35B6976D67108ECEDA2887D29DEE4B92471106A3E2A8230C9797283FBAD29FE5538F14789907EF923B81DFCC851FF00A5772B669B7F78149EFC544FA75BBF541F95223DA1C7278DAEE127CED1AD73EA91B21FFC74D5C8BE21DB7DD9EC675F65BA63FA366AEEA31E916591712A2BFF007072C7F0AE56F6F2DE5F96DE0013B17E4D164691937D0EC7F8293BD22FDCA3A718AF299E8A002941E734DFEB4809A10C7939346EA67BE6933C53024CD369BBA81D6988E93C1A7FE25376BFDDBE97F5DA7FAD74206481EA6B98F04B66D7545FEEDE9FD516BA75E1C1F715E853F817A1C33F899E2366EF6F7D60C8543C771160B0C80438AF6364B95621F518460E0E21FF00ECABC5759468D6F9178647900C76209AF4DB0F02CD2DB46D24D93819DC49ABD3A926DF23EF6ACA3E91A8FEB51B3C40E5B5A23E9E5FF85565F87D1FF14CA7F0A997C016E0F328FF00BE6A6F1EE1A89F6AB35187D6E43F478C7FECB49FDA1A5AF5D5E53FF6D87F41532F816CD473267FE03493F84B4BB481A69E4608BEC3347346E1A95DB55D20607F694E7E970FFD29ABAAE91236D5B8BA9589E9E74A7FAD615C8B7594470400066C0CF240AB281507C8817E9C55580D97B8B2DB9586463FED4CE7FAD5176491C32C4ABF4AADE660F5A0CFB464F34582E58F998E4D0CE91AF2467DAAA3DD1E9551EE0E3FC453B01724BAEC0D519670DC9C8A85A6CAE01EB4DFBDD78A7601CBF31DC7A557BCBADA36AB722A5965544FA5634F2995C9E45349BD8064719BAB900B0009E49ADE8D638A1548C8DA076EF5CF6C656565E306B62D2E04DC93F30EAA074A2498164A82395FD2AB3AFCC768E2AC492AA7F162A8CD3172361C2FAFAD2432377C1238E2AACA72BED4F6C1E339A8D94ECE9DAAD2B2118CD27D9F50865C70AE335D283BE3CD731A829C123AD6E69F379D6884F5C575D07A18D443DE315011F855C7155CA76AEDB18DF52B3286041A624B25B9E0964F4AB2573513267B567529C66ACCB8CF95E85EB7BA494673F854AE158E7683591E5B29DC9C1A71BA91170C2BCFA9879459D31AA9A2E49B467000AAEE7B9AAEB76D21C28C9EFED433161EA3D7D6A63879C9EC0EA2432425F8E8288A0CE30302A458B9E45598E2C735DD4E8A82B239E536C6C50E7B54E7843D853D576AFD6A19CE4605692D110B563605F326CD31401A8DC027277FF4156ED138E959B0B33EA1727191E6103F0E2B92AAF70DA1AC8D95C600F5ABF6E7298CD508B2547157E0E0646057133626385F4E7D6A94C3CA3B95F2BED53CA777534D0060AE38A10820B907018939AB6B215E8C78E99AC9962F2E4EF8CF06A6866200CF38A6ECF541736A1BC65C10D83F5AD18754753870187AF7AE737AE370E3352A4848C93CD43498CE8AEEE927B0B845077344EA07A92A6BCEBC136B7165AFC915CC0F13F9278718EE3A7AD754931F5A9D662486CF23A71428A406D4678AB0959305F0E378FC6B462915C6548349A02D0E9484FAD341A09E2A581CE83F3B7D6AC466AAE7F7AFF5A9E33CD37B816334134CCF14D2DE952D80E634CCD34B530B7A54003B0E848C9A601CE013552489FED892AB1DBD1855C5EA2B4A7B01E7FE35D3EE13587BA604C6E8B86FA0AE5049E8C3F035EC1E2CB21368CD205F9954FF002AF0E3ED5B2BD846989E45E8C6A44D4664E8C6B2048EA78634E170DDF0684FB858E8EDFC45796E7293BAFD188AD6B7F1C6A317067DDFEF806B88FB40EE29C265CF5A172858F4987C7F26009A18DBE99154EFFC5B7D7C0AC532C119E36C6704FE35C2ACA09E0D5A89A36E1DCAFA1155CA856358B966C92324E4FD69A0E4E1707EB54420CFC972BF8F14D69248DB6920E3B8A39520BB67A944DBA253CF2A0FE60529A86CDFCCB185BD6243FF008E8A7139AF1A4B5D0F485CD1C629B9A33C53B00FCF6A6E4E3AD029BD01A62173C528EB4DCD28A6C0DEF059F9F594FF00A788DBF38C7F85753DAB8FF05BFF00C4CF59407FE78B63F022BAF3D3AD77D3F811C33F899E29AF8F2F50D501FE1B99B3FF007D9AF741A94C58E0281D8015E1FE2C5C6B1ACA81FF002DA53F9927FAD7AEDA3F9969049FDF895BF300D508D4FED09CFF0010FCA93EDB37F7AA9E6941A2C80B26EE6FEF9AE6F5BD4DEE2E3ECE5C98E3EA3FDAAD5BCB8FB3D9CB367055723EBDAB90623EF1E49E7EB4D211544A0DFAF27806AF093A9CE2B291F3A8B647F0D5D120CF7E29822566F534C6700706A23283D2A267C0EB4C4399FDEA27662703F9D34B6698739DDEB54900E1D7279A76FDA0920D461B151C8DC7D69A40579E62727D6A051DCD4D27DE1C74A548B702E48DBFCE9D8633195C103069891BC726E5F96AC6D0082381EBDE91BEF1E7834598017DC771514D639F9B38A070BF5A628E09F7A1009C06A636483D69FD3A9A46E9934C0C7BF4CE6AC6892621DBE8302A3BC5F9AA0D324D8EC0766AE8C3EF632A9B1D0671D6A33D724E29DF7B9A315DB139EC331C6714DDA08CE294FA639A146392702A8063054566620639AC069DF52BA668B73C5173B50FCCDEF8EE299ADEAAF3030DBE7C8CE1A41D0FB562C4CD1B86562AC0E41070457156ADADA26F4E9E9766C36B6919090C0C501F9B7706B66D2586F221242C08EE3B8AC413C1AAFCB7ACB15D9E05D6301BFDF1FD6A833DE68D7CC3063990E190F423FA8F7A88E21C5FBC53A4ADA1DBAC60715328C6071C566E95ABC1A8A007F773F743DFE95AD80062BB2335257473B8B4ECC8CE319AAE46E7A9DC67A546060F4A99EBA0E2598F11C4CE7B0CD625A9FDFCBD7EF1CD6A5CB95B43FED71599029FB4CD8FEFD73D65EE9AD3DCD8B77E322B423914C79159B182171FCAA65C8EF5C2D1B1695C330F5A9083D71C542A403CFE75389542F27348063059130DD7B5535383F8D32EA7DD2880746FBDC7414F5550B8F4AA404C848F94918ED5287C60E7EB55436D20F5A97703C9EF45B502D2383C0E953093B0AA28F838C54A920CF5A9B08BAAD8E6ACC570D19F9588359CAC7A53D64E7AD033A0B6D455B89303DEAEABAC8A76B03F435CB09C0E9524576629376E217DAA79505C90E04CE3DCD4A86A06C79858670DC8CD48952F7193E69A6929A4F1512D18084E6984D29A6354301B9F987353275AAC3EF81EF5617822B486C05BD6137E8B383D3CA6FE55F3D761F4AFA23541FF001279FF00EB8B7FE835F3C1E40FA5744512861A6D3A92A0A128A28ED400528661D18D2514012099C77A78BA71D466A0A4A77607B0E90FBF47B4627AC0BFCAAC13CF5AA3A1B03A259F2388F1FA9AB8739CD79938DA6CEE8BBAB867DE9D51D381E69228900A67F11CD3875A8DFEFD3121C3A528F6A603C5385006AF830E35FD597D6084FEAD5D99EF5C47845B6F8A2F97FBD6687F2735DBE0577D37782386A2F799E3DE2D5FF8A93541FDE933F9A835E9DA33EFD0F4E7FEF5A427FF001C5AF37F1926DF145F7FB5B1BF345AEFFC34FBFC2FA4B1EA6CE1FD100AB1335C52D4629D408CAF11C9B74E58F38DF2007E839AE7431098CE6B63C4AC08B78F233C9C679AC02C554F1F4A684574606FDBBE16AC93DBD6B395BFD340CF38E6AD993E6E6A901231038A85BE6072682D8E4743C537763F1A760101E01078A773C60E69A46E18FE54600F5C556B701CC71C71C540D963EC29C4FCDC521CEDF5A008987734D88B3210074EF522E71CF39A8C00272BC8046462801E33B705BA7AD2100E3BD2A8032293276918A761887AF3484738C75A5539C7B5237241C53019DE9857DF35360838A4DA31CD24066DE2719E6B2AD64F2F5268CF01C656B6EE94ED1CF4AE7AF7315CC732FDE535A536D493264AFA33AA84E507B53FB62A959CE24895C771CD5B1C9AF477D4E56014B3743C573DAFEA8EC8D6B6AFB474761FCAAFEB1A87D9E3F2213FBD6182476158715B8600B56536E5EEA2E092D599767773583B0461B5861E3619571EE2B405AC7A82B4D609B245197B6CE481EABEA3DA997162241E6210083F855389A58270CACD1CA87820E0A9AF3AA41C1D99D1192689507518FAD3E6905C5A08643F3C2331377DBDD7E9DC56C4221D772098E0D4B1C1E893FD7D1AB0AE6292DEECC72A32488D86561820F7A4D7BBA0C920468F0CA4AB0E845751A66AFE7E21B9387C70DEB583081B2A658B7723A8AF429C6C8C26EEF53AC3D39EA6A3E6B3B4ED40CC7C894FEF14704F715A639AA645AC4776494503B102AA41FF001FB71C9FBE6AC4DCC1B87771505AE0DDCF9EEF58D5F84A86FF00D791A483E5F5A901E3D299C00314809DDEB5C4F43A0B0AC00E98F5A46DA48C5479E33DE9CA78CE29596E05536D22CCCF9DE58E49AB2B82A3D7D2A40723A74A440181CFE14F45B0866C1E94F1823693F4A56F91323069808CE40E69A6807631861F8D48A7F2A60E7E5C0F634CE71C9E94AC845B571FDEE94FDD9AA6B27BD3F7F18E695B5196739F4A466F978A895F03EB4195473F81A9B016ACA5678B0F8F94600F7ABB0B6E506B0ED6E365CCCABF74F38AD3B293EFAE7383C5293EA08BF4D3499C531DAB296E50A4E2A366A633D445EA52B80F0C0B8AB4BDAA82366515753AD5C00D0D4BFE411363FE78B7FE835F3D761F4AFA1751FF009044DFF5C5BF95780450990024E171D6B78D895B958A93C019353259B9196C28F7AB4BB231FBB5C9F5A692C7A9A9B6A5118B541FC59347D9C76514F03D694609F4FA1AB8A4C440620BC6CFD2936AFF0076ACFCE070DC537783D541A39505CAF85F4A6ED5AB412363D08A3CA5ED472760B9E8FE1F6DDA35BE7B6E1FF8F1ABD9ACEF0FF1A4AAFF00765907EB57CF5AF2EAFC6CEDA57E50A514CA70E9508B251CD31FAD2A9A47EA28043738A7F6A8E9C3A67AD319A1E1638F1838CFDEB13DFD1C7F8D7766B80F0C9C78CE3CFF001594807FDF4B5DFD7751F811C357E3679578E463C53371F7A28CFE98FE95D9F84981F09695ED6E17F2247F4AE43C7A98F11EEE9BADD3F9B5755E0E6DDE14B0F60E3F291AB427A1BE3D2A2B99C5B5B3CA7F84703D4D3BA573FAFDF90C2DD0FCAA72FEE7D2824C79E5967BA69646C93D49A88BFCAC7B50EE5F9E83D2A26202E055A8836534C9BE6273F76AE94F97354139BC6C7B0ABB961D4D52D84F7023181E829B9C9C628DC5B93FA8A4DD8ED815560400952707AFA5193FE45267DE9FCF4DC334BA87419E9EF4EDBD062940DAC3A53B86F988EF9A6031B1D00E955DDB6CC8738CF19C54FC609CF26AB5C0C2039E841A56EA32577556F979F7A60CB9EFED8A08E848C53FA73E9DA8011571D38EF4BDA9A7EF74C5380E28D806B107045348E73D297F87E94879029815A6076E315897D1E4FD456FDC0F978AC9BA4F9D7EB550DD09AD066972ED3B09E1BA56A4F722DE21D0BB70A2B1A38CA138E0A9E2AC2A34B3798E4B3638CF6AF455EC733DC61B4DE59E4397639269A610919AD38D772E31504CB8078A4D580A30460C6C319E6B3A7B5DF2884F121E2173DFFD927F956D5BA0DA7FDEAA1A9C6A6D5893820F0476ACEB5352A7A95095A464459CF7047E86AF5EDD1D4A255B8E6EE3184971CC80766F7F4352A46DAD5C426DE3637AEBFBFC9F95881CC993D33DFDEB2AEC1591B690C14F0CA783EE2B817C074F536E0B1DC3AFCA6AE1B211C5919E2974F3BED63279254648AB8EA186DF5AEFA6FDDB9CD25A985B1A3944A9C303C1ADCB7BD13C1D4093A11559EC8E78A9AD2D5627CFF1569CA4DCB372BB2CE3E3F8C556B4E6EAE0F5CC956EFBFE3D507FD341556CFF00E3E26CF76AC2BECCBA7FD7E068A9F5ED402377D28E33F4A62F527D6B85AD4E825F43EF4A0FCDD69B9F9707029DBA30A3E6C367F4A10876EC9269C87E5A8B07923EEE7A8A7A2829934595808DFA038A78520545336D0B819E6A4462451E603979EBD69587CDBBD7DE93BF38A5272083F5A6C44671D3BF6A50D8EDC8A08C80714DCE3B52F31DD8E2E28DDBC723151139E69DBB8E450D888ADD80BE71DB68AD5B17DB758CFDE15931E05E9C0EA2ADDBC9B6FA2F738A992D06B7378B542CD4E6A84B13DAB2B228426A2634A698C6B27E60119FDE2FD6B490F3597191E6AFD6B497A8ABA6069EA1CE93367FE78B7F2AF04806615CF231C0AF7CBFFF00903CDFF5C5BF957825BFFA85FA56C84879A8CF5A73B84EA6A1DD239F9109F7A6B418F34CA3CB9F19C0A692EBF79687B800CFA9C1A50B83E9481D7E94EEBD2AA28070C8A371A4A89890D9AA7EE88F4AD0F8B39973F76E641C9F7AD039CD67691F29BE43FC374D8FC6B40F5AF22ABBC8EDA5F0A129CBCD479A91335068483A535F934BDE91B939AA62B0DA51483AD29E0D0365AD078F1958FF00B56F30FE46BD06BCE7463FF1596947D5261FF8E57A2B57751F811C55BE33CD7E212EDD72DCFF007ADC7E8C6B7BC10DBBC2B6FED24A3FF1F27FAD62FC445C6A964DEB0B0FD6B57C08D9F0D01FDDB8907F235A19F437EF2E45ADB3487AF451EF5C85CEE93258E58F24D6A6B375E65CAC2A7E48FAFD6B318739EB4D09EC54473CE474A6C99DB9E99A91D00391DEABCAFDAB44C45585B6DD3923A55C69323A7154A0E669093DEAC95278E69AE80F71E5C05E38A4EABDF34C23247F5A500E7F5A03A8F0B93D78F4A703B4FEB8A60CF51D3A6714A381938E68B00F1F779EB411C533731C1A7330191C8A16E02103155E64DC0AFA8A9F72F4E314C6C11D4714EE3238D43C43A96EF53ECC28DDD6A1858AA30C80A0D06467C8F4A403D8AF07AD00E4D44324723814EEDE94C070C8C8F5A630C7BD38F5E2983AD36AE045372BF4F4ACEB91F283E8735A6FD38E2A85C21689BAF4EB49681EA44146FCFA8A99536B669106E8A36F502A6095EA476395AB162140466AB5C01B9AAD41F76A0B91DFDA94B6127A95AD972ADFEF1AC8D6E45483CB1D58F15B96BFEA8E3D4D60DFA25EEA213EEC7026656CF6EA7FA0ACAACB9691A415E4476F39B2D2CC51B625BB5FDE11D447D87E354A45DCB81CE7814E794CF70F211804FCAB9E83B0FCAB5AC2DD2CAD4EAF76B954245AC647FAD93B1FA0EB5C297BA740DD01A746B8B6752561382DE9CE2B71464E7B57396F702DB498DD5C99A6B92D2E0F55503AFE24D74303875520F0466BA70D2BAB18D556D4988A742A01A613C8A9E1CFA57618916A2716C9DBE71552CBFD74B8FEF7356B533FE8ABEA2415534F3FBC908EED5CB59E8CD69FF5F81A43BF39A403E5E0D22FDDE73F5A5E95C3B1B0A3A0A7700D22F6A382C4D3EA03402ADB81C1FA76A7F9871D00F614BD06734C75C8CE6860324237A9FCC54B19E3A55720F98BCE6A5C739A482C4D9C8E38A7607AF351860BD2943E4FF2A18BCC500038E4D371DC8A713C77C8A0F4CD2E81B11B600C002A2738E40EB5330E338FCAA166016840411926F33E8B568B9F3236F461FCEA8C249BD6C1E82ACCA76AE7AF7A4EC0748D5193C52472896259074619A6B1AC5DD22C61EB5131A731A8C9ACF40150FEF571EB5A11CA8C7683F30EA3BD66C67F7CBF5AD168925003A838E87B8FC6AE006BEA0D8D166FFAE47F957834092B42BB46D18FBC6BD


    fakedit: [file.io]::Writeallbytes and set-content both start writing then quit after writing the first line of the JPG. maybe it's a buffer/variable size problem.

    edit fixes it. use -maxbinarylength and set-content does it in 3 lines.
    BUT there is loads of padding in the file. oh well.

    $Sql = "SELECT emailaddress,photo FROM [dbo].[vActiveDirectory_StaffData] WHERE Username = 'BOBRULES'"
    $SqlOutput = invoke-sqlcmd -query $Sql -Serverinstance $server -Database $database -Querytimeout 10 -MaxBinaryLength 64000
    set-content -encoding byte -path "x:\temp\temp.jpg" $sqloutput.photo
    Last edited by Itiken; June 13 2018 at 02:15:21 PM.
    Please don't teach me what to do with my pc.

  8. #2488

    Join Date
    May 31, 2011
    Posts
    4,032
    With the edit/fakeedit stuff at the end, I'm a bit unsure what your actual request is or even if there's still questions open?

  9. #2489

    Join Date
    May 30, 2011
    Location
    asleep
    Posts
    6,271
    yeah sorry - i confused myself half way through and got distracted by a conference call
    mostly i'm jsut ramblng out loud trying to find a solution.
    spoilered below for terrible rambling:
      Spoiler:


    hopefully this will be slightly clearer.

    The original code does something clever, somewhere an strips out all the extra whitespace at the end of the BLOB.
    Dumping the $out array from this code block, before it's destroyed, shows there is a crapton of 0x00's at the end, illing between the end of the file and the $buffer variable size.

    Code:
    $out = [array]::CreateInstance('Byte', $bufferSize)      
     # Looping through records            
    While ($rd.Read())            
    {            
        Write-Output ("Exporting: {0}" -f $rd.GetString(0))        
        # New BinaryWriter            
        $fs = New-Object System.IO.FileStream ($tempfile), Create, Write
        $bw = New-Object System.IO.BinaryWriter $fs
                   
        $start = 0
        # Read first byte stream            
        $received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1)
       While ($received -gt 0)            
        {            
           $bw.Write($out, 0, $received)
           $bw.Flush()
           $start += $received
           # Read next byte stream            
           $received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1)
        }
    I've been able to replicate the whole "grab photo BLOB from SQL and write it to a file" functionality of this shitty ADO.NET implementation:
    Code:
     
    $Sql = "SELECT emailaddress,photo FROM [dbo].[vActiveDirectory_StaffData] WHERE Username = 'BOBHOPE'"                 
    $SqlOutput = invoke-sqlcmd -query $Sql -Serverinstance $server -Database $database -Querytimeout 10 -MaxBinaryLength 64000
    [io.file]::writeallbytes("x:\temp\BOBHOPE.jpg",$sqloutput.photo)
    But, the file it writes is the same size as the value for MaxBinaryLength. If Maxlength is too small, the file is fucked. if it's too long, it's just unnecessarily large and there's 12-26kb of 0x0 on the end that i'm having huge difficulty removing, filtering, replacing or otherwise managing, as powershell seems to fudge bytestreams a bit.



    The xact task: remove trailing whitespace / 0's from a powershell bytearray.
    Last edited by Itiken; June 13 2018 at 01:09:39 PM.
    Please don't teach me what to do with my pc.

  10. #2490
    Daneel Trevize's Avatar
    Join Date
    April 10, 2011
    Location
    T L A
    Posts
    12,369
    Can you spoiler that retarded long code block that's making the element alone 305770 pixels wide, ty.

    P.S. For efficiency, you might find you don't need to $bw.Flush(); after every .Write(), just before .Close().

    P.P.S. https://msdn.microsoft.com/ fails with "Peer attempted old style (potentially vulnerable) handshake. Error code: SSL_ERROR_UNSAFE_NEGOTIATION". Quite awkward, had to use google cached pages to browse docs.

    Your problem has been encountered before and an alternative mentioned. https://port1433.com/2016/07/08/why-...d/#comment-598
    Last edited by Daneel Trevize; June 13 2018 at 01:47:07 PM.
    Quote Originally Posted by QuackBot View Post
    Idk about that, and i'm fucking stupid.

  11. #2491

    Join Date
    May 31, 2011
    Posts
    4,032
    Quote Originally Posted by Itiken View Post
    The xact task: remove trailing whitespace / 0's from a powershell bytearray.
    Perhaps the solution is to tackle the problem at the source, not somewhere in between, i.e. use SQL commands to transform it when retrieving the data. Something like mentiond here: https://stackoverflow.com/questions/...tring/20677645, if needed in combination with SQL RTRIM()

    Quote Originally Posted by Daneel Trevize View Post
    P.P.S. https://msdn.microsoft.com/ fails with "Peer attempted old style (potentially vulnerable) handshake. Error code: SSL_ERROR_UNSAFE_NEGOTIATION". Quite awkward, had to use google cached pages to browse docs.
    That's perhaps because https://docs.microsoft.com/ is the place where MS' documentation now lives.

  12. #2492

    Join Date
    April 13, 2011
    Posts
    6,498
    And stop storing binaries in a database.

  13. #2493

    Join Date
    May 31, 2011
    Posts
    4,032
    While agreed in general, he mentioned "HR database", so I assume a 3rd party application is the culprit here.

  14. #2494

    Join Date
    May 30, 2011
    Location
    asleep
    Posts
    6,271
    Quote Originally Posted by elmicker View Post
    And stop storing binaries in a database.
    Not my fault m8 - we gotta put the pictures somewhere. apparently

    Executewithresults does the job though, thanks for the pointer.

    Code:
    import-module sqlps
    $result = (get-childitem  -path sqlserver:\sql\SERVERNAME\default\databases | Where-Object {$_.name -eq "DATABASE"}).executewithresults("Select * from dbo.vActiveDirectory_StaffData where username = 'USERNAME'))
    [io.file]::writeallbytes("x:\temp\picture.jpg",$result.Tables[0].photo)


    The same result can be written directly to set-userphoto VoV

    edit: FUCKSAKE the fucking files that come out of the database don't commit to O365, but look fine.
    *headdesk*
    Last edited by Itiken; June 14 2018 at 10:20:47 AM.
    Please don't teach me what to do with my pc.

  15. #2495
    Movember 2012 I Legionnaire's Avatar
    Join Date
    April 9, 2011
    Posts
    1,717
    Anyone know of a good guide for setting up private static website hosting on AWS? Looking to get a dev environment going that's shut off from the outside world.


    For reference:

    I set up an openVPN instance in my default VPC
    There's an S3 bucket called dev.***.com which has my html files with the following bucket policy

    {
    "Version": "2012-10-17",
    "Id": "Policy1415115909153",
    "Statement": [
    {
    "Sid": "Access-to-specific-VPC-only",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::dev.***.com",
    "arn:aws:s3:::dev.***.com/*"
    ],
    "Condition": {
    "StringEquals": {
    "aws:sourceVpc": "vpc-da4df6a3"
    }
    }
    },
    {
    "Sid": "Stmt1529472272684",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::dev.***.com",
    "Condition": {
    "ArnEquals": {
    "aws:userid": "userid"
    }
    }
    }
    ]
    }
    And an entry in Route53 which aliases to that bucket.

    Still no joy ;_;
    Last edited by I Legionnaire; June 20 2018 at 05:51:11 AM.

Bookmarks

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •