# ipython/ipython

Updating RMT parallel example.

1 parent 2eae784 commit 18ad520a9477b477694960df5f4264677cd561e2 ellisonbg committed Aug 16, 2011
Showing with 1,420 additions and 62 deletions.
1. +1,270 −0 docs/examples/newparallel/rmt/rmt.ipynb
2. +133 −43 docs/examples/newparallel/rmt/rmt.py
3. +17 −19 docs/examples/newparallel/rmt/rmtkernel.py
1,270 docs/examples/newparallel/rmt/rmt.ipynb
 @@ -0,0 +1,1270 @@ + + + rmt + 2 + + + + + # Eigenvalue distribution of Gaussian orthogonal random matrices + + + The eigenvalues of random matrices obey certain statistical laws. Here we construct random matrices +from the Gaussian Orthogonal Ensemble (GOE), find their eigenvalues and then investigate the nearest +neighbor eigenvalue distribution $\rho(s)$. + + + from rmtkernel import ensemble_diffs, normalize_diffs, GOE +import numpy as np +from IPython.parallel import Client + python + 1 + 0 + + + + ## Wigner's nearest neighbor eigenvalue distribution + + + The Wigner distribution gives the theoretical result for the nearest neighbor eigenvalue distribution +for the GOE: + +$$\rho(s) = \frac{\pi s}{2} \exp(-\pi s^2/4)$$ + + + def wigner_dist(s): + """Returns (s, rho(s)) for the Wigner GOE distribution.""" + return (np.pi*s/2.0) * np.exp(-np.pi*s**2/4.) + python + 2 + 1 + + + + def generate_wigner_data(): + s = np.linspace(0.0,4.0,400) + rhos = wigner_dist(s) + return s, rhos + python + 3 + 1 + + + + s, rhos = generate_wigner_data() + python + 4 + 0 + + + + plot(s, rhos) +xlabel('Normalized level spacing s') +ylabel('Probability $\rho(s)$') + python + 17 + 0 + + + pyout + &lt;matplotlib.text.Text at 0x3828790&gt; + 17 + + + display_data + aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVl3QUFBRU1DQVlBQUFEWGlZR1NBQUFBQkhOQ1NWUUlD +QWdJZkFoa2lBQUFBQWx3U0ZsegpBQUFMRWdBQUN4SUIwdDErL0FBQUlBQkpSRUZVZUp6dDNYbGNW +UFgreC9IWHFMaW1tS0pwcVNCSkFTSXdLcUJwT3FVQ1NtWm1wZGF2ClRLM3dkaE8xckt4cmliYWJG +cVpvWkxmRjFKdG1wVWxkRVV0RU14Q0ZjczhWbHpTdml1REM0aWpuOThlSkNRUmtCbWJtekF5ZjUr +UEIKUTRZNW52UG05R2crbnUrcVV4UkZRUWdoaEtoQ0hhMERDQ0dFY0E1U01JUVFRcGhGQ29ZUVFn +aXpTTUVRUWdoaEZpa1lRZ2doekNJRgpRd2doaEZrMEtSaXBxYW40K2ZuaDQrUEQzTGx6eTcxZlVG +REFxRkdqME92MTlPM2JsMVdyVm1tUVVnZ2hSR2s2TGVaaDZQVjY1c3laCmc2ZW5KeEVSRVd6YXRB +a1BEdy9UK3g5KytDSGJ0MjluL3Z6NUhEbHloTHZ2dnBzREJ3NmcwK25zSFZVSUljUmY3UDZFa1pl +WEIwQ2YKUG4zdzlQUWtQRHljOVBUME1zZTR1N3R6NGNJRmpFWWpPVGs1Tkc3Y1dJcUZFRUpvek80 +Rkl5TWpBMTlmWDlOcmYzOS8wdExTeWh3egpjdVJJcmw2OWlvZUhCNzE3OTJiSmtpWDJqaW1FRU9J +YTliUU9VSkY1OCtaUnIxNDlUcDQ4eVk0ZE80aUtpdUxJa1NQVXFWTzJ2c2xUCmh4QkNWRTkxZWlQ +cy9vUVJFaExDM3IxN1RhOTM3ZHBGang0OXloeVRtcHJLSTQ4OFF1UEdqUWtMQytQbW0yOW0zNzU5 +Rlo1UFVSU0gKLzVvMmJacm1HU1NuWkpTY2tyUGtxN3JzWGpEYzNkMEJ0U2hrWjJlVG5KeE1XRmhZ +bVdQNjlldkg2dFdyS1M0dTV0Q2hRK1RrNUpScAp4aEpDQ0dGL21qUkp4Y1hGRVIwZGpkRm9KQ1lt +Qmc4UER4SVNFZ0NJam81bXhJZ1I3TjY5bSs3ZHU5T3FWU3ZtekptalJVd2hoQkNsCmFGSXcrdmJ0 +eTU0OWU4cjhMRG82MnZTOXU3dTdTeFVKZzhHZ2RRU3pTRTdyY1lhTUlEbXR6Vmx5VnBjbTh6Q3NS +YWZUMWFnOVRnZ2gKYXFQcWZuYkswaUJDQ0NITUlnVkRDQ0dFV2FSZ0NDR0VNSXNVRENHRUVHWnh5 +Sm5lNHZxS2lpQTlIZGF2aDh4TXVId1ppb3VoUXdlNAo0dzdvMnhlOHZiVk9LWVJ3TlRKS3lva1VG +RUJDQXN5Y0NiZmNBbmZkQldGaDBMZ3g2SFJ3NEFEOC9EUDg5QlBvOVRCNU12VHJwNzRuCmhCQWxx +dnZaS1FYRFNheGJCNk5HUVdnb1RKc0d3Y0dWSDF0VUJFdVd3T3paY1BQTjhPbW4wSzZkL2JJS0lS +eWJES3QxVVlvQzc3MEgKano0S2l4ZkR0OTlldjFnQU5HZ0FZOGJBYjcrcHpWUGR1c0h5NWZiSks0 +UndYZktFNGNBS0N1REpKMkgzYnJWUWVIcFc3enhidHNELwovUi8wN3EwMmFibTVXVGVuRU1LNXlC +T0dpekVhNGI3NzFEODNiYXArc1FDMUdTc3JDLzczUDNqb0liWEpTZ2doTENVRnd3RXBDano5Ck5O +U3JwL1pGTkc1YzgzTTJhUUxmZkFOMTZxaUZxS0NnNXVjVVF0UXVVakFjME15WnNIVXJmUG1sV2pT +c3BYNTlXTFlNYnJ3Ujdya0gKOHZPdGQyNGhoT3VUUGd3SDg5Vlg4Tnh6OE1zdjZ0QlpXN2g2RlI1 +NUJPcldWVHZTWmRpdEVMV0xES3QxQVljT3FmTXFrcE9ySGdsVgpVL241Y09lZE1IS2tPbDlEQ0ZG +N1NNRndjb3FpVHJJYk5NaCtIK0JIajZvRjZyUFBJQ0xDUHRjVVFtaFBSa2s1dVlVTDRkSWxtRFRK +CmZ0ZnMwRUdkbi9IWVkrb3NjU0dFdUI1NXduQUFSNCtxayt0U1VxQnpaL3RmZjhFQ21EY1AwdEtn +YVZQN1gxOElZVi9TSk9Xa0ZFVnQKaHVyZEcvNzFMKzB5UFBHRTJ2bjk4Y2ZhWkJCQzJJOVROVW1s +cHFiaTUrZUhqNDhQYytmT0xmZityRm16ME92MTZQVjZ1blRwUXIxNgo5Y2pOemRVZ3FlMTkvVFdj +T0FFdnZLQmRCcDBPNHVMZ3h4OWh6UnJ0Y2dnaEhKc21UeGg2dlo0NWMrYmc2ZWxKUkVRRW16WnR3 +c1BECm84SmpFeE1UaVl1TFk5MjZkZVhlYy9ZbmpDdFgxQ2FvdVhNaFBGenJOR3JCR0QwYWR1d0Fk +M2V0MHdnaGJNVnBuakR5OHZJQTZOT24KRDU2ZW5vU0hoNU9lbmw3cDhVdVhMbVhreUpIMmltZFhu +MzJtenJVWU1FRHJKQ3A3ajlJU1FqZ1h1eGVNakl3TWZIMTlUYS85L2YxSgpTMHVyOE5qOC9IeVNr +cElZTm15WXZlTFpUVUVCVEo4T2I3M2xXQlBuWnM1VTU0R3NYYXQxRWlHRW8zSG9IZmRXcjE1Tjc5 +NjlhZDY4CmVhWEh4TWJHbXI0M0dBd1lEQWJiQjdPQytIZ0lDVkhuUVRpU1pzM1VJYjVQUEFIYnQw +dlRsQkN1SUNVbGhaU1VsQnFmeCs1OUdIbDUKZVJnTUJyS3lzZ0FZUDM0OGtaR1JSRVZGbFR0MjZO +Q2hEQjgrbkJFalJsUjRMbWZ0dzhqTmhkdHVVNGZSK3Z0cm5hWmlUejJsTG9NZQpINjkxRWlHRXRU +bE5INGI3WC85a1RVMU5KVHM3bStUa1pNSXErR2QyWGw0ZXFhbXBEQmt5eE40UmJlNzk5eUVxeW5H +TEJjRGJiNnZyCld1M2NxWFVTSVlTajBLUkpLaTR1anVqb2FJeEdJekV4TVhoNGVKQ1FrQUJBZEhR +MEFDdFhyaVFpSW9KR2pScHBFZEZtQ2dyVWlYS2IKTm1tZDVQcGF0SUJYWGxGbm5xOWQ2MWo5TEVJ +SWJjakVQVHY3K0dOWXVSSVNFN1ZPVWpXakVRSUQ0ZDEzMWVYUWhSQ3V3V21hcEdvegpSWUU1YzJE +aVJLMlRtTWZOVGQxUC9Mbm40UEpscmRNSUliUW1CY09PZnZycDcxVnBuY1hBZ2VEdERmUG5hNTFF +Q0tFMWFaS3lvOEdECjRkNTc0Y2tudFU1aW1kMjdvVzlmMkxNSEtwbVFMNFJ3SXJMNG9JUGJ2eDk2 +OVlJalI4QVorL0hIajFlZmp1Yk4wenFKRUtLbXBHQTQKdUpnWWRlbndOOTdRT2tuMW5EMEx2cjdh +TGNFdWhMQWVLUmdPTERkWDdRZllzY04yKzNUYlE4bUt0cXRYYTUxRUNGRVRNa3JLZ1gzeQppZHA1 +N016RkFtRGNPTWpLZ293TXJaTUlJYlFnVHhnMnBpanFNaUJmZkFFOWVtaWRwdWJpNCtHSEgrRDc3 +N1ZPSW9Tb0xubkNjRkJwCmFWQ3ZudU10TWxoZEpZc1NYbWRGZWlHRWk1S0NZV05mZkFHUFB1bzZT +MnMwYUFBdnZ3eWxGZ2tXUXRRUzBpUmxRMFZGYXI5RlppWjAKNktCMUd1c3BLbEtiMlpZdGM0MW1O +aUZxRzJtU2NrRGZmdzlkdXJoV3NRQjV5aENpdHBLQ1lVT0xGc0ZqajJtZHdqWkdqMVpuZnYveQpp +OVpKaEJEMklrMVNObkxtREhUcUJFZVBxcnZZdWFLUFBvSVZLMlE3VnlHY2pUUkpPWmhseTJEUUlO +Y3RGZ0NQUDY0dWVmTHp6MW9uCkVVTFlneFFNRzNIbDVxZ1M5ZXZEdi80RjA2WnBuVVFJWVE5U01H +emc5OS9WcHFqKy9iVk9ZbnVqUnNHaFE3QnhvOVpKaEJDMkpnWEQKQnI3NEFoNStXSjJ3NStyYzNP +Q2xsK0N0dDdST0lvU3dOZW4wdGpKRmdZNGQxVzFZZzRPMVRtTWZoWVhxNzV5Y0RBRUJXcWNSUWxU +RgpxVHE5VTFOVDhmUHp3OGZIaDdsejUxWjRURVpHQmlFaElmajUrV0V3R093YnNBWXlNOVY1Q2tG +QldpZXhuNFlONFpsbllOWXNyWk1JCklXeEpreWNNdlY3UG5EbHo4UFQwSkNJaWdrMmJOdUZSYWlz +M1JWRUlEQXprL2ZmZnAzLy8vcHc1YzZiTSt5VWM4UW5qbFZmVS9hL2YKZVVmckpQYVZrNk1PSTNi +MkpkeUZxQTJjNWdrakx5OFBnRDU5K3VEcDZVbDRlRGpwMTZ4a3QzWHJWZ0lEQStuL1Y2OXhSY1hD +VWExYwpDZmZkcDNVSysydlJRbDB6YTg0Y3JaTUlJV3pGN3QyeUdSa1orUHI2bWw3NysvdVRscFpH +VkZTVTZXZEpTVW5vZERydXZQTk9tamR2CnpqUFBQRU5FUkVTRjU0c3R0VDZGd1dEUXRQbnF3QUYx +d3A2cnJFeHJxVW1Ub0ZzM21EclZ0ZWVmQ09Gc1VsSlNTRWxKcWZGNUhISWMKVDJGaEliLysraXZy +MXEwalB6K2ZBUU1Hc0hQblRocFZzQmwyckFNdGFMUnFGUXdlREhWcTZkZ3pMeThJRDFkbmdFK2Vy +SFVhSVVTSgphLzh4UFgzNjlHcWR4KzRmYlNFaEllemR1OWYwZXRldVhmUzRac25UbmoxN01uRGdR +TnEwYVlPM3R6ZmR1M2NuTlRYVjNsRXRWbHViCm8wcDcvbm0xV2VyeVphMlRDQ0dzemU0Rnc5M2RI +VkJIU21Wblo1T2NuRXpZTlcwNFBYcjBZTU9HRGVUbjU1T1RrME5XVmhhOWV2V3kKZDFTTC9POS9h +b2Z2M1hkcm5VUmJYYnVxUzU5LythWFdTWVFRMXFaSmsxUmNYQnpSMGRFWWpVWmlZbUx3OFBBZ0lT +RUJnT2pvYUZxMgpiTW5vMGFQcDNyMDdyVnExWXNhTUdkeHd3dzFhUkRYYjZ0VnFjMHpEaGxvbjBk +N3p6OE1MTDdqV3hsRkNDSm00WnpXREI4UElrZW9NCjc5cE9VZFI1S0ROblFtU2sxbW1FRU5lcTdt +ZW5GQXdydUhnUmJyNVpYVCtxZVhPdDB6aUdSWXZnODgvaHh4KzFUaUtFdUpiVHpNTncKUld2WHFs +dVZTckg0MjRnUnNHK2ZPdk5kQ09FYXBHQllnWXlPS3E5K2ZaZ3dBZDU5Vitza1FnaHJrU2FwR2pJ +YW9VMGIrTzAzYU5kTwoweWdPNS94NWRWSENiZHZVT1JwQ0NNY2dUVklhMmJnUmJyMVZpa1ZGbWpX +RHNXUGgvZmUxVGlLRXNBWXBHRFVrelZIWE4yR0N1ajlJClRvN1dTWVFRTlNVRm93WVVSUzBZUTRa +b25jUngzWEtMT3VSNDRVS3Rrd2doYWtvS1JnM3MyYU91RytYdnIzVVN4elpwRXN5ZEs4dUYKQ09I +c3BHRFVRSEl5REJnZ3M1bXJFaHlzTGhmeTFWZGFKeEZDMUlRVWpCb29LUmlpYXM4K0MrKzlwemJq +Q1NHY2t4U01hcnA4R1ZKVApaYkZCY3cwYXBNNklkNEpGaDRVUWxaQ0NVVTFwYWVEakEwNjBHYUNt +NnRSUit6TGVlMC9ySkVLSTZwS0NVVTNyMWtsemxLVWVld3cyCmI0YjkrN1ZPSW9Tb0Rvc0x4b1VM +RjlpMWF4Y3BLU244OXR0dkZCUVUyQ0tYdzVQK0M4czFiZ3pSMGJMdnR4RE95dXlsUVZhc1dNSHUK +M2JzNWNlSUVYbDVldEduVGh1UEhqM1AwNkZHYU5XdkdnQUVES3QxMzIxYTBXaG9rTnhmYXQ0ZlRw +MlgvQzB1ZFBBbWRPNnY3bjdkbwpvWFVhSVdvbm15MXZmdm55WlQ3NTVCT0NnNFBMYmFWYVdtSmlJ +c2VQSDJmY3VIRVdoNmd1clFyR3Q5L0NoeDlDVXBMZEwrMFNSbzBDClB6K1lNa1hySkVMVVRnNnhI +NGFpS09qc09DbEJxNEx4OU5QZzdRMlRKOXY5MGk3aDExOGhLZ29PSDFaWHRSVkMySmZkRmgrOGNP +RUMKZS9mdUJkU25qMnREMUFiU2YxRXp3Y0hnNnd2TGwydWRSQWhoQ1lzTHhyZmZmc3Zldlh2cDBh +TUhFeVpNWU9YS2xSWmZORFUxRlQ4LwpQM3g4ZkpnN2QyNjU5MU5TVW5CM2QwZXYxNlBYNjNuOTlk +Y3R2b2F0WkdkRFhoNTA2YUoxRXVjbUUvbUVjRDRXRjR5aW9pTGMzTnhvCjFxd1pDeFlzNElZYmJy +RDRvaE1tVENBaElZRjE2OVlSSHgvUG1UTm55aDNUdDI5ZnNyS3l5TXJLWXVyVXFSWmZ3MWJXcllQ +Ky9kVjUKQmFMNkJnNkUvSHpZc0VIckpFSUljMVg1c1ZkVVZNUzVjK2RNcnlNaUl0aTVjeWZ4OGZI +TW1qV0xyS3dzMDN0SGpoeXA4b0o1ZVhrQQo5T25UQjA5UFQ4TER3MGxQVHk5M25OWWJJMVZHbXFP +c1F5YnlDZUY4cWl3WURSbzBZTU9HRGF4WXNRS2owVWlIRGgxNDhjVVg4Zkh4Cm9WKy9mb3dkTzVi +YzNGeGlZMlBadFd0WGxSZk15TWpBMTlmWDlOcmYzNSswdExReXgraDBPalp2M2t4d2NERFBQdnNz +Qnc4ZXJNYXYKWm4zRnhmRGpqMUl3ck9YUlI5VVo4L3YyYVoxRUNHR09ldVljZE45OTkzSGt5Qkhl +ZnZ0dHpwNDlTMkZoSVVhamtYUG56dEd3WVVQOAovZjE1NXBsbjhMRFNPaGxkdTNibDJMRmp1TG01 +OGZubm56Tmh3Z1FTRXhNclBEWTJOdGIwdmNGZ3dHQXdXQ1ZEUmJLeW9GVXIyVjNQCldrcFA1SXVQ +MXpxTkVLNHJKU1dGbEpTVUdwK24yc05xaTR1THFWT05odnk4dkR3TUJvT3BLV3Y4K1BGRVJrWVNG +UlZWNGZHS290Q20KVFJ1T0hqMUtnd1lOeXJ4bjcyRzFiNzhOSjA3QUJ4L1k3Wkl1NytSSmRUK1Jn +d2RsSXA4UTltSzNZYlY1ZVhuOCs5Ly9adVhLbGVUbgo1MXQ4UVhkM2QwQWRLWldkblUxeWNqSmhZ +V0ZsampsMTZwVHBsMW05ZWpXQmdZSGxpb1VXWlAwbzYydmJWdDJ4TUNGQjZ5UkNpS3BZClhERGVl +dXN0R2pWcXhPKy8vODZERHo1b1ZyL0Z0ZUxpNG9pT2pxWi8vLzQ4L2ZUVGVIaDRrSkNRUU1KZm54 +b3JWcXlnUzVjdUJBY0gKczJMRkNtYlBubTN4TmF5dG9BRFMwNkZ2WDYyVHVKNUprMkRlUE5tUlR3 +aEhaM0dUMUpJbFMzamtrVWNBdFZscTNyeDV4TVRFMkNSYwpWZXpaSkxWMkxjeVlBWnMyMmVWeXRV +Ny8vdXFTSVk4K3FuVVNJVnlmM1pxazZ0YXR5MnV2dmNheFk4Y0FxRmZQckg1enB5ZkRhVzFMCkp2 +SUo0ZmdzTGhnalJvd2dORFNVRjE5OGtZRURCOUt4WTBkYjVISTQwbjloVzVHUlVGZ0lWaGpJSVlT +d0Vhc3VQbWh2OW1xU0tsbk8KUENjSDNOeHNmcmxhNjZPUElERVJ2dnRPNnlSQ3VEYTdOVWxkdkhp +UkF3Y09VRnhjek1hTkcxbS9mcjNGRjNVMm16ZERhS2dVQzF1VAppWHhDT0RhTE95QmVmLzExR2pk +dXpPN2R1d0h3OFBEZ3JydnVzbm93UjdKeEkvVHVyWFVLMTllb2tUcVJMeTRPNXMvWE9vMFE0bHBt +Ck5Vbjk1ei8vSVRRMGxGdHZ2WldNakF4Q1FrSUE5V21qVHAwNk5HN2MyT1pCSzJLdkpxbmV2U0Uy +VmgzSkkyenJ6ei9WelpVT0hJQ1cKTGJWT0k0UnJzdWtHU2dNSERzVGIyNXZmZi8rZG5Kd2NRa0pD +R0Rac0dEMTc5cVJwMDZiVkNtd045aWdZaFlYZzRhRitrRlZqWVY1UgpEYU5IZzQ4UHZQeXkxa21F +Y0UwMkxSaVhMbDJpU1pNbUFPVG41N04xNjFhMmJObENSa1lHRFJvMFlOR2lSWlludGdKN0ZJeU5H +K0c1CjUyRExGcHRlUnBTeWZiczZhdXJ3WVhDQUNmNUN1QnlIMktMVjN1eFJNTjU4RTg2Y2tXVzQ3 +VzNBQUxVVC9MSEh0RTRpaE91eDJ5aXAKMm1ialJyanpUcTFUMUQ0eWtVOEl4eU1GNHpxdVhvVmZm +cEVSVWxxSWlGRFhscEtKZkVJNERvc0t4aDkvL0dHckhBNXArM1oxTmRWVwpyYlJPVXZ2SWpueENP +QjZMQ3NhQUFRTVlPSEFneTVjdngyZzAyaXFUdzlpMFNacWp0UFIvLzZldUVQejc3MW9uRVVLQWhR +Vmo5KzdkCnZQTEtLNnhkdXhZZkh4L0dqeDlQWm1hbXJiSnBUaWJzYWF0Ukl4ZzNUcDNJSjRUUVhy +VkhTYTFaczRZeFk4Wnc5ZXBWT25YcXhPeloKcytuUm80ZTE4MTJYTFVkSktRcmNmTE82TEVndFdW +L1JJWlZNNU51L1g1MFBJNFNvT2J1TWtqcCsvRGh2dlBFR0FRRUJmUExKSjN6MgoyV2VjUEhtUytm +UG5NMmJNR0lzdjdzZ09Ib1M2ZGNITFMrc2t0VnViTmpCMHFPeklKNFFqc0toZ0RCdzRrRWFOR3BH +U2tzTHk1Y3NKCkR3K25UcDA2QkFVRk1XN2NPRnRsMUVUSmNGcWRUdXNrWXRJa2lJK0hvaUt0a3do +UnUxblVKTFZseXhaQ1EwT3IvSm05MkxKSmF1eFkKNk5vVi92bFBtNXhlV0NnOFhPMEVsNGw4UXRT +Y1hacWtLbnFLaUk2T3R2aWl6a0FtN0RrV21jZ25oUGJNS2hnWkdSbkV4OGR6K3ZScAo1cytmVDN4 +OFBQSHg4Y1RHeG5MampUZGFmTkhVMUZUOC9Qenc4ZkZoN3R5NTE3MXV2WHIxK09hYmJ5eStSazM4 +K1NlY1BnMEJBWGE5CnJMaU9pQWd3R3FFV2JMOGloTU15cTJEazVlVng3Tmd4akVZang0NGQ0L2p4 +NHh3L2ZwdzJiZHJ3NmFlZlduelJDUk1ta0pDUXdMcDEKNjRpUGorZk1tVFBsanJsNjlTb3Z2dmdp +a1pHUmRsbkN2TFJObTZCWEwzWHltSEFNT2gxTW5DZ1QrWVRRa2tWOUdQdjI3ZU8yMjI2cgowUVh6 +OHZJd0dBeGtaV1VCRUJNVFEwUkVCRkZSVVdXT2k0dUxvMzc5K21Sa1pIRFBQZmN3Yk5pdzh1RnQx +SWN4Y2FJNk9tZktGS3VmCld0UkFRWUU2YW0zREJ2RDExVHFORU03THBuMFlKUi9tNGVIaGRPellz +Y3lYdDdlM1JSZk15TWpBdDlULzdmNysvcVNscFpVNTVvOC8KL21EVnFsWDg0eC8vQU5SZnpwNmsv +OEl4eVVRK0liUmwxaGF0UzVZc0FXRHIxcTAyRFZOaTRzU0p2UDMyMjZZcWVMMUtHQnNiYS9yZQpZ +REJnTUJocWRPM3o1OVdsS0xwM3I5RnBoSTA4L2JUNmRQSDY2ektSVHdoenBhU2trR0tGbFR6dHZo +L0d0VTFTNDhlUEp6SXlza3lUCmxMZTN0NmxJbkRsemhzYU5HN053NFVMdXZmZmVNdWV5UlpOVVVw +SzZCOGFHRFZZOXJiQ2lzV1BWMmZkVHAycWRSQWpuWk5NTmxFNmQKT2xWaHM1Q2lLT2gwT2xxM2Jt +M1JSZlY2UFhQbXpLRkRodzVFUmtheWFkTW1QQ3I1NStMbzBhTVpQSGd3OTk5L2YvbndOaWdZVTZl +cQpRemZmZU1PcXB4Vld0SE9uT2k5RGR1UVRvbnFxKzlscFZwTlU3NzlXNEx1MmFKUVVqSDM3OWxs +MDBiaTRPS0tqb3pFYWpjVEV4T0RoCjRVSENYMnMvYUQydjQrZWY0WVVYTkkwZ3FoQVFBRjI2d0pk +ZndxaFJXcWNSb3ZZdzZ3a2pLaXFLNzcvL0hpOHZyM0tWU2FmVGNmancKWVp1R3JJeTFuekN1WG9Y +bXplSElFV2pSd21xbkZUYVFsS1FXOWw5L2xlVmJoTENVVFp1azh2THljSGQzcjNDK2hFNm5vMlhM +bGhaZgoyQnFzWFRCMjdJQmh3OERDQnlhaEFVVlJuelErK0FENjlkTTZqUkRPeGFaTlV1N3U3Z0NW +OWpPNGl2UjBDQXZUT29Vd2gwNzM5NDU4ClVqQ0VzQStMNXpLZk9YT0dKVXVXc0hUcFVzNmVQV3VM +VEpxUmd1RmNIbmtFdG02RlBYdTBUaUpFN1dCUndWaXlaQWs5ZS9ia2wxOSsKWWZQbXpmVHMyZE0w +UjhNVmJOa2lCY09aTkdvRS8vaUhUT1FUd2w0c21vY1JIQnpNbWpWcmFOT21EYUFPdDQySWlPRFhY +MysxV2NEcgpzV1lmeHNXTGNOTk5jTzRjMUs5dmxWTUtPemgxU3AzSUp6dnlDV0UrdXl4djNxSkZD +d29LQ2t5dkN3b0thT0VpdzRtMmJWT0hha3F4CmNDNDMzYVFPVlBqd1E2MlRDT0g2ek9yMEhqOStQ +QUN0V3JXaVc3ZHUzSG5ublNpS3dxWk5teGd3WUlCTkE5cUw5Rjg0cjBtVG9IOS8KZVA1NW1jZ25o +QzJaVlRDNmRldG1tclEzY09CQTA4L3Z2LzkrdXk4TWFDdGJ0a0FGazhtRkUramNHWUtDNEQvL2dj +Y2YxenFORUs3TAo3bXRKV1pNMSt6RGF0NGVVRkxqMVZxdWNUdGhaVXBMNmhQSGJiektSVDRpcTJI +VGlYb21DZ2dMV3JsMUxVbElTNTg2ZE16MWRMRjI2CjFPSUxXNE8xQ3NhSkV4QVlxTzZ5Sng4Mnpx +bGtJdCtjT1dyemxCQ2ljbmJwOUo0NmRTb2JOMjRrS1NrSmc4SEE4ZVBIOGZMeXN2aWkKamlZOUhV +SkRwVmc0TTUzdTczMi9oUkMyWWRFVFJ0ZXVYY25NektSejU4N3MycldMdkx3OCt2ZnZUMFpHaGkw +elZzcGFUeGhUcHFoagorcWROczBJb29abkNRblZIdnA5K0FuOS9yZE1JNGJqczhvVGg1dVlHUVBm +dTNVbE1UT1RVcVZNVUZoWmFmRkZISXhQMlhFUERoaktSClR3aGJzdWdKWTlHaVJRd2VQSmdqUjQ0 +d1pjb1UvdmpqRDJiTW1NSFFvVU50bWJGUzFuakN1SG9WYnJ3UnNyTmxoVnBYOEwvL3dlMjMKcXd0 +SXRtcWxkUm9oSEpOZE9yMUJYVXNxS1NrSmdJaUlDRTBYSkxSR3dkaTVVeDFPS3l2VXVvNG5uNFFP +SGVDVlY3Uk9Jb1Jqc2t1VApWT20xcE5MUzByampqanVjZmkycGtnNXY0VG9tVG9UNTg5VStEU0dF +OWRUNnRhU2lvOVhobUg5TlpoY3VZdUJBZU9naEdEMWE2eVJDCk9CNVpTNnFhWkVrUTExU3lWNGJ6 +VGtzVnd2RlVheTJwa2oyK25YMHRxVXVYMUZWT2c0SzBUaUtzYmNBQXRWaXNXNmQrTDRTb3VXcXQK +SlZYeWZYWFhra3BOVFNVNk9wb3JWNjRRRXhOaktrZ2xWcTFheGF1dnZvcE9wK09XVzI0aE5qYVdr +SkFRaTY5VGxXM2IxT1lvV2JETwo5WlNleUNjRlF3anJxTlphVXR1MmJVT24wOUcxYTlkcVhWU3Yx +ek5uemh3OFBUMkppSWhnMDZaTlpVWmJYYnAwaVNaTm1nQ3dZY01HClhubmxGVkpUVTh1SHIyRWZ4 +cXhaY1BTb3VpKzBjRDB5a1UrSWl0bWxEeU0xTlpYYmJydU5sMTkrbVpkZWVvbmJicnVOalJzM1du +VEIKdkx3OEFQcjA2WU9ucHlmaDRlR2twNmVYT2Fha1dKUWMzN0JoUTR1dVlTN3B2M0J0RFJ2QzAw +L0xSRDRock1XaWdqRno1a3krKys0NwprcEtTU0VwS1l2WHExYnp6empzV1hUQWpJd05mWDEvVGEz +OS9mOUxTMHNvZDkrMjMzK0xsNWNXWU1XTll1SENoUmRjd2x4UU0xL2VQCmY4RFhYNnRQa2tLSW1q +R3JENk5FVGs0T045OThzK2wxMjdadHljbkpzWG9vZ0tGRGh6SjA2RkNXTFZ2R2ZmZmRSMVpXVm9Y +SHhjYkcKbXI0M0dBd1lEQWF6em4veXBOcnBMY3VadTdaV3JkU2gwNis5QmpiNmQ0Y1FEaThsSllX +VWxKUWFuOGVpUG93RkN4YXdkT2xTSG56dwpRUlJGNFp0dnZtSGt5SkdNR3pmTzdBdm01ZVZoTUJo +TUJXRDgrUEZFUmtZU0ZSVlY2ZCs1NmFhYnlNN09wbEdqUm1YRDE2QVBZOVVxCmRWdlAvLzYzV245 +ZE9KRno1K0MyMjJEelp2RHgwVHFORU5xemVSK0dvaWdNR1RLRU9YUG1rSnVieS9uejU0bUxpN09v +V0FDNHU3c0QKYW45SWRuWTJ5Y25KaEYzVExuVHc0RUhUTC9QRER6L1FyVnUzY3NXaXBxUTVxdmE0 +OFVaMTlyZXNSaXhFelZqVUpCVWVIczdPblR1cgpQVHFxUkZ4Y0hOSFIwUmlOUm1KaVl2RHc4Q0Fo +SVFHQTZPaG92djc2YXhZdFdvU2JteHQ2dlo2Wk0yZlc2SG9WU1UrSHlaT3RmbHJoCm9DWk1nRTZk +WVB0MmRiTXNJWVRsTEdxU0dqdDJMUGZmZi85MW00L3NxYnFQVlZldnFpdlRIam9FTFZ2YUlKaHdT +SEZ4c0g2OTJod3AKUkcxbWw5VnFBd0lDMkwxN042MWJ0Nlp0MjdhbUMyZG1abHA4WVd1bzdpKzll +emNNR2FMTzhoYTFSMkdoMnBleGZEbjA2S0YxR2lHMApVOTNQVG91YXBGYXRXbVdWSGU2MEppdlUx +azRORzhLcnI4Sy8vZ1UvL3FoMUdpR2NqMW1kM2thamtjVEVSQll1WE1peFk4Znc5dmFtClU2ZE9w +aTluSXgzZXRkZW9VZXFjRENrWVFsak9ySUx4OHNzdnMyREJBbHExYXNXTUdUT0ljL0twczFJd2Fp +ODNONWd4UTMzS2NJR0gKWlNIc3lxdytqRzdkdXBHV2xvYWJteHU1dWJrTUdUS0VEUnMyMkNQZmRW +V25IUzQvWDUzTWxaTWppdzdXVnNYRkVCd01yNzhPOTk2cgpkUm9oN00rbTh6Q0tpNHR4YzNNRG9I +bno1cHcvZjk3aUN6bUt6RXpvM0ZtS1JXMVdwNDVhTEtaT1ZZdUhFTUk4WmhXTTdkdTMwN1JwClU5 +UFhqaDA3VE44M2E5Yk0xaG10YXRzMnNNRks2Y0xKREI0TWpSdkRzbVZhSnhIQ2VaZzFTdXJxMWF1 +MnptRTNtWm5RcDQvV0tZVFcKZERwNDR3MFlOdzRlZUVEdDJ4QkNYSjlGcTlXNmdzeE1xT0ZFZGVF +aSt2V0REaDNnazArMFRpS0VjNmpXQmtxT3d0S09tL3g4OFBDQQozRnlvWDkrR3dZVFR5TXlFUVlO +ZzcxNW8zbHpyTkVMWWgxMDJVSEoyTzNhQW41OFVDL0czcmwzVi9venAwN1ZPSW9UanExVUZRNXFq +ClJFWGVlQU1XTDRZOWU3Uk9Jb1JqazRJaGFyM1dyZFdKZkJNbnltUStJYTVIQ29ZUXdELy9DY2VP +UVdLaTFrbUVjRnkxcHRQNzhtVzEKVS9Qc1diRHlYa3pDUmF4ZHF4YU9uVHRsWXFkd2JkTHBYWVZk +dTlUOXU2VllpTXFFaDRPL3Y3cHZoaENpdkZwVE1LUTVTcGpqdmZmZwozWGZoNUVtdGt3amhlS1Jn +Q0ZIS3JiZkNrMC9DbENsYUp4SEM4VWpCRU9JYUw3K3M3cGVSbnE1MUVpRWNpeVlGSXpVMUZUOC9Q +M3g4CmZKZzdkMjY1OTVjc1dVSlFVQkJCUVVFOC9QREQ3TnUzcjBiWHUzSkZuYlFYSEZ5ajA0aGFv +bWxUZU9zdEdEOWVWck1Wb2pSTkNzYUUKQ1JOSVNFaGczYnAxeE1mSGMrYk1tVEx2ZTN0N2s1cWF5 +bSsvL1VaRVJBU3Z2ZlphamE3MysrOXd5eTNxQjRFUTVuamtFWFZCd2c4LwoxRHFKRUk3RDdnVWpM +eThQZ0Q1OSt1RHA2VWw0ZURqcDF6ejc5K3paRTNkM2R3Q2lvcUpxdkZtVE5FY0pTOVdwQS8vK04w +eWJCa2VPCmFKMUdDTWRnOTRLUmtaR0JyNit2NmJXL3Z6OXBhV21WSHYvUlJ4OHhlUERnR2wxVENv +YW9EbDlmZU80NXRSUGNlV2NyQ1dFOVp1MkgKb1pWMTY5YXhlUEZpTm0vZVhPa3hzYkd4cHU4TkJn +TUdnNkhjTVptWmNNODlOZ2dvWE43a3liQmlCWHo2S1l3Wm8zVWFJYW9uSlNXRgpsSlNVR3AvSDdq +Tzk4L0x5TUJnTVpHVmxBVEIrL0hnaUl5T0ppb29xYzl6MjdkdTUvLzc3V2JObURaMDZkYXJ3WE9i +TVZpd3VoaHR2CmhNT0hvVVVMNi93T29uYlp2aDM2OTRlc0xMVXZUQWhuNXpRenZVdjZKbEpUVThu +T3ppWTVPWm13c0xBeXh4dzllcFJodzRheFpNbVMKU291RnVRNGVWQXVGRkF0UlhZR0I4UFRUNnU1 +ODBqUWxhak5ObXFUaTR1S0lqbzdHYURRU0V4T0RoNGNIQ1FrSkFFUkhSek5qeGd4eQpjbklZTjI1 +WEd1S3RBQUFWUjBsRVFWUWNBRzV1Ym16WnNxVmExNUwrQzJFTkw3OE0zYnJCMHFYcUNDb2hhaU9Y +WDN6d3hSZWhXVE4xCitXb2hhbUxyVm9pS1VwdW9icnBKNnpSQ1ZKL1RORW5abXp4aENHdnAzbDN0 +K0g3bUdhMlRDS0VObHk0WWlpSUZRMWpYdEducXFnRXIKVm1pZFJBajdjK21DY2ZRb05Hd296UWZD +ZWhvMmhFOCtVWmNOT1hGQzZ6UkMySmRMRnd4NXVoQzJjTWNkOEk5L3dNaVI2anBsUXRRVwpVakNF +cUlaLy9RdnExMWVicUlTb0xhUmdDRkVOZGV2Q2tpWHcrZWV3Wm8zV2FZU3dENWN0R0lvQzI3Wkp3 +UkMyMDdxMVdqUWVmeHlPCkg5YzZqUkMyNTdJRjQrUkp1SG9WMnJYVE9vbHdaWDM3UWt3TWpCZ0JS +cVBXYVlTd0xaY3RHQ1hOVVRxZDFrbUVxNXN5UmQxclplcFUKclpNSVlWc3VYVEM2ZGRNNmhhZ042 +dFNCTDc2QS8vd0hFaE8xVGlPRTdiaDB3WkQrQzJFdkhoNXF3Umc3VnAzL0k0UXJrb0loaEpYMAo2 +Z1hQUHc5RGg4TEZpMXFuRWNMNlhITHh3ZE9uNGJiYklDZEgrakNFZlNtS3VrUGZuMy9DeXBWUXo2 +RzNLQk8xbFN3K1dFcFdGdWoxClVpeUUvZWwwc0dDQk9tSXFKa2IyenhDdXhTVUxoalJIQ1MyNXVj +RlhYOEdtVFRCcmx0WnBoTEFlS1JoQzJFQ3padkRERC9EQkIycngKRU1JVlNNRVF3a2JhdFlQVnEr +R2YvNFNmZjlZNmpSQTE1M0tkM3JtNTBMNjkrbWZkdWhvRkU2S1VwQ1FZTlFwU1U5WEJHRUpvVFRx +OQovL0xycnhBVUpNVkNPSTZJQ0hqckxlamZIL2J2MXpxTkVOV25TY0ZJVFUzRno4OFBIeDhmNXM2 +ZFcrNzl2WHYzMHJOblR4bzJiTWpzCjJiTXRPcmMwUndsSE5IbzB2UG9xM0gyM0ZBM2h2RFFaSlQ1 +aHdnUVNFaEx3OVBRa0lpS0NrU05INHVIaFlYcS9aY3VXekowN2w1VXIKVjFwODdzeE05Vjl5UWpp +YUo1NVFoOTNlZFJmODlKTTBUd25uWS9jbmpMeThQQUQ2OU9tRHA2Y240ZUhocEtlbmx6bW1WYXRX +ZE8vZQpIVGMzTjR2UEwwOFl3cEdOSFFzelpxaFBHci8vcm5VYUlTeGo5NEtSa1pHQnI2K3Y2Ylcv +dno5cGFXbFdPZmVsUzNEa0NQajVXZVYwClF0akVtREh3K3V0cTBkaTdWK3MwUXBqUDZSY3VpSTJO +TlgzdjRXR2djMmNEMVhnd0VjS3VIbjljYlo3cTEwOGRSUlVRb0hVaTRjcFMKVWxKSVNVbXA4WG5z +WGpCQ1FrSjQvdm5uVGE5MzdkcEZaR1JrdGM5WHVtRE1teWZOVWNKNWpCb0ZEUnFvVHhxTEZrRU4v +amNRNHJvTQpCZ01HZzhIMGV2cjA2ZFU2ajkyYnBOemQzUUYxcEZSMmRqYkp5Y21FaFlWVmVLeWw0 +NFNsLzBJNG14RWo0SnR2MUZGVThmRmFweEhpCitqU1p1TGRod3diR2pSdUgwV2drSmlhR21KZ1lF +aElTQUlpT2p1YlBQLzhrSkNTRTgrZlBVNmRPSFpvMmJjcnUzYnU1NFlZYnlvYS8KWnZKSmNEQjgv +REYwNzI3WFgwZUlHanQwQ0tLaVlNQUFlTzg5V2VWVzJGWjFKKzY1ekV6dndrSm8wVUpkMHJ4aFE0 +MkRDVkVOdWJudwo0SU5Rdno1OCthVzY3YXNRdGxEclozcnYzS21PYTVkaUlaeFY4K2JxZ29YdDI2 +dWJNUjA0b0hVaUljcHltWUloL1JmQ0ZiaTVxZnRwClJFZER6NTVxWjdqenRnRUlWeU1GUXdnSG85 +T3BLOXorK0NPODh3NDg4Z2o4TmQ5VkNFMUp3UkRDUVFVR3d0YXRhdDljY0xBc2tTNjAKNXhLZDNr +YWoydjc3di85Qmt5WmFweExDK2xhdlZ2Y0tIemNPWG41WjdSZ1hvcnBxZGFmM25qM2c2U25GUXJp +dXdZUFZ2ZXEzYmxXWAo3MDlPMWpxUnFJMWNvbUJJYzVTb0RkcTJWWjgwWnM1VU84V0hEVlBYVGhQ +Q1hxUmdDT0ZFZERyMWFXUDNiclZmbzFzM2RmWGJnZ0t0Cms0bmFRQXFHRUU2b1lVTjQ1UlhZdGcy +MmI0Zk9uZFVsUm9xTHRVNG1YSm5UZDNwZnVhTFF2RGtjTzZaMmZBdFJHNjFiQnkrOEFFWWoKdlBR +U1BQU1FMQzhpS2xkck83MzM3NGViYnBKaUlXcTMvdjNWcDQxMzM0VVBQNFRiYjRlUFBvS2lJcTJU +Q1ZmaTlBVkRtcU9FVU9sMAo2aExwcWFudytlZXdhaFY0ZThQczJYRGhndGJwaEN1UWdpR0VDK3Jk +Rzc3L0hoSVRZY3NXZFgycVVhUFV2Y1NsbjBOVWx4UU1JVnlZClhnL0xscW43aHdjSHc3UFBRc2VP +YW9lNUxHNG9MT1gwbmQ3dTdncjc5ME9yVmxxbkVjSTUvUHFyMm1TMWRDbjQrS2hQSHZmY284N3oK +RUxWRHJkMFBvMzE3aGFOSHRVNGloUE14R21ITkdsaThXSjA1M3I0OVJFU28vU0M5ZXFuYnh3clhW +R3NMeHBBaENpdFhhcDFFQ09kMgo1UXBrWkVCU2tscEVkdStHUG4zK0xpQ2RPcW1kNnNJMTFOcUNN +WDI2d3F1dmFwMUVDTmVTazZQTzdTZ3BJTVhGYWw5aHQyNS8vOW11Cm5SUVJaMVZyQzhicTFRcjMz +S04xRWlGY2w2S29FMk8zYlZNSG1XemJwbjRwaWxvOFNncElseTdnNVNVcjZUb0RwNXE0bDVxYWlw +K2YKSHo0K1BzeWRPN2ZDWTE1NjZTVzh2YjNwMXEwYmUvZnVyZlJjempCQ0tpVWxSZXNJWnBHYzF1 +TU1HY0c4bkRvZGRPZ0FRNGZDYTYrcAoyOGorK2FlNmV1NC8vNmtXaU04L1Y1dXVtalpWaiszYkYw +YVBWdGU1K3VJTGRTK1BFeWVxUDZUWGxlNm5NOU5rOFlBSkV5YVFrSkNBCnA2Y25FUkVSakJ3NUVn +OFBEOVA3Vzdac1llUEdqV3pkdXBXa3BDUW1UNTVNWW1KaWhlZHlocEVkS1NrcEdBd0dyV05VU1hK +YWp6TmsKaE9ybjFPbmdsbHZVcjhHRC8vNzVsU3ZxMDhqaHczRG9rUHJuZi8vNzkvZm56NnRQSWUz +YWdZY0h0R3haL3MvUzN6ZHBvbDdMMWUrbgpzN0I3d2NqN2E2L0pQbjM2QUJBZUhrNTZlanBSVVZH +bVk5TFQwM25nZ1FkbzBhSUZJMGVPWk9yVXFaV2VUOXBRaFhBYzllcXA4enc2CmRvUzc3eTcvL3NX +TGtKME5mL3dCWjgrcVgyZk9xUE5FZnY3NTc5Y2w3MTI5cWhhT3ExZGh3d2ExZ0RScVZQRlg0OGFW +djNmdGNmWHIKUTUwNlVMZnUzMytXL2w0K1Z5cG05NEtSa1pHQnI2K3Y2Ylcvdno5cGFXbGxDc2FX +TFZ0NDlORkhUYTlidFdyRndZTUh1ZlhXVysyYQpWUWhoWFRmY0FBRUI2cGM1Q2dyVXd2SDY2K3FD +aXZuNTZzOEtDc3ArWDFDZ05wTlY5bDdwci94OGRVangxYXZxVjNGeCtUOTF1b29MClNlbnZLL3Ba +YnE0NlVmSjZmMCtuKzdzZ2xTNU05dnhaZFRua2VwYUtvcFRya05GVjhwdFc5bk5ITTMzNmRLMGpt +RVZ5V284elpBVG4KeVptUVlMK2NpdkozUWJIVTJiUE9jVCtydys0Rkl5UWtoT2VmZjk3MGV0ZXVY +VVJHUnBZNUppd3NqTjI3ZHhNUkVRSEE2ZE9uOGZiMgpMbmN1Sng3Z0pZUVFUc2Z1bzZUYzNkMEJk +YVJVZG5ZMnljbkpoSVdGbFRrbUxDeU1yNy8rbXJObno3SjA2Vkw4L1B6c0hWTUlJY1ExCk5HbVNp +b3VMSXpvNkdxUFJTRXhNREI0ZUhpUWtKQUFRSFIxTmFHZ292WHYzcG52MzdyUm8wWUxGaXhkckVW +TUlJVVJwaW9QYnNHR0QKNHV2cnEzVHExRW41NElNUEtqeG15cFFwU3NlT0haV3VYYnNxZS9ic3NY +TkNWVlU1MTY5ZnJ6UnIxa3dKRGc1V2dvT0RsZGRlZTgzdQpHVWVQSHEyMGJ0MWFDUWdJcVBRWVI3 +aVhWZVYwaEh1cEtJcHk5T2hSeFdBd0tQNysva3Jmdm4yVkpVdVdWSGljMXZmVW5KeGEzOU9DCmdn +SWxORFJVQ1FvS1VzTEN3cFQzM251dnd1TzB2cGZtNU5UNlhwWjI1Y29WSlRnNFdMbm5ubnNxZk4v +UysrbndCU000T0ZqWnNHR0QKa3AyZHJkeCsrKzNLNmRPbnk3eWZucDZ1OU9yVlN6bDc5cXl5ZE9s +U0pTb3F5aUZ6cmwrL1hoazhlTEFtMlVxa3BxWXFtWm1abFg0UQpPOHE5ckNxbkk5eExSVkdVa3lk +UEtsbFpXWXFpS01ycDA2ZVZqaDA3S3VmUG55OXpqQ1BjVTNOeU9zSTl2WFRwa3FJb2lsSllXS2gw +Cjd0eFoyYjkvZjVuM0hlRmVLa3JWT1IzaFhwYVlQWHUyOHZEREQxZVlwenIzMDZIM3d5ZzlaOFBU +MDlNMFo2TzBhK2RzN05tenh5RnoKZ3ZhZDlIZmVlU2MzM25oanBlODd3cjJFcW5PQzl2Y1NvRTJi +TmdRSEJ3UGc0ZUZCNTg2ZDJicDFhNWxqSE9HZW1wTVR0TCtualJzMwpCdURpeFl0Y3VYS0ZCdGNz +bCtzSTl4S3F6Z25hMzB1QTQ4ZVA4OE1QUC9ERUUwOVVtS2M2OTlPaEMwWmxjelpLMjdKbEMvNysv +cWJYCkpYTTI3TW1jbkRxZGpzMmJOeE1jSE15enp6NXI5NHptY0lSN2FRNUh2SmNIRGh4ZzE2NWRo +SWFHbHZtNW85M1R5bkk2d2owdExpNG0KS0NpSW0yNjZpV2VlZVliMjdkdVhlZDlSN21WVk9SM2hY +Z0pNbWpTSmQ5OTlsenAxS3Y2WXI4NzlkT2lDWVE3Rmdqa2JXdXJhdFN2SApqaDBqSXlNRGYzOS9K +a3lZb0hXa2N1UmVWcytGQ3hjWVBudzQ3Ny8vUGsyYU5DbnpuaVBkMCt2bGRJUjdXcWRPSFg3NzdU +Y09IRGpBCi9Qbnp5Y3JLS3ZPK285ekxxbkk2d3IxTVRFeWtkZXZXNlBYNlNwOTJxbk0vSGJwZ2hJ +U0VsRmw0Y05ldVhmVG8wYVBNTVNWek5rcFUKTm1mRGxzekoyYlJwVXhvM2JveWJteHRqeDQ0bEl5 +T0RvcUlpdSthc2lpUGNTM000MHIwMEdvME1HemFNUng5OWxDRkRocFI3MzFIdQphVlU1SGVtZWVu +bDVNV2pRb0hMTnVvNXlMMHRVbHRNUjd1WG16WnY1N3J2djZOaXhJeU5IanVTbm4zN2lzY2NlSzNO +TWRlNm5ReGNNClo1bXpZVTdPVTZkT21hcjU2dFdyQ1F3TXJMRHRVMHVPY0MvTjRTajNVbEVVeG80 +ZFMwQkFBQk1uVHF6d0dFZTRwK2JrMVBxZW5qbHoKaHR6Y1hBRE9uajNMMnJWcnl4VTJSN2lYNXVU +VStsNEN2UG5tbXh3N2RvekRody96NVpkZmN2ZmRkN05vMGFJeXgxVG5manJrMGlDbApPY3VjamFw +eXJsaXhnZ1VMRmxDdlhqMENBd09aUFh1MjNUT09IRG1TRFJzMmNPYk1HZHEzYjgvMDZkTXhHbzJt +akk1eUw2dks2UWozCkV1RG5uMzltOGVMRkJBWUdvdGZyQWZWLzFLTi83Um5zS1BmVW5KeGEzOU9U +SjA4eWF0UW9ybDY5U3BzMmJaZzhlVEp0MjdaMXVQL1gKemNtcDliMnNTRWxUVTAzdnAxTnZvQ1NF +RU1KK0hMcEpTZ2doaE9PUWdpR0VFTUlzVWpDRUVFS1lSUXFHRUVJSXMwakJFRlpWcDA0ZApKaytl +YkhvOWE5WXN1Mi9RWXpBWXlNek1CQ0FxS29yejU4L1g2SHdwS1NrTUxyMXhkUlUvdDhXMWJPbkVp +Uk04K09DRGRyMm1jRTVTCk1JUlYxYTlmbjIrLy9aYXpaODhDbHMvRXZWcWRMYzZ1VWZxYTMzLy9Q +YzJhTmF2eE9WM1p6VGZmekZkZmZhVjFET0VFcEdBSXEzSnoKYytPcHA1N2kvZmZmTC9mZWlSTW5t +REJoQWtGQlFVeWFOSWxUcDA0QjhQampqL1Bzczg4U0ZoYkdpeSsreU9qUm8zbnV1ZWNJRFEzbAo5 +dHR2Snlzcmk2ZWVlb3JPblRzVEd4dHJPdC9UVHo5TlNFZ0lkOXh4QndzWExxd3dqNWVYRjJmUG51 +WEREejlFcjllajErdnAyTEVqCmQ5OTlONkN1QS9iWVk0OFJGaGJHbENsVFRETnlNekl5Nk5ldkgz +cTlucVNrcENwLzc0S0NBdDU3N3ozNjl1MUxWRlFVS1NrcEFQVHMKMmJQTWJOcVNwNS9Dd3NJS2o2 +L01zV1BIR0Rod0lNSEJ3UVFGQlhIdzRFR3lzN1B4OS9kbjdOaXgrUG41TVgzNmRGUCsxMTU3amRE +UQpVRUpDUW5qenpUZkxuT2U1NTU1RHI5ZlRyVnMzRGg4K1RIWjJObDI2ZEFIZ3M4OCtZOFNJRVF3 +YU5JaUFnQUErK09BRDA5OWRzMllOClBYdjJKRFEwbElrVEp6SisvUGh5T1gvOTlWZjY5ZXRIY0hB +d1hidDI1ZUxGaTFYZU8rRkVhckowcmhEWHV1R0dHNVR6NTg4clhsNWUKU2w1ZW5qSnIxaXdsTmpa +V1VSUkZtVFJwa2pKejVreEZVUlRselRmZlZGNTQ0UVZGVVJSbDFLaFJTdCsrZlUxTGJqLysrT1BL +d0lFRApsYUtpSXVXenp6NVRicmpoQmlVbEpVVXBLaXBTL1B6OFRFdkg1K1RrS0lxaUtFVkZSVXBZ +V0poeThlSkZSVkVVeFdBd0tOdTJiVk1VClJWRzh2THlVczJmUG12SVpqVWJsemp2dlZCSVRFMDNI +NXVibUtvcWlLQys4OElMeTVaZGZLb3FpS0lHQmdVcDZlcnB5OGVKRkpUSXkKc3NMbG9kZXZYMi9h +WitEVFR6OVY1c3lab3lpS292ejU1NTlLYUdpb29paUs4djc3N3l2VHBrMVRGRVZSVHB3NG9keCsr +KzNYUGI3MApPVXViTm0yYTh2SEhINXQraDRLQ0F1WHc0Y09LVHFkVHZ2bm1HNld3c0ZDNS8vNzds +UlVyVnBTNU4xZXVYRkVHRHg2czdOMjcxM1N2CjQrUGpUZmN0UHo5Zk9YejRzR2twK1U4Ly9WUnAz +YnExY3VMRUNlWDgrZk5LdTNidGxNdVhMeXRHbzFIeDh2SlNEaDgrckp3OWUxYnAKMnJXck1uNzgr +SEk1UjQwYXBheGJ0MDVSRkhVWjhDdFhycFE3UmpndmVjSVFWdGUwYVZNZWUreXhNdjg2QmZqdmYv +L0xtREZqQUJnNwpkaXlyVjY4RzFDYWtCeDU0Z0taTm01cU9mZUNCQjZoZnZ6NDllL2FrZWZQbTlP +M2JsL3IxNjZQWDYwMHJBU2NuSnhNVkZZVmVyK2ZRCm9VUDg5Tk5QVldhTGlZbWhYNzkrUkVWRnNX +M2JObmJ1M0luQllFQ3YxNU9ZbUVocWFpcC8vUEVIaXFJUUdocEtreVpOR0Q1OGVKWEwKVlgvOTlk +Y3NYTGdRdlY1UFpHUWtwMDZkNHZEaHd6ejAwRU9zV0xFQ2dPWExsNXY2Q2lvNi90Q2hRNVdlUHlR +a2hMaTRPTjU1NXgxeQpjbkpvMkxBaG9DNUxNM1RvVUJvMGFNRElrU05aczJZTkFGdTNibVhZc0dF +RUJnYVNtWm5KMnJWcnVYejVNdXZYcitmSko1OEUxT2JEClJvMGFsYnRXZUhnNGJkdTJwV25UcHZq +Nys1T1ptVWxhV2hwZHVuVEJ5OHVMRmkxYWNPKzk5MVo0VDNyMjdNbVVLVk9ZTjI4ZVY2NWMKb1c3 +ZHVsWCtOeEhPdytHWEJoSE9hZUxFaVhUdDJwWFJvMGVYK1hsbEg3eHQyN1l0ODdwa2ZhNzY5ZXZU +dkhsejA4L3IxNi9QNWN1WAp1WERoQWxPbVRHSGp4bzNjY3NzdERCMDZsSFBuemwwMzAyZWZmY2F4 +WThlWVAzOCtvQzVUSFJBUXdQcjE2OHNjZC96NGNmTit5VktLCmk0dUpqNCtuVDU4KzVkNXIyYkls +TzNic1lQbnk1YWFsR1NvN3ZtUzVqbXRGUlVYUnJWczNGaTllVEs5ZXZmanFxNi9LM0pjU0pmMDMK +NDhlUFo4V0tGUVFFQkRCcDBpVE9uVHVIVHFlcmNJWFNhMTE3dndzTEM2bFhyMTZadnFIS3poRWRI +YzJBQVFOTVM1R2twNmR6MDAwMwpYZmQ2d25uSUU0YXdpUnR2dkpHSEhucUlmLy83MzZZUG1rR0RC +dkg1NTU5VFhGek1KNTk4d3IzMzNsdXRjeXVLUW01dUxtNXViclJwCjA0WjkrL2J4NDQ4L1h2ZnZi +TnUyamRtelovUEZGMStZZmhZU0VzS3BVNmRNVHl5WExsMWkvLzc5dEd2WGpycDE2NUtSa2NHbFM1 +ZFkKdm54NWxaa2VmdmhoRWhJU3VIRGhBa0NaSmErSER4L09PKys4dy9uejV3a0lDS2p5K0lvY1Bu +ell0SFpSdjM3OVRQMGllWGw1ckZ5NQprcUtpSXBZdFcwWmtaQ1NGaFlWY3VIQUJMeTh2L3ZqakQx +YXRXZ1dvL1V0MzNYVVhDeGN1UkZFVWlvcUtLQ2dvcVBKMzArbDA5T2pSCmd4MDdkcENkblUxT1Rn +NkppWWtWRG1nNGVQQWczdDdldlBycXEvajYranJFWGlYQ2VxUmdDS3NxL1NIeTNIUFBjZWJNR2RQ +cnlaTW4KYy9Ub1VmUjZQYWRPbmVMWlo1K3Q4TzlkKzdxaTk5cTNiOCt3WWNNSUNBamdtV2VlcVhR +b2FzbS9xdVBqNHpsMzdoeDMzWFVYZXIyZQpwNTU2Q29BdnZ2aUNCUXNXRUJnWXlCMTMzTUh2di84 +T3dFY2ZmY1JMTDcxRTc5NjlDUW9LcXZERFVhZlRtWDcrd0FNUEVCb2FTa1JFCkJBRUJBVXliTnMx +MDNBTVBQTUN5WmN0NDZLR0h5dnlzb3VOTG43TzA1Y3VYRXhBUVFFaElDUG41K2FaeitmcjY4dDEz +M3hFY0hFeEEKUUFCUlVWRTBiTmlRS1ZPbUVCb2F5dkRod3hrMGFKRHBQRys4OFFZSERod2dLQ2lJ +WHIxNm1RWWVsRnl6c3V2WHJWdVhlZlBtTVh6NApjQ0lqSStuU3BRc2RPM1lzZDl5Y09YUG8wcVVM +b2FHaCtQcjZjc2NkZDFUNDMwVTRKMWw4VUFnbmxaMmR6ZURCZzlteFk0ZGRybmZwCjBpV2FOR2xD +WGw0ZTk5eHpEeDkvL0RHMzMzNjdYYTR0SElQMFlRamh4T3k1NDF4c2JDenIxcTNEemMyTi8vdS8v +NU5pVVF2SkU0WVEKUWdpelNCK0dFRUlJczBqQkVFSUlZUllwR0VJSUljd2lCVU1JSVlSWnBHQUlJ +WVF3aXhRTUlZUVFadmwvQ0hyZjBuUWF1Ym9BQUFBQQpTVVZPUks1Q1lJST0K + + + + + + ## Serial calculation of nearest neighbor eigenvalue distribution + + + In this section we numerically construct and diagonalize a large number of GOE random matrices +and compute the nerest neighbor eigenvalue distribution. This comptation is done on a single core. + + + def serial_diffs(num, N): + """Compute the nearest neighbor distribution for num NxX matrices.""" + diffs = ensemble_diffs(num, N) + normalized_diffs = normalize_diffs(diffs) + return normalized_diffs + python + 6 + 1 + + + + serial_nmats = 1000 +serial_matsize = 50 + python + 7 + 1 + + + + %timeit -r1 -n1 serial_diffs(serial_nmats, serial_matsize) + python + 8 + 0 + + + stream + 1 loops, best of 1: 1.19 s per loop + + + + + serial_diffs = serial_diffs(serial_nmats, serial_matsize) + python + 9 + 0 + + + + The numerical computation agrees with the predictions of Wigner, but it would be nice to get more +statistics. For that we will do a parallel computation. + + + hist_data = hist(serial_diffs, bins=30, normed=True) +plot(s, rhos) +xlabel('Normalized level spacing s') +ylabel('Probability $P(s)$') + python + 10 + 0 + + + pyout + &lt;matplotlib.text.Text at 0x3475bd0&gt; + 10 + + + display_data + aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVl3QUFBRU1DQVlBQUFEWGlZR1NBQUFBQkhOQ1NWUUlD +QWdJZkFoa2lBQUFBQWx3U0ZsegpBQUFMRWdBQUN4SUIwdDErL0FBQUlBQkpSRUZVZUp6dDNYbGNW +UFgreC9IWGdHaHVxQWh1cFNKcEFxS0FKcmhEdWFDaWxXbHV2M0xOCjhONWNzcmhtM2ZxcDljdmJj +czFkSTF0dmFxbFptVmd1bUlBYmkxdmxsaXNxYnJFb0lMTHovZjJCekpVQW1XR1pNek44bnZjeGo4 +dk0KK2M0NTcva1M4L0djN3puZm8xTktLWVFRUW9neTJHZ2RRQWdoaEdXUWdpR0VFTUlnVWpDRUVF +SVlSQXFHRUVJSWcwakJFRUlJWVJBcApHRUlJSVF4aThvSXhhZElrbWpadFNzZU9IVXR0ODlwcnIr +SGk0a0tYTGwwNGRlcVVDZE1KSVlRb2pja0x4c1NKRTltMmJWdXB5Mk5pCll0aXpadzhIRHg0a09E +aVk0T0JnRTZZVFFnaFJHcE1Yak42OWU5T29VYU5TbDBkSFJ6Tml4QWdjSEJ3WU0yWU1KMCtlTkdF +NklZUVEKcFRHN01ZeVltQmpjM2QzMXo1MmNuRGgzN3B5R2lZUVFRZ0RVMERyQVh5bWwrT3RzSlRx +ZHJzUzJwYjB1aEJEaS9zb3pLNVRaN1dINAordnB5NHNRSi9mT0VoQVJjWEZ4S2JWOVlZTXo1TVhm +dVhNMHpTRTdKS0RrbForR2p2TXl5WUd6YXRJbWtwQ1RXclZ1SG01dWIxcEdFCkVFS2d3U0dwTVdQ +R0VCRVJRV0ppSWkxYnRtVCsvUG5rNU9RQUVCUVVoSStQRDcxNjllTFJSeC9Gd2NHQk5XdldtRHFp +RUVLSUVwaTgKWUh6OTlkZGx0bm4zM1hkNTk5MTNUWkRHTlB6OS9iV09ZQkRKV1hrc0lTTkl6c3Bt +S1RuTFM2Y3Fja0JMWXpxZHJrTEg0NFFRb2pvcQo3M2VuMlkxaENDR0VNRTlTTUlRUVFoaEVDb1lR +UWdpRFNNRVFRZ2hoRUNrWVFnZ2hEQ0lGUXdnaGhFR2tZQWdoaERDSUZBd2hoQkFHCmtZSWhoQkRD +SUZJd2hCQkNHRVFLaGhCQ0NJTkl3YkJ3OXZZTzZIUzZNaDQxeTJ4amIrK2c5VWNSUXBnNW1YelF3 +aFhjZGJDc1BqQ3MKVFhYdlN5R3FDNWw4VUFnaFJKV1NnaUdFRU1JZ1VqQ0VFRUlZUkFxR0VFSUln +MGpCRUVJSVlSQXBHRUlJSVF3aUJVTUlJWVJCcEdBSQpJWVF3aUJRTUlZUVFCcEdDSVlRUXdpQlNN +SVFRUWhoRUNvWVFRZ2lEU01FUVFnaGhFQ2tZNHE0YU12MjVFT0srWkhwekMxZVowNXZmCnY0MzB0 +UkRXUXFZM0YwSUlVYVdrWUFnaGhEQ0lGQXdoaEJBR2tZSWhoQkRDSUZJd2hCQkNHRVFLaGhCQ0NJ +Tm9VakFpSXlOeGMzT2oKWGJ0MkxGdTJyTmp5akl3TXhvOGZqN2UzTjM1K2ZtemV2Rm1EbEVJSUll +Nmx5WFVZM3Q3ZUxGbXloTmF0V3hNUUVNRGV2WHR4ZEhUVQpMLy9vbzQvNDdiZmZXTGx5SlJjdlh1 +VHh4eC9uN05temQ2ODV1Q2U4WEljaDEyRUlJWXhtTWRkaHBLU2tBTkNuVHg5YXQyN05nQUVECmlJ +Nk9MdEttUVlNR3BLV2xrWk9UUTNKeU1uWHExQ2xXTElRUVFwaVd5UXRHYkd3c3JxNnUrdWZ1N3U1 +RVJVVVZhVE5tekJqeTh2SncKZEhTa1Y2OWVyRjI3MXRReGhSQkMvRVVOclFPVVpQbnk1ZFNvVVlO +cjE2N3grKysvRXhnWXlNV0xGN0d4S1Y3ZjVzMmJwLy9aMzk4ZgpmMzkvMHdVVlFnZ0xFQjRlVG5o +NGVJWFhZL0l4akpTVUZQejkvVGx5NUFnQTA2ZFBaK0RBZ1FRR0J1cmJqQnc1a3NtVEp4TVFFQUNB +CnI2OHZYMzc1WlpFOUU1QXhESkF4RENHRThTeG1ES05CZ3daQXdabFNjWEZ4N055NUUxOWYzeUp0 +K3ZidHk1WXRXOGpQeitmOCtmTWsKSnljWEt4WkNDQ0ZNUzVORFVvc1hMeVlvS0lpY25CeG16SmlC +bzZNaklTRWhBQVFGQlRGNjlHaE9uRGpCbzQ4K2lwT1RFMHVXTE5FaQpwaEJDaUh2STlPWVdUZzVK +Q1NHTVpUR0hwSVFRUWxnbUtSaENDQ0VNSWdWRENDR0VRY3p5T2d4aG1QalVlR2dMcU8yUVZ3dHlh +MEZDCkI4aXkxenFhRU1JS1NjR3dJRW9wUWsrSHN2NzRldlplMmt0NlRqcDBCMWdJdHRsZ2R3Y2NU +OEoxTHpnM0FFNE9od1IzcldNTElheUUKbkNWbEFaUlNiRDJ6bFhuaDg4ak56K1h2WGYrT1gycy9I +bW44eU4ycjMrL3BBN3M3MEdvUFBMd0RPcTJGT0QrSTJBQUpjcGFVRUtKQQplYjg3cFdDWXVmalVl +TVpzR3NPdHpGdk04NXZITUxkaDJPaitPL1IwMzlOcTdkTEJad1gwZUJYT2pZVnRpK0dPVXlsYmtv +SWhSSFVoCnA5VmFvZDBYZHROMWRWZUd0QnZDcjFOL1piajc4Q0xGb2t3NWRXSGZiRmdDcExXQXFW +N2dFbFpsZVlVUTFrMzJNTXlRVW9xRkJ4YXkKOE1CQzFneGJRMStYdnFXMk5lckNQWmN3ZUdvQy9E +NFdmdmsveUt0WnZNMTkxbUdOZlMxRWRTU0hwS3pJYTd0ZVk5dlpiV3dldlpsVwpEVnJkdDYzUlYz +clhTWUJoNHd0KzN2QXQ1TlFwM3FhVWRWaGpYd3RSSGNraEtTdngvcjczK2ZHUEg5bjUzTTR5aTBX +NTNIR0NyMytFCk80N3c3RUNvbFZyNTJ4QkNXQ1VwR0daazlhSFZyRHE0aWgzUDdzQ3hqbVBaYnlp +di9Ccnd3eGR3b3lPTWZ4enFKRmJkdG9RUVZrTUsKaHBuNDd1UjN6SXVZeDg3bmR2S2cvWU5WdjBG +bEF6OHRoM1A5WVlJZjFLLzZUUW9oTEpzVURETnc0ZVlGZ2tLRDJEeDZNMjBkMnBwdwp5enJZOWEr +Q1FmQm5rY05UUW9qN2trRnZqZVhtNStMM2hSL0RYSWNSM0NQWTZQZFh6dlRtQ2diYmdNTUFXQmNL +K1hZbHJzUFMrMW9JClVVQUd2UzNVTzVIdlVNZXVEaTkzZjduWU1udDdCM1E2M1gwZmxVTUgyd0Js +QzRPblVYWUJFa0pVUjFJd05MVHYwajVXSFZ6RmwwOTkKV2VJRmVXbHBOeW40OHI3Zm81TGtBeHZY +dzBQUjBPUGZsYmRlSVlUVmtJS2hrWlRNRko3OS9sbENob1RRb240THJlTVV5SzVmY0VqSwpkeW00 +ZjZ0MUdpR0VtWkV4REkxTStHRUN0ZTFxc3lwd1ZhbHRUSGY3MWIrMGFYNFluZzJBVC9kRGNqdjlj +a3Z0YXlGRVVUS0dZVUdpCjRxUFllWDRuSC9UL1FPc29KYnZXR2NMbndZalJZSnVsZFJvaGhKbVFn +bUZpU2lsbWJaL0Znc2NYVUs5bVBhM2psQzcyNzVEU0N2cTkKcG5VU0lZU1prSUpoWXQ4Yys0YWN2 +QnllODN4TzZ5aGwwTUdQbjRMYkptajNrOVpoaEJCbVFBcUdDZDNKdWNPcllhK3lLR0NSY2RPVQph +eVhEQWI1YkEwOU1saXZCaFJCU01FenB3d01mNHZ1UUw3MWI5OVk2aXVFdTlZYURmNE5oa0plZnAz +VWFJWVNHcEdDWXlOVzBxeXlLCldzUjcvZDdUdjFiV2hYbG1JL0tmWUFQdjdYdXY3TFpDQ0tzbEJj +TkUvdm5MUDVuU2VRb3VqVnowcjVWOVlaNlpVTGJ3SFN5S1dzVHgKUDQ5cm5VWUlvUkVwR0Nad0p1 +a01vYWREZWIzMzYxcEhLYjlVZVB1eHQ1bXlaUXI1S2wvck5FSUlEUmgxNFY1K2ZqNEhEaHdnTGk2 +TwpoSVFFR2pac1NJY09IZWpTcFFzMk5xYXZQWlp5NGQ2VUxWTm9VYjhGOC8zbkYzbTk3QXZ6Tkxw +d3I1VGxlZmw1K0gzaHgrZ09vM25SCjU4VXkxaWVFTUZkVmVvdlc3T3hzRmkxYVJGNWVIZzBiTnNU +RnhZVm16Wm9SSHgvUHVYUG51SGJ0R2syYU5HSG16Sm5ZMnRxVzZ3T1UKaHlVVWpDdXBWK2k0cWlO +bnBwK2hjWjNHUlpaWldzRlFTbkV5NFNSOXZ1akQ0UmNPMDdKQnl6TFdLWVF3UjFWV01MS3lzbGkz +YmgxRApoZ3pCeWNtcDFIYm56NTluMTY1ZFRKa3l4ZWdRNVdVSkJlT1ZIYStRci9KWkZMQ28yREpM +TEJnQWIwZThUY3pWR0g0Yy9hTjVEYzRMCklReFNwWHNZNXNyY0MwYlNuU1RhTFd2SGIzLzdqWWZz +SHlxMjNMSUtoaDJRVy9DakxSQUVSQUQzaklIWHI5K0kxTlRrTXJZamhOQ2EKeWVhU09uWHFGRC85 +OUJQSnljbWNQSG5TNkExV0o4dGpsalBNYlZpSnhjTHk1S0kvZXl0UHdZLzdZV0F6cUoya2Y3M2dy +QzhoaExVcQpWOEZvMXF3WjNicDFZK3ZXclh6MTFWZFZrY3ZpM2M2K3pZcllGY3p1TVZ2cktGVWp2 +anVjR0FFRGpMOUxvQkRDTWhsZE1LNWV2Y3J1CjNidng5dlltT0RpWXBrMmJWa1V1aTdmNjBHcjhu +UDFvNzloZTZ5aFZaOWNDY0FtRE5ydTBUaUtFTUFHakM4YjQ4ZU54ZFhWbDFhcFYKdlBqaWl4dzll +clFxY2xtMDdMeHNGaDVZeUd1OXJIeW0xK3o2OE5OeUNId1JiSEswVGlPRXFHSVZHdlMrZWZNbURS +czIxT3hNR1hNZAo5RjUvYkQwZkhmcUkzZU4zMzdlZFpRMTZsN1pjd2JPRDRPeEFpSnBsbHI4UElV +UlJWVGJvblpXVnhSOS8vRkhpc2thTkdoVXBGbnYyCjdERm9vNUdSa2JpNXVkR3VYVHVXTFZ0V1lw +dlkyRmk2ZHUyS201c2IvdjcrQnEzWFhJUWNDbUZxbDZsYXh6QVJIV3hiQkwzZmdUcGEKWnhGQ1ZL +VXlDMGF0V3JWSVNrcGkrZkxsSlo0VmxacWF5cDQ5ZTVneFl3YU5HalV5YUtNelo4NGtKQ1NFc0xB +d1ZxeFlRV0ppWXBIbApTaWttVFpyRXYvNzFMMDZlUE1tMzMxck8vYVZQSjUzbTJKL0hlTDczMVB0 +T0xHaFYxeThrdXNIdlkrRXhyWU1JSWFxU1FXTVlwMDZkCjRzMDMzOFRUMDVONjllb3hkZXBVSmt5 +WXdOTlBQODJjT1hOSVRrNW15WklsZUhoNGxMbXVsSlFVQVByMDZVUHIxcTBaTUdBQTBkSFIKUmRv +Y1BIaVFUcDA2MGE5ZlB3QWNIUjJOL1Z5YVdYMTROUk84Sm5ENzFpM3VQN0dnbFIyNkNaOEhidkRi +amQrMFRpS0VxQ0kxREdsMAo5T2hSYnR5NFFWcGFHa3VYTHFWZnYzNzA3bDIrZXpyRXhzYmk2dXFx +Zis3dTdrNVVWQlNCZ1lINjE3WnYzNDVPcDZOMzc5NDBiTmlRCmFkT21FUkFRVUs3dG1WSldiaFpm +SHYyU2ZaUDI4UUZtZXIvdXFwTFpDQ0xnSlkrWDJEVnVsM1h0UVFraEFBTUxScWRPbmFoWnN5YU4K +R3pkbTd0eTVMRisrdk53Rnd4Q1ptWmtjUFhxVXNMQXc3dHk1US8vKy9UbDI3QmkxYTljdTFuYmV2 +SG42bi8zOS9UVWQ3L2orMVBkMApiTnFSZG8zYmFaWkJVNGNnNFU0QzM1LzZucWZkbnRZNmpSRGly +dkR3Y01MRHd5dStJbVdBU1pNbXFaTW5UK3FmLy9EREQ0YThyVVMzCmJ0MVNYbDVlK3VmVHBrMVRv +YUdoUmRxRWhvYXE0T0JnL2ZPUkkwZXFiZHUyRlZ1WGdmRk54djhMZjdYKzJIcWxsTHA3ekVtVjhT +aXIKVFdXc3c3Ulp3czZGcVRhTDI2aU1uQXlOZnh0Q2lOS1U5N3ZUb0RHTWMrZk9FUndjVEpzMmJl +alpzeWNmZi93eGE5ZXU1Y0tGQzJ6Ywp1TkdvQXRXZ1FRT2c0RXlwdUxnNGR1N2NpYSt2YjVFMjNi +cDFJeUlpZ2p0MzdwQ2NuTXlSSTBmbzJiT25VZHN4dGROSnB6bVJjSUtuClhKL1NPb3FtK3JyMHhi +T1pKNHNPRko5c1VRaGgyUXk2RHVQNDhlTjA2TkFCS0ppVk5qbzZtdGpZV0tLam8vbjk5OTlKVFUw +MWFxTVIKRVJGTW5UcVZuSndjWnN5WXdZd1pNd2dKQ1FFZ0tDZ0lnRldyVnJGczJUS2NuSno0Mjkv +K3h1alJvNHVITjZQck1JSjNCR05yWTZ1LwpCV3ZaMTFoQSthOTkwS0tOWWV0UVNuRXUrUnkrbi9q +eTI5OStvMFg5Rm1XOFJ3aGhhcHJOVnJ0bzBTSm16WnBWa1ZXVW03a1VqTXpjClRGb3Rhc1greWZ0 +cDY5QVdxTjRGQStDMVhhOXhOZTBxWHo3MVpSbnZFVUtZbXNsbXEvMnJHVE5tVkhRVkZ1LzdrOS9q +MmN4VFh5d0UKdk43cmRYYWUyMG5NbFJpdG93Z2hLa21GQzRZcDc3Qm5ya0lPaGZCQzV4ZTBqbUZX +NnRlcXo0SytDNWp4OHd5NUI3Z1FWc0wwTitLMgpNbWVTem5BeThTUlB1ajZwZFJTek04NXpITG41 +dVd3NHZrSHJLRUtJU21CVXdiaHk1VXBWNWJCWTN4ejdobEVkUmxIVHRxYldVY3lPCmpjNkc5L3Uv +enh1L3ZFRjJYcmJXY1lRUUZXUlV3ZWpmdnorREJnMWl3NFlONU9USWROWktLYjQrOWpXalBZcWZ3 +VlU5MVNnMlgxWmYKbDc2Y2l6bEhyUjYxME9sMDJOczdhQjFTQ0ZGT1JoV01FeWRPOE9hYmI3Smp4 +dzdhdFd2SDlPblRPWHo0Y0ZWbE0zdkgvanhHZWs0NgozUjdxcG5VVU0zSFBiVnp2ZllRZGhUNU5v +V2FxM01aVkNBdFc3dE5xdDIzYnhxUkprOGpMeTZOdDI3WXNYTGlRYnQxTSs4V3A5V20xCmhZZGEz +dS8vZnJGbDFmVzAybExiREhzT2JqNE00ZlBONGxSb0lhb3prNXhXR3g4Znp6dnZ2SU9IaHdlZmZm +WVpYM3p4QmRldVhXUGwKeXBWTW1qVEo2STFiTXFXVWZ2eENHR0QzMitDekRPcHFIVVFJVVY0R1RU +NVlhTkNnUVV5Y09KSHc4UEFpVTQ1N2Vub3lkV3AxdVdGUQpnVVBYRHFIVDZlamN2TFBXVVN6RExX +ZjRkUno0TGRZNmlSQ2luSXc2SkJVVEU0T1BqMCtacjVtS2xvZWtnbmNFVTl1dU5tOC85bmFKCnkr +V1FWQW5xSk1JMEowN1BQbDE5Wi9RVndneVk1SkJVU1hzUmhYTS9WU2Y1S3AvMXg5Y3p1b09jSFdX +VU80NXdBTjdZL1liV1NZUVEKNVdEUUlhblkyRmhpWW1KSVNFaGc1Y3FWK3NxVWtKQmc4RzFacmNt +Qnl3ZG9VS3NCSFpwMDBEcUs1WW1DdlUvdEpmWktMRjBmN0twMQpHaUdFRVF6YXcwaEpTZUh5NWN2 +azVPUncrZkpsNHVQamlZK1BwMW16Wm56KytlZFZuZEhzZkhQOEc3bjJvcnh5WUs3ZlhGNE5lMVhP +CmxoTEN3aGcxaG5INjlHa2VlZVNScXN4akZDM0dNSEx6YzNub3c0ZllNM0hQZlkvRHl4aEc2VzF5 +OG5Mb3NMSURTd2N1SmFDdCtkOTYKVndoclU2VmpHSVgzMng0d1lBQnQyclFwOG5CeGNURjZvNVlz +SWk2Q2grd2Zra0hiQ3FoaFU0Ti85ZjBYcjRhOUtoTVRDbUZCRE5yRAp1SFhyRmcwYk5pUXhNYkhF +NWZlZVltdEtXdXhoVE5reWhmYU4yeFBjSS9pKzdXUVBvL1EyU2ltVVVuVC90RHZUZktieGJLZG55 +M2lQCkVLSXlhWFlESlMyWnVtQms1MlhUWW1FTERnY2RwbFdEVnZkdEt3V2o5RGFGdjdQSWk1R00r +MzRjZjB6N2cxbzFhcFh4UGlGRVpTbnYKZDZkQlowbmR1SEhqN2hkZ1VVb3BkRG9kVFpvME1YckRs +aWpzZkJqdEhkdmowZEpMNWtRcXR4cEYvMXNhQXcvMGZnQ2lDcDdXcjkrSQoxTlJrYmFJSkllN0xv +SUxScTFjdmdHSkZvN0JnbkQ1OXV2S1RtYUZ2am4zRDZBNmoyWjgyQThQK3RTMktLNXlnOEs1ZHgy +QmNYemh5CkdySWFrSlltL1NhRXVUSm8wUHVSUng3aHpKa3paR2RuazVPVFEzWjJ0djduNmpMTmVW +WnVGbHRPYjJHRSt3aXRvMWlYUHozZ3pHRG8KK1lIV1NZUVFaVEJvRDJQZHVuVUFIRHg0c05peWtn +NVZXYVB3dUhEY25keHBYcis1MWxHc1QvaDhDUEtHbUJmaHR0WmhoQkNsTWFoZwpOR2pRQU5EdWJD +aHpzT1gwRm9ZK01sVHJHTllwcFJVY21RVCs4eUJVNnpCQ2lOSVlOVnN0UUdKaUl0dTNiMGVuMHhF +UUVFRGp4bzJyCklwZFpVVW9SZWpxVXJXTzNhaDNGZXUxOURhYTExdzkrQ3lITWoxR1RENjVkdTVi +dTNidHo0TUFCOXUvZlQvZnUzVm03ZG0xVlpUTWIKeC80OGhrNm53OTNKWGVzbzFpdkRBZllIdytO +YUJ4RkNsTWFvNnpDOHZMell0bTBielpvMUF3cE90dzBJQ09EbzBhTlZGdkIrVEhVZAp4b0k5Qzdo +Kyt6cExCeTNWYjlmU3JuMndpQ3cxTW1CNkhRNjhmRUJ1ZXl0RUZUTEo5T1lPRGc1a1pHVG9uMmRr +Wk9EZzRHRDBSaTFOCjZPbFFoand5Uk9zWTFpKzNOb1REN0oyelpXSkNJY3lRUVdNWTA2ZFBCOERK +eVlrdVhiclF1M2R2bEZMczNidVgvdjM3VjJsQXJmMloKL2ljbkVrN2cxOXBQNnlqVnc2K1FsSkhF +VDJkK0l2Q1JRSzNUQ0NIdVlWREI2TktsaS83MDJVR0RCdWxmZi9ycHA2Myt0TnFmei94TQpQNWQr +TW5XRnFlVER2L3IraXptNzVqQ3c3VUJzYld5MVRpU0V1RXZta2lyRGlBMGpHUExJRUNaNFRTaXlY +YXNaTnpDN0xEcnk4L1BwCi9YbHZudS84ZkpGK0YwSlVEcE5NUHBpUmtjR09IVHZZdm4wN04yL2Ux +TzlkRkY3WVoycFZYVEN5ODdKcDhrRVRUazgvVFpPNi81MHYKU3dwRzFXNUhLY1crUy9zWXMya01m +MHo3ZzlwMnRjdFlweERDR0NZWjlIN2pqVGZZczJjUDI3ZHZ4OS9mbi9qNGVKeWRuWTNlcUtXSQpp +SXZBemNtdFNMRVFwdEd6VlUrNnRPakMwdWlsV2tjUlF0eGwxQjVHNTg2ZE9YejRNQjA2ZE9ENDhl +T2twS1RRcjE4L1ltTmpxekpqCnFhcDZEMlBHenpOb1ZxOFpyL2QrdmRoMnJldGY5ZWFVNWIrLzA5 +TkpwK254YVE5T3ZuZ1NwN3BPWmF4WENHRW9rK3hoMk5uWkFmRG8KbzQ4U0docktqUnMzeU16TU5I +cWpscUR3Nm02WkRzVFVDcVkvMStsMHRIZHNUMUo0RWsyZWFhSi9UYWZUWVc5di9hZHlDMkdPakNv +WQpMNzc0SWpkdjNtVFdyRmtzWDc2YzRjT0g4OVpiYjFWVk5rMmRTRGhCbnNyRG80bUgxbEdxbWNM +cHorOCtJaEtnWTJOb2ZFci9tdHlMClJBaHRHSDJXVk9GY1VnQUJBUUdhVGtoWWxZZWszdHY3SHBk +VEw3Tjg4UElTdDJ0ZGg0SE1LVXNKeTN1K0R5MzN3VGViOVcwcytPUSsKSVRSbmtrTlM5ODRsRlJV +VlJZOGVQYXgyTHFrdHA3ZkkxZDNtSW5vR05QME5uTU8xVGlKRTlhYU00T25wcWE1ZHU2Wi9mdjM2 +ZGVYcAo2V25NS3BSU1NrVkVSQ2hYVjFmVnRtMWJ0WFRwMGxMYnhjVEVLRnRiVzdWcDA2WVNseHNa +MzJBSjZRbksvbC8yS2lNbm85VHRnaXJqClVSbHRUTFVkYzhwU3luS1ByeFV2ZEZibzhxcnM5eTVF +ZFZIZXZ5Rk41cEthT1hNbUlTRWhoSVdGc1dMRkNoSVRFNHUxeWN2TDQ5VlgKWDJYZ3dJRW1QL3p3 +ODVtZmViek40enhRNHdHVGJsZmN4N0ZSa0Y4RE9tcHp6WThRb3B4elNSWGU0N3M4YzBtbHBLUUEw +S2RQSHdBRwpEQmhBZEhRMGdZRkY1dzFhdG13WkkwYU0wT1NVWGJsWmtqblN3WTZGTUh3c25OQTZp +eERWVTdubWtpcjh1VHh6U2NYR3h1THE2cXAvCjd1N3VUbFJVVkpHQ2NlWEtGVFp2M3N3dnYveENi +R3lzU2VlcnlzN0xadVBoYjlrNGNTT1QweWViYkx2Q0FKZDZ3Wld1MFAyeTFrbUUKcUpZTUtoZ1RK +a3dvOHZ6UW9VUG9kRG82ZCs1Y0ZabDQ2YVdYZVBmZGQvVWorZmM3SkRWdjNqejl6LzcrL3ZqNysx +ZG8yM3N1N29GRQpCZWxsbmNrak5CSDJIanovSFRkdTM2QnB2YVphcHhIQ0lvU0hoeE1lSGw3eEZS +a3o0QkVSRWFIYXRXdW5CZ3dZb0FZTUdLRGF0V3VuCklpTWpqUm8wdVhYcmx2THk4dEkvbnpadG1n +b05EUzNTcGsyYk5zcloyVms1T3p1cmV2WHFxU1pObXFqTm16Y1hXNWVSOFEzeTByYVgKRkgzTWZB +RFlxck1Zc0k0QTFOVFFxWlgrdXhlaXVpanZkNmRSN3dvTURGUW5UNTdVUHo5MTZwUUtEQXcwZXFO +ZVhsNHFJaUpDWGJodwpRYlZ2MzE0bEpDU1UybmJDaEFrbVBVdXEvYkwyaXVZVzlPVnBkVmtNV0Vk +dGxPUDdqdXI0bjhjci9mY3ZSSFZRM3U5T284NlNTazVPCnBrV0xGdnJuelpzM0p6azUyZWk5bXNX +TEZ4TVVGRVMvZnYzNCs5Ly9qcU9qSXlFaElZU0VoQmk5cnNwME9lVXlTUmxKY0YzVEdLSXMKR2ZC +YXI5ZVl2WE8yMWttRXFGYU11dEo3MWFwVnJGdTNqbWVlZVFhbEZOOTk5eDFqeG94aDZ0U3BWWm14 +VkpWOXBmZm5SejVuKzdudApySDltUFpqclZjOVduOFd3ZFdUbVpPSyswcDJQaDN4TVg1ZStaYlFY +UXR5cnl1K0hvWlRpMnJWclhMOStuZERRVUhRNkhVT0dETUhiCjI5dm9qVmFXeWk0WVl6ZU41ZkUy +anpPbHl4UXM2Y3ZUdXJJWXRnNmxGQnVQYitTZFBlOXc2SVZEY21jK0lZeGdrb0xSc1dOSGpoMDcK +WnZSR3FrcGxGb3g4bFUvemhjMkplVDRHNTBiT1dOS1hwM1ZsTWJ4Z0tLWG8rVmxQWHVqeWd0eVpU +d2dqVlBsY1VqcWREbDlmWDdadQozV3IwUml6QnNUK1BZVi9MbnRZTlcyc2RSUmhJcDlPeGNNQkMz +dmpsRGRLejA3V09JNFRWTTJyUU96bzZtcUZEaDlLc1dUTzh2YjN4Cjl2YXVzbXN4VEczbnVaMzBk +ekh1cW5XaHZlNHR1OU96VlU4K1BQQ2gxbEdFc0hwR0RYcWZPM2V1eE4yWXRtM2JWbW9vUTFYbUlh +bEIKYXdjeHBmTVVublo3Mm9EcHk4M3I4SXgxWlRGa0hYWVUzRGZqcmtiQUZHQWxjTHZncGZyMUc1 +R2FhdndaZkVKVUIxVTZocEdUazhQMgo3ZHZadTNjdkFRRUIrUG41WVdOajFNNUpsYWlzZ3BHVm00 +WFRCMDVjZk9raWpXbzNrb0poaWRzWkVBeTFVbUhMeC9vMmxYbENoQkRXCnBFckhNRjUvL1hWV3JW +cUZrNU1UYjczMUZvc1hMelo2UStic1FQd0IzSnpjYUZTN2tkWlJSSGxGL2hQYWI0Ym1oN1ZPSW9U +Vk1tZ1AKbzB1WExrUkZSV0ZuWjhldFc3ZDQ4c2tuaVlpSU1FVysrNnFzUFl4Ly92SlBkT2o0djhm +L1Q3OWVpLzdYdGtWbnFjQTZ2RCtGTHF2aAowLzJnYkdVUFE0aFNWT2tlUm41K1BuWjJkZ0EwYk5p +UTFOUlVvemRrenNMT2g5SFBwWi9XTVVSRkhaMEl5cWFnY0FnaEtwMUJleGkyCnRyYlVxVk5IL3p3 +akk0UGF0V3NYckVDbjA2eUFWTVlleHMyTW03UmUzSnFFZnlSUXEwWXQvWG90L2wvYkZwdWxndXRv +K2l1TTZ3OHIKa3VGTzNuM1hJZ1Bqb3JvcTczZW5RZE9iNStYZC93L1BrdTJPMjAzUFZqMzF4VUpZ +dUJ1ZThOdi9RTC9GOE9QOS95RFMwbVNhZWlHTQpvZjJwVGhyYmVYNG4vZHJJNFNpckVqNGYyZ0l0 +OTJtZFJBaXJVdTBMUnRqNU1Qby9MQmZzV1pVc2U5Z09EUGtiMk9TVzJWd0lZWmhxClhURGlic1dS +bXBXS1J4TVByYU9JeW5ZY3VOMFVmSlpwblVRSXExR3RDMGJoMlZFMnVtcmREZGJycHhYUTV4Mm9m +MFhySkVKWWhXcjkKVFNuakYxWXU2UkU0T0JVQ1h0WTZpUkJXb2RvV2pIeVZ6Njd6dStUNkMydTM1 +M1Y0TUFZZTNxRjFFaUVzWHJVdEdMOWUveFhIT282MApiTkJTNnlpaUt1WFVnWitYd2VBWG9VYW0x +bW1Fc0dqVnRtRHNQTDlUem82cUxrNFBnWVFPME9NRHJaTUlZZEdxYmNFSU94OG00eGZWCnljOUxv +TnNTYUhSZTZ5UkNXS3hxV1RBeWN6TTVFSDhBZjJkL3JhTUlVMGxwRFh0ZmhTZWVCMTIrMW1tRXNF +alZzbURzdTdTUGprMDYKMHVDQkJscEhFYVowNEdXb2tRRmRWMnFkUkFpTFZDMExob3hmVkZQS0Zu +NzRBdnpuZ2NNWnJkTUlZWEdxWmNHUThZdHFMS2s5Ukw0QgpUMDBvbVBSV0NHR3dhbGN3a3U0a2NT +YjVETDRQK1dvZFJXZ2xlZ2JrMTREdVdnY1J3ckpVdTRLeE8yNDN2VnIxb3FadFRhMmpDSzBvCkc5 +ajhPZlNDRXdrbnRFNGpoTVdvZGdVajhtSWsvcTM5dFk0aHRIYlRCWDZ4b2NNL082Q3oxYUhURlgv +WTJ6dG9uVklJczFMdENrYkUKeFFqNnRPNmpkUXhoRGc3bVEyWi82UGwvRk56QnIrZ2pMZTJtcHZH +RU1EZlZxbUFrWnlSejRlWUZPamZ2ckhVVVlTNDJmd3JkRmhmYwoybFVJY1YvVnFtRHN2YlNYYmc5 +MXc4N1dUdXNvd2x5a3RvU2Q3OE93OFdDYnJYVWFJY3hhdFNvWUVSY2o4R3Z0cDNVTVlXNk9Ub0NV +Cmx0RG5iYTJUQ0dIV3FsWEJpTHdZS2VNWG9nUTYyUEl4ZEZrTnJTTzFEaU9FMmFvMkJTTTFLNVdU +Q1NmeGVkQkg2eWpDSE4xdURqOTgKRHNQSFF0MGJXcWNSd2l4Vm00S3gvL0orSG0zeEtMVnExTkk2 +aWpCWFp3Y1ZISjRhL2orZ3k5TTZqUkJtcDlvVWpJaUxFZmc1KzJGdgo3MURpT2ZmM1BrUTF0bnQr +d1d5MmZtOXBuVVFJczZOSndZaU1qTVROelkxMjdkcXhiTm15WXN2WHJsMkxwNmNubnA2ZWpCMDds +dE9uClQxZDhteGNqNmRPcXo5MXo2NHVmYzEvMElhb3RaUXViMWtIblQrQmhyY01JWVY0MEtSZ3pa +ODRrSkNTRXNMQXdWcXhZUVdKaVlwSGwKTGk0dVJFWkc4dXV2dnhJUUVNRGJiMWZzN0pVN09YZjQ5 +ZnF2ZEc4cGt3Y0pBOXh1QnQrdGhhY2dQalZlNnpSQ21BMlRGNHlVbEJRQQordlRwUSt2V3JSa3dZ +QURSMGRGRjJuVHYzcDBHRFFydVZSRVlHRWhFUkVTRnRoa1ZIMFducHAyb1kxZW5RdXNSMVVpY1A4 +VFkwSEpXCnkxS25EcEhwUTBSMVkvS0NFUnNiaTZ1cnEvNjV1N3M3VVZGUnBiYi8rT09QR1RwMGFJ +VzJXVGgrSVlSUjl1WkQxaURvRzB4cGh5OWwKK2hCUm5kVFFPc0Q5aElXRnNXYk5HdmJ2MzE5cW0z +bno1dWwvOXZmM3g5L2Z2MWlieUl1UnpPNHh1d29TQ3F1bWdPKytncURPY0trWAovUEdrMW9tRUtK +Znc4SERDdzhNcnZCNmRVc3Frbzd3cEtTbjQrL3R6NU1nUkFLWlBuODdBZ1FNSkRBd3MwdTYzMzM3 +ajZhZWZadHUyCmJiUnQyN2JFZGVsME9zcUtuNVdiaGVNSGpseDUrUXIydGV6dm5nVlYxa2N1cTAx +bHJNT2N0bU5PV2N6d016OFlEV09Id245MndnM1AKWW0xTS9DY2tSSVVaOHQxWkVwTWZraW9jbTRp +TWpDUXVMbzZkTzNmaTYxdjBaa2FYTGwxaStQRGhyRjI3dHRSaVlhaVlLekc0T3JwaQpYOHUrUXVz +Ylh5WTFBQUFXSjBsRVFWUVIxZGdWWC9ocGVVSFJxSDlGNnpSQ2FFYVRRMUtMRnk4bUtDaUluSndj +WnN5WWdhT2pJeUVoCklRQUVCUVh4MWx0dmtaeWN6TlNwVXdHd3M3TWpKaWFtWE51UzZVQkVwVGcr +RWhxZGg3RkQ0UE5JeUs2dmRTSWhUTTdraDZRcWt5RzcKVlFPK0dzQTBuMms4MGY0Si9Yc3M1N0NK +R1I2ZXNacnRsQ2VMZ3FFdlFQMnI4TTNtZ3R1OHlpRXBZWUVzNXBDVUtlWGs1UkFWSDBXdgpWcjIw +amlLc2dnNjJyZ1NiWEJnNEU3bklVMVEzVmwwd0RsODdUSnRHYlhDb0xlZktpMHFTYndjYk54VE1h +dHQ5a2RacGhEQXBzejZ0CnRxSmsvRUpVaWF3R3NHNHJUTzRCY2htR3FFYXNlZzlEYnBna3FreEtL +L2g2TXd5RkE1Y1BhSjFHQ0pPdzJvS1JsNS9IdnN2NzZOMnEKdDlaUmhMVzYxZ1craHllL2VaTG8r +T2l5Mnd0aDRheTJZUHgyNHplYTFXdEcwM3BOdFk0aXJObForUHpKenhuNjlWQmlycFR2MUc4aApM +SVhWRmd3WnZ4Q21FdmhJSUo4OStSbER2eDVLN0pWWXJlTUlVV1dzdG1ESStJVXdwU0dQRE9IVEp6 +NWx5TmREcEdnSXEyVlZGKzdaCjJ6djhkL2JRZndBaFFHcEo3N1NVaTh2TStTSTJTOTlPNVdXNTk3 +L0JMWDlzWWZLUGs5azZkaXRkSCt4YXhudUYwSVpjdUFmL3ZadWUKMHpISWNvRlV1WnVlTUsyaDdZ +Znl5Uk9mTU9UcklSeThlbERyT0VKVUt1dThEcU4xSkZ5VThRdWhqU2ZhUDRGU2lzQjFnV3g4WnFP +TQpwUW1yWVZWN0dIck9FWEJSeGkrRWRwNTBmWkkxdzlZd1lzTUkxdnkyUnVzNFFsUUtLeXdZQ2xw +SFFKd1VES0d0L2cvM1ovZjQzYnk1CiswM21oYytUU1FxRnhiTytndUZ3dG1BVzBWdk9XaWNSZ2c1 +Tk9oQTFPWXFmei83TXVCL0drWldicFhVa0ljck5xczZTMHVsMDBIazEKT0lmRGQ2VWRCckNrTTNr +czc0d2h5OWxPNVdVcDYwL0kzdDZCdE15Yk1BeW9DM3dEWlB4M2VmMzZqVWhOVFM1ak8wSlVIamxM +cXBBTQplQXN6azVaMkUzSVViTXlEeTYvQzgyMmg4UjhVbnJtblB4VmNDRE5uaFFWRHhpK0VtVkky +RVBZdTdIc1ZKdldDRGh1MFRpU0VVYXpyCnROb0dRSTBzU0hwRTZ5UkNsTzd3ODNEZEM0YVBoYmJi +NEdldEF3bGhHT3ZhdzNEbTd1RW9uY1pCUlBWUkE1MU9kOTlIaWE0K0NpR0gKUWVrZ0NMbklUMWdF +NnlvWXJaSHhDMkZpdVJTZlRjREEyUVd5NjhHUG44SXZNSGp0WU43Zjl6NzVLci9xSXd0UlR0WlhN +R1Q4UWxpYQo0eEE3SlpZdHA3Y3c0S3NCWEVtOW9uVWlJVXBrTlFYamF0cFZxQTBrZE5BNmloQkdh +OTJ3TmJ2SDc4YXZ0UitlSDNueTcvMy9KaWN2ClIrdFlRaFJoTlFVajhtSWtYS0xnVEJRaExGQU5t +eHE4NmZjbSt5ZnZKK3g4R0o0ZmViTHIvQzZ0WXdtaFp6WGZycEVYSStHaTFpbUUKcUxoSEdqL0N6 +Ly96TXd2NkxtRHlqNU1adVhFa2wxTXVheDFMQ09zcEdCRVhJeUJPNnhSQ1ZBNmRUc2RUcms5eDRz +VVR1RG01NFJYaQp4WUk5QzhqSXlTajd6VUpVRWFzb0dBbnBDY1NueHNNTnJaTUlVYm5xMk5WaHZ2 +OThZcWZFRW5zMWxvZVhQc3pDL1F0SnowN1hPcHFvCmhxeWlZT3k1dEllZUxYdUNuSkVvckpSTEl4 +ZStIL1U5UC8zUFQwUmRpY0pscVFzTDlpd2dOYXZFVzBvS1VTV3NvbURJL2J1RlpTdjcKNGo5N2V3 +Y0F2SnA1c2ZHWmpld2V2NXVUaVNkeFdlTEMzUEM1SkdmSTVJV2k2bGxGd1lpOEdDbDNOUk1Xck95 +TC8vNDZRYUc3a3p0ZgpEZnVLcU9lanVKSjZoWWVYUHN5a3paUFlkMm1mM0hkRFZCbUxuOTQ4K1U0 +eXJSYTNJbWwyRXJWcTFNS2NwcjIybk8yWVV4YjV6S1cxCnVkK2Y2dlhiMS9uUHIvL2gweU9mWXFP +ellaTFhKTVo1anFOcHZhWmxyRmRVUjlWMmV2TjlsL2ZoKzZBdk5XMXJhaDFGQ00wMHE5ZU0KMlQx +bmMrckZVNndldXBvVGlTZG92N3c5dzlZUEkvUjBLTG41dVZwSEZGYkE0dmN3Z25jRVkxL1RuamY5 +M3J3NzBadjUvSXZRY3JaagpUbG5rTTVmV3h0Zy8xYlNzTk5ZZlg4K25SejdsVE5JWkF0b0dFTmd1 +a0lGdEIrSlEyOEdvZFFuclV0NDlESXN2R0Q2cmZYaS8zL3Y0Ck9mdEp3YkNLTFBLWlMydFRrVC9W +K05SNGZqcnpFMXZQYkNVOExweE9UVHNSMkM2UXdIYUJlRFR4S0gxV1hXR1ZxbTNCcVB0T1hSSm4K +Si9KQWpRZWtZRmhGRnZuTUpiT2pZSEM4ZEliZTZqVXpONVB3dUhDMm50bksxdE5ieVZONURHdzdr +TzRQZGNmM1FWL2FPN2JIUm1meApSNnZGZlZUYmd0SDdzOTVFVG96VVB6ZWZQM0JMMm80NVpaSFBY +SkUyeHY0NUs2VTRsWGlLSGVkMkVIMGxtcGdyTVNUZVNlVFJGby9pCjg2QVBQZy82NFB1Z0w4M3JO +emRxdmNLOGxiZGdXUHdkOS95Yy9iU09JSVRGMHVsMHVEbTU0ZWJrcG44dDhVNGlzVmRpaWI0U3pj +ZUgKUHViNUg1K250bDF0ZkI3MHdjM1JqYllPYldubjBJNTJqZHZoVk1kSkRtZFZJNXJzWVVSR1Jo +SVVGRVJ1Ymk0elpzeGcrdlRweGRxOAo5dHByckYrL25rYU5HckYyN1ZwY1hWMkx0ZEhwZE93NHU0 +UCtEL2ZYUHpmUGZ4R0dBLzRtMkU1RjIreW01SnltekdJdGV4amgvTGN2CnpYY1BJenc4SEg5Ly8v +dTJVVXB4L3VaNVlxL0c4a2ZpSDV5OWVaWXpTV2M0bTN5V25Qd2MyanEwL1c4UmNXaW5mKzVVMTZu +U0RtMFoKa3RNY1dFcE9pOXJEbURsekppRWhJYlJ1M1pxQWdBREdqQm1EbzZPamZubE1UQXg3OXV6 +aDRNR0RiTisrbmVEZ1lFSkRRMHRjVjQrVwpQVXdWdXdMQ0tmMkwySnlFWXhrNUxVRTRsdENYaG56 +QjZYUTZIblo0bUljZEhpNjI3R2JHVGM0a0Z4U1BNMGxuQ0xzUXhxcURxemgzCjh4eTNNbS9SdUha +am10UnRRcE82VFdoYXIybkJ6M1h1K2Jsd1dkMm0xTGFyWGFHYzVzQlNjcGFYeVF0R1Nrb0tBSDM2 +RkZ5WlBXREEKQUtLam93a01ETlMzaVk2T1pzU0lFVGc0T0RCbXpCamVlT09OVXRkWHQyYmRxZzBz +aE1Xb1ljRGhJVHVnNkkyWjVzK2ZmOS9saHF6agpyK3JYYjhTZG0zZEl2SlBJbitsLzZoODMwbS93 +Wi9xZm5FaytvLy81ei9RL3VYSDdCanFkam5vMTYxSFhyaTUxYTliVi8xeXZaajB1Cm5MekFsUzFY +OU04TC8zLzJyRGxrcHQ2QjdMdVJjaW1ZVSs2ZVI5M2E5aHo3N1ZkcTJOUW85V0dyczVWRGF3WXdl +Y0dJalkwdGNuakoKM2QyZHFLaW9JZ1VqSmlhRzU1NTdUdi9jeWNtSmMrZk84ZkREeGYrRkk0UW9W +RGpGeVAzODlkRFd2THVQMHBZYnNvN2kwdEowMk5uYQowYngrYzRNR3pKVlNaT1Jta0o2ZFRucE9P +cmV6YjVPZWZmZi9jOUw1ejU3LzROUENSNzhzTlR1VnE3ZXZrdG5rRGp3NEVtcmVMbmpZClpvTk5i +cEZIdXMwcEh2dnlNWEx5Y3NqTnp5M3hrYWZ5c05YWkZpa2lkcloycFJhWXdrTnRPZ3FLakU2blE0 +ZU9hNGV1c2VYakxmcGwKaFVYb3IrMEtmOWF5WFhtWTVhQzNVcXJZOGJYU1BtVHgxdzNwak1wb1kr +dzY1aHZRcGpLMlU1RTI4eWs5cHltem1QSXpWMldXK1FhMApxWXp0VkxUTlgzL25sYk9keXY0WCs2 +WlZtMHBac3FITTk4WVpjTE9jdkx2L3l5TEx1R0IvY1QzMGVvWGViODVNWGpDNmR1M0tQLzd4CkQv +M3o0OGVQTTNEZ3dDSnRmSDE5T1hIaUJBRUJBUUFrSkNUZzR1SlNiRjBXZkVhd0VFSllISk5mbmRP +Z1FRT2c0RXlwdUxnNGR1N2MKaWErdmI1RTJ2cjYrYk5xMGlhU2tKTmF0VzRlYm0xdEpxeEpDQ0dG +Q21oeVNXcng0TVVGQlFlVGs1REJqeGd3Y0hSMEpDUWtCSUNnbwpDQjhmSDNyMTZzV2pqejZLZzRN +RGE5YXMwU0ttRUVLSWV5a3pGeEVSb1Z4ZFhWWGJ0bTNWMHFWTFMyd3paODRjMWFaTkc5VzVjMmQx +Cjh1UkpFeWNzVUZiTzNidDNLM3Q3ZStYbDVhVzh2THpVMjIrL2JmS01FeWRPVkUyYU5GRWVIaDZs +dGpHSHZpd3Jwem4wcFZKS1hicDAKU2ZuNyt5dDNkM2ZsNStlbjFxNWRXMkk3cmZ2VWtKeGE5MmxH +Um9ieThmRlJucDZleXRmWFYzMzQ0WWNsdHRPNkx3M0pxWFZmM2lzMwpOMWQ1ZVhtcElVT0dsTGpj +MlA0MCs0TGg1ZVdsSWlJaVZGeGNuR3JmdnIxS1NFZ29zanc2T2xyMTdObFRKU1VscVhYcjFxbkF3 +RUN6CnpMbDc5MjQxZE9oUVRiSVZpb3lNVkljUEh5NzFpOWhjK3JLc25PYlFsMG9wZGUzYU5YWGt5 +QkdsbEZJSkNRbXFUWnMyS2pVMXRVZ2IKYytoVFEzS2FRNSttcDZjcnBaVEt6TXhVSFRwMFVHZk9u +Q215M0J6NlVxbXljNXBEWHhaYXVIQ2hHanQyYklsNXl0T2ZaajNEMkwzWApiTFJ1M1ZwL3pjYTkv +bnJOeHNtVEo4MHlKMmcvU04rN2QyOGFOV3BVNm5KejZFc29PeWRvMzVjQXpabzF3OHZMQ3dCSFIw +YzZkT2pBCndZTUhpN1F4aHo0MUpDZG8zNmQxNnRRQjRQYnQyK1RtNWxLclZxMGl5ODJoTDZIc25L +QjlYd0xFeDhmejAwOC84Znp6ejVlWXB6ejkKYWRZRm83UnJOdTRWRXhPRHU3dTcvbm5oTlJ1bVpF +aE9uVTdIL3YzNzhmTHk0dVdYWHpaNVJrT1lRMThhd2h6Nzh1elpzeHcvZmh3ZgpINThpcjV0Ym41 +YVcweHo2TkQ4L0gwOVBUNW8yYmNxMGFkTm8yYkpsa2VYbTBwZGw1VFNIdmdTWU5Xc1dIM3p3QVRZ +MkpYL05sNmMvCnpicGdHRUlaY2MyR2xqcDM3c3pseTVlSmpZM0YzZDJkbVRObmFoMnBHT25MOGts +TFMyUFVxRkVzV3JTSXVuV0x6anhnVG4xNnY1em0KMEtjMk5qYjgrdXV2bkQxN2xwVXJWM0xreUpF +aXk4MmxMOHZLYVE1OUdSb2FTcE1tVGZEMjlpNTFiNmM4L1duV0JhTnIxNjZjT25WSwovL3o0OGVO +MDY5YXRTSnZDYXpZS2xYYk5SbFV5SkdmOSt2V3BVNmNPZG5aMlRKNDhtZGpZV0xLeUtuYUJVR1V6 +aDc0MGhEbjFaVTVPCkRzT0hEK2U1NTU3anlTZWZMTGJjWFBxMHJKem0xS2ZPenM0TUhqeTQyR0Zk +YytuTFFxWGxOSWUrM0w5L1B6LysrQ050MnJSaHpKZ3gKL1BMTEw0d2JONjVJbS9MMHAxa1hERXU1 +WnNPUW5EZHUzTkJYOHkxYnR0Q3BVNmNTajMxcXlSejYwaERtMHBkS0tTWlBub3lIaHdjdgp2ZlJT +aVczTW9VOE55YWwxbnlZbUpuTHIxaTBBa3BLUzJMRmpSN0hDWmc1OWFVaE9yZnNTWU1HQ0JWeStm +SmtMRnk3d3pUZmY4UGpqCmovT2YvL3luU0p2eTlLZFpUZzF5TDB1NVpxT3NuTjkrK3kyclZxMmlS +bzBhZE9yVWlZVUxGNW84NDVneFk0aUlpQ0F4TVpHV0xWc3kKZi81OGNuSnk5Qm5OcFMvTHlta09m +UW13Yjk4KzFxeFpRNmRPbmZEMjlnWUsvbEF2WGJxa3oyb09mV3BJVHEzNzlOcTFhNHdmUDU2OAp2 +RHlhTld0R2NIQXd6WnMzTjd1L2RVTnlhdDJYSlNrODFGVFIvclRvTys0SklZUXdIYk0rSkNXRUVN +SjhTTUVRUWdoaEVDa1lRZ2doCkRDSUZRd2doaEVHa1lJaEtaV05qUTNCd3NQNzV2Ly85NzcvY0Fy +VHErZnY3Yy9qd1lRQUNBd05KVFUydDBQckN3OE1aT25Tb3dhOVgKeGJhcTB0V3JWM25tbVdkTXVr +MWhtYVJnaUVwVnMyWk52di8rZTVLU2tnRGpyOFROeTh1cmNJWjd0N2wxNjFiczdlMHJ2RTVyMXFK +RgpDelp1M0toMURHRUJwR0NJU21Wblo4Y0xMN3pBb2tXTGlpMjdldlVxTTJmT3hOUFRrMW16Wm5I +anhnMEFKa3lZd01zdnY0eXZyeSt2CnZ2b3FFeWRPNUpWWFhzSEh4NGYyN2R0ejVNZ1JYbmpoQlRw +MDZNQzhlZlAwNi92NzMvOU8xNjVkNmRHakI2dFhyeTR4ajdPek0wbEoKU1h6MDBVZDRlM3ZqN2Ux +Tm16WnRlUHp4eDRHQ2VjREdqUnVIcjY4dmMrYk0wVitSR3hzYlM5KytmZkgyOW1iNzl1MWxmdTZN +akF3KwovUEJEL1B6OENBd01KRHc4SElEdTNic1h1WnEyY084bk16T3p4UGFsdVh6NU1vTUdEY0xM +eXd0UFQwL09uVHRIWEZ3Yzd1N3VUSjQ4CkdUYzNOK2JQbjYvUC8vYmJiK1BqNDBQWHJsMVpzR0JC +a2ZXODhzb3JlSHQ3MDZWTEZ5NWN1RUJjWEJ3ZE8zWUU0SXN2dm1EMDZORU0KSGp3WUR3OFBsaTVk +cW4vdnRtM2I2TjY5T3o0K1ByejAwa3RNbno2OVdNNmpSNC9TdDI5ZnZMeTg2Tnk1TTdkdjN5Nno3 +NFFGcWNqVQp1VUw4VmIxNjlWUnFhcXB5ZG5aV0tTa3A2dC8vL3JlYU4yK2VVa3FwV2JObXFmZmZm +MThwcGRTQ0JRdlU3Tm16bFZKS2pSOC9Ydm41CitlbW4zSjR3WVlJYU5HaVF5c3JLVWw5ODhZV3FW +NitlQ2c4UFYxbFpXY3JOelUwL2RYeHljckpTU3Ftc3JDemw2K3VyYnQrK3JaUlMKeXQvZlh4MDZk +RWdwcFpTenM3TktTa3JTNTh2SnlWRzllL2RXb2FHaCtyYTNidDFTU2lrMWUvWnM5YzAzM3lpbGxP +clVxWk9Lam81Vwp0Mi9mVmdNSERpeHhldWpkdTNmcjd6UHcrZWVmcXlWTGxpaWxsTHArL2JyeThm +RlJTaW0xYU5FaU5YZnVYS1dVVWxldlhsWHQyN2UvCmIvdDcxM212dVhQbnFrOCsrVVQvR1RJeU10 +U0ZDeGVVVHFkVDMzMzNuY3JNekZSUFAvMjArdmJiYjR2MFRXNXVyaG82ZEtnNmRlcVUKdnE5WHJG +aWg3N2M3ZCs2b0N4Y3U2S2VTLy96enoxV1RKazNVMWF0WFZXcHFxbnJvb1lkVWRuYTJ5c25KVWM3 +T3p1ckNoUXNxS1NsSgpkZTdjV1UyZlByMVl6dkhqeDZ1d3NEQ2xWTUUwNExtNXVjWGFDTXNsZXhp +aTB0V3ZYNTl4NDhZVitkY3B3TTgvLzh5a1NaTUFtRHg1Ck1sdTJiQUVLRGlHTkdER0MrdlhyNjl1 +T0dER0NtalZyMHIxN2R4bzJiSWlmbng4MWE5YkUyOXRiUHhQd3pwMDdDUXdNeE52Ym0vUG4Kei9Q +TEw3K1VtVzNHakJuMDdkdVh3TUJBRGgwNnhMRmp4L0QzOThmYjI1dlEwRkFpSXlPNWN1VUtTaWw4 +Zkh5b1c3Y3VvMGFOS25PNgo2azJiTnJGNjlXcTh2YjBaT0hBZ04yN2M0TUtGQzR3Y09aSnZ2LzBX +Z0EwYk51akhDa3BxZi83OCtWTFgzN1ZyVnhZdlhzeDc3NzFICmNuSXlEenp3QUZBd0xjMndZY09v +VmFzV1k4YU1ZZHUyYlFBY1BIaVE0Y09IMDZsVEp3NGZQc3lPSFR2SXpzNW05KzdkVEpreUJTZzQK +ZkZpN2R1MWkyeG93WUFETm16ZW5mdjM2dUx1N2MvandZYUtpb3VqWXNTUE96czQ0T0Rqd3hCTlBs +TmduM2J0M1o4NmNPU3hmdnB6YwozRnhzYlczTC9KMEl5MkgyVTRNSXkvVFNTeS9SdVhObkprNmNX +T1QxMHI1NG16ZHZYdVI1NGZ4Y05XdldwR0hEaHZyWGE5YXNTWFoyCk5tbHBhY3laTTRjOWUvYnc0 +SU1QTW16WU1HN2V2SG5mVEY5ODhRV1hMMTltNWNxVlFNRTAxUjRlSHV6ZXZidEl1L2o0ZU1NKzVE +M3kKOC9OWnNXSUZmZnIwS2Jhc2NlUEcvUDc3NzJ6WXNFRS9OVU5wN1F1bjYvaXJ3TUJBdW5UcHdw +bzFhK2pac3ljYk4yNHMwaStGQ3NkdgpwaytmenJmZmZvdUhod2V6WnMzaTVzMmI2SFM2RW1jby9h +dS85bmRtWmlZMWF0UW9NalpVMmpxQ2dvTG8zNysvZmlxUzZPaG9talp0CmV0L3RDY3NoZXhpaVNq +UnExSWlSSTBmeTZhZWY2cjlvQmc4ZXpKZGZma2wrZmo2ZmZmWVpUenp4UkxuV3JaVGkxcTFiMk5u +WjBheFoKTTA2ZlBzMnVYYnZ1KzU1RGh3NnhjT0ZDdnZycUsvMXJYYnQyNWNhTkcvbzlsdlQwZE02 +Y09jTkREejJFcmEwdHNiR3hwS2VuczJIRApoakl6alIwN2xwQ1FFTkxTMGdDS1RIazlhdFFvM252 +dlBWSlRVL0h3OENpemZVa3VYTGlnbjd1b2I5KysrbkdSbEpRVWZ2amhCN0t5CnNsaS9majBEQnc0 +a016T1R0TFEwbkoyZHVYTGxDcHMzYndZS3hwY2VlK3d4VnE5ZWpWS0tyS3dzTWpJeXl2eHNPcDJP +YnQyNjhmdnYKdnhNWEYwZHljaktob2FFbG50Qnc3dHc1WEZ4YytOLy8vVjljWFYzTjRsNGxvdkpJ +d1JDVjZ0NHZrVmRlZVlYRXhFVDk4K0RnWUM1ZAp1b1MzdHpjM2J0emc1WmRmTHZGOWYzMWUwcktX +TFZzeWZQaHdQRHc4bURadFdxbW5vaGIrcTNyRmloWGN2SG1UeHg1N0RHOXZiMTU0CjRRVUF2dnJx +SzFhdFdrV25UcDNvMGFNSGYvenhCd0FmZi93eHI3MzJHcjE2OWNMVDA3UEVMMGVkVHFkL2ZjU0lF +Zmo0K0JBUUVJQ0gKaHdkejU4N1Z0eHN4WWdUcjE2OW41TWlSUlY0cnFmMjk2N3pYaGcwYjhQRHdv +R3ZYcnR5NWMwZS9MbGRYVjM3ODhVZTh2THp3OFBBZwpNRENRQng1NGdEbHo1dURqNDhPb1VhTVlQ +SGl3ZmozdnZQTU9aOCtleGRQVGs1NDllK3BQUENqY1ptbmJ0N1cxWmZueTVZd2FOWXFCCkF3ZlNz +V05IMnJScFU2emRraVZMNk5peEl6NCtQcmk2dXRLalI0OFNmeS9DTXNua2cwSllxTGk0T0lZT0hj +cnZ2Lzl1a3UybHA2ZFQKdDI1ZFVsSlNHREprQ0o5ODhnbnQyN2MzeWJhRmVaQXhEQ0VzbUNudk9E +ZHYzanpDd3NLd3M3UGoyV2VmbFdKUkRja2VoaEJDQ0lQSQpHSVlRUWdpRFNNRVFRZ2hoRUNrWVFn +Z2hEQ0lGUXdnaGhFR2tZQWdoaERDSUZBd2hoQkFHK1g4TEF4UDFCZTVmQkFBQUFBQkpSVTVFCnJr +SmdnZz09Cg== + + + + + + ## Parallel calculation of nearest neighbor eigenvalue distribution + + + Here we perform a parallel computation, where each process constructs and diagonalizes a subset of +the overall set of random matrices. + + + def parallel_diffs(rc, num, N): + nengines = len(rc.targets) + num_per_engine = num/nengines + print "Running with", num_per_engine, "per engine." + ar = rc.apply_async(ensemble_diffs, num_per_engine, N) + diffs = np.array(ar.get()).flatten() + normalized_diffs = normalize_diffs(diffs) + return normalized_diffs + python + 11 + 1 + + + + client = Client() +view = client[:] +view.run('rmtkernel.py') +view.block = False + python + 12 + 1 + + + + parallel_nmats = 40*serial_nmats +parallel_matsize = 50 + python + 13 + 1 + + + + %timeit -r1 -n1 parallel_diffs(view, parallel_nmats, parallel_matsize) + python + 14 + 0 + + + stream + Running with 10000 per engine. +1 loops, best of 1: 14 s per loop + + + stream + + + + + + pdiffs = parallel_diffs(view, parallel_nmats, parallel_matsize) + python + 15 + 0 + + + stream + Running with 10000 per engine. + + + + + Again, the agreement with the Wigner distribution is excellent, but now we have better +statistics. + + + hist_data = hist(pdiffs, bins=30, normed=True) +plot(s, rhos) +xlabel('Normalized level spacing s') +ylabel('Probability $P(s)$') + python + 16 + 0 + + + pyout + &lt;matplotlib.text.Text at 0x376c950&gt; + 16 + + + display_data + aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVl3QUFBRU1DQVlBQUFEWGlZR1NBQUFBQkhOQ1NWUUlD +QWdJZkFoa2lBQUFBQWx3U0ZsegpBQUFMRWdBQUN4SUIwdDErL0FBQUlBQkpSRUZVZUp6dDNYbGNW +UFgreC9IWElMZ2pMcWhvRm1xaGdDZ01Db2dtVG01Z3FOMVNNNjFjCjZoWmxpcmxVMXErdVdyZHVk +YStwbVJyWnRWVXJ5OHF0TWt6SDBRVEVMWGROQlJPM0ZCVlEyVG0vUDRpNWptd3pNTXlaWVQ3UCs1 +aEgKek16WDcvZk40VElmenZtZTh6MGFSVkVVaEJCQ2lFcTRxQjFBQ0NHRVk1Q0NJWVFRd2l4U01J +UVFRcGhGQ29ZUVFnaXpTTUVRUWdoaApGaWtZUWdnaHpLSkt3VEFZRFBqNStlSGo0OFBDaFF0THZa +K1ZsY1gwNmRNSkNnb2lQRHljRXlkT3FKQlNDQ0hFelZRcEdGT21UQ0V1CkxvNk5HemV5YU5FaUxs +MjZaUEwrRjE5OFFYNStQbnYzN3VXZGQ5N2grZWVmVnlPbUVFS0ltOWk4WUdSa1pBQVFFUkdCdDdj +M2d3WU4KSWlrcHlhVE5wazJiaUk2T0JpQThQSnpqeDQvYk9xWVFRb2hiMkx4Z0pDY240K3ZyYTN6 +dTcrOVBZbUtpU1p2SXlFaSsrT0lMc3JPegpXYk5tRGZ2Mzd5Y2xKY1hXVVlVUVF0ekVWZTBBWlJr +MWFoUnBhV24wN2R1WHpwMDc0K1BqUTcxNjlVcTEwMmcwS3FRVFFnakhWNlZWCm9SUWJ1M3IxcWhJ +VUZHUjhQbW5TSkdYZHVuWGx0cy9LeWxJQ0F3UExmRStGK0ZVeWE5WXN0U09ZUlhKYWp5TmtWQlRK +YVcyT2tyT3EKbjUwMlB5VGw0ZUVCRko4cGxacWFTbng4UEdGaFlTWnRNakl5eU12TDQ4YU5HL3py +WC85aTRNQ0J0bzRwaEJEaUZxb2NrcG8vZno0eApNVEhrNStjVEd4dUxwNmNuY1hGeEFNVEV4SERv +MENIR2p4OVBVVkVSNGVIaHZQLysrMnJFRkVJSWNSTlZDa2Jmdm4wNWZQaXd5V3N4Ck1USEdyOFBE +d3psNjlLaXRZOVVZblU2bmRnU3pTRTdyY1lTTUlEbXR6VkZ5VnBYbXIrTlpEa21qMFZSdDRrWUlJ +WnhZVlQ4N1pXa1EKSVlRUVpwR0NJWVFRd2l4U01JUVFRcGhGQ29ZUVFnaXpTTUVRUWdoaEZpa1lR +Z2doekNJRlF3Z2hoRm1rWUFnaGhEQ0xGQXdoaEJCbQprWUloaEJEQ0xGSXdoQkJDbUVVS2hnTnEw +cVE1R28ybTBrZVRKczNWamlxRXFFVms4VUVIVkh5blFYTytiK2ZjUGtLSWlzbmlnMElJCklXcVVG +QXdoaEJCbVVhVmdHQXdHL1B6ODhQSHhZZUhDaGFYZXo4N09adHk0Y1dpMVd2cjI3Y3ZxMWF0VlND +bUVFT0ptcXN4aGFMVmEKRml4WWdMZTNONUdSa1d6YnRnMVBUMC9qKysrLy96Nzc5dTFqOGVMRm5E +cDFpbjc5K25IOCtQRy9qdDNmRkY3bU1DcHI2WlRiUndoUgpNWWVadzhqSXlBQWdJaUlDYjI5dkJn +MGFSRkpTa2trYkR3OFBzckt5eU0vUDUvTGx5elJzMkxCVXNSQkNDR0ZiTnIrbmQzSnlNcjYrCnZz +Ym4vdjcrSkNZbUVoMGRiWHh0OU9qUnJGMjdGazlQVHdvS0NraElTQ2kzdjltelp4dS8xdWwwdGY2 +ZXVrSUlZU205WG85ZXI2OTIKUHpZdkdPWjQ3NzMzY0hWMTVkeTVjK3pmdjUvbzZHaE9uVHFGaTB2 +cEhhS2JDNFlRUW9qU2J2MWplczZjT1ZYcXgrYUhwRUpDUWpoeQo1SWp4K2NHREIrblpzNmRKRzRQ +QndNTVBQMHpEaGcwSkN3dWpiZHUySER0MnpOWlJhd0ZYdWNCUENHRTFOaThZSGg0ZVFIRlJTRTFO +CkpUNCtuckN3TUpNMi9mdjNaKzNhdFJRVkZYSHk1RWt1WDc1c2NoaExtS3VBNHNueGloOVpXVmRV +U3lpRWNCeXFISkthUDM4K01URXgKNU9mbkV4c2JpNmVuSjNGeGNRREV4TVR3MEVNUGNlalFJWHIw +NkVITGxpMVpzR0NCR2pHRkVFTGNSSllHc1JOTm1qUzM4Qzk5ODA2cgpsZE52aFJDM3F1cG5weFFN +TzJIK3RSVmdTU0dRZ2lHRXVKWERYSWNoaEJEQ01VbkJFRUlJWVJhN3ZBNURtRXVCSm1lZzBaK1E0 +d0U1CnpTQzdHY1dIb29RUXdycWtZRGlhQnVrUUFIVHREVjYvUWE0N1hHOE45VEtoNFNXNDVnVkho +OEhSb1hBYUtES25VMWV6bGw1eGQyOUcKWnVibGFuNERRZ2hISlpQZWRxTFNTVyszNjNEUExBaitF +SDdQZ045K2dOTzlJTmZqcGtZS3ROa0RuZGRBNTlWUWJ5OXMvQm9PRGFmaQp2UTZaSEJmQ21jaFpV +ZzZ1d29KeDU4OHc1Q2s0SFE0YjVoWHZVWmp6QWQ5QkE1R0JrTmNZTnJ3RFowTExHOTI4L3FSZ0NG +RXJTTUZ3CmNHVVdERTBoREk2RlR1dGgzUkk0UHJqa2pkSnR5KzRWTkFVUStDbjBmd2tTbjRWZm42 +ZjAzb1lVRENHY2lSUU1CMWVxWUxqa3d3T1AKUXNPTDhPWDNrT2QrYzJzc3ZnNmp5V2tZTlJ5dWRJ +RFZ5eUMvVVpYNnF5M2JXd2huSnRkaDFDYXVPY1VmN203WFljWDZXNHBGRldYZQpEaDhaSUw4aC9E +MGNQUDZvZnA5Q0NLY2lCY1BlMU1tRjBjTWd2d0Y4OVMwVTFMZGUzd1gxaS9jdWZoc0w0L3BCNDNQ +VzYxc0lVZXZKCmFiWDJKdXJaNHIyQVZTdEFxVk1EQTJoZys0emlRMTVqQjhESGVyaFJBOE1JSVdv +ZEtSajJKT2dqNkxBSmxpYlhVTEc0eWJZWG9lNDEKZURRU1BnRnlhblk0SVlUamswTlM5cUlOTVBC +NStPbzd5RzFpbXpFMy9STk85WUdIS1M0ZVFnaFJBU2tZZGlEOVJqbzhDS3hmQWhmOQpiVGl5cHZp +NmpvdkE4REdnTWV1eWNDR0VrMUtsWUJnTUJ2ejgvUER4OFdIaHdvV2wzdi9QZi82RFZxdEZxOVhT +dFd0WFhGMWR1WHIxCnFncEpiU1AycDFnNEFod2FZZnZCRlJkWVQvR1NJM2UvYWZ2eGhSQU9RNVhy +TUxSYUxRc1dMTURiMjV2SXlFaTJiZHVHcDZkbm1XM1gKclZ2SC9QbnoyYmh4WTZuM2FzTjFHQnVP +YitEcDlVK1Q4bHdLNUt0M1B3emMwK0RKSHZEZFozQnlRTG50SEgxN0N5RWM2RHFNakl3TQpBQ0lp +SXZEMjltYlFvRUVrSlNXVjIzN0ZpaFdNSGozYVZ2RnM2a2IrRFNiK01KRkY5eTZDZkpYRFpOMEcz +eTZIK3g4dHZzaFBDQ0Z1CllmT0NrWnljaksrdnIvRzV2NzgvaVltSlpiYTljZU1HR3pac1lQanc0 +YmFLWjFPdkdWNGpwRzBJZzMwR1Y5N1lGbEw2UWRJVWVIQWsKMU1sVE80MFF3czdZOVdtMWE5ZXU1 +ZTY3NzZacDA2Ymx0cGs5ZTdieGE1MU9oMDZucS9sZ1ZyRC93bjcrdS91LzdIdDZuOXBSVEcxNwpB +ZG9sd3NEbjRLY0ZhcWNSUWxpQlhxOUhyOWRYdXgrYnoyRmtaR1NnMCtuWXMyY1BBSk1uVHlZcUtv +cm82T2hTYmUrLy8zNUdqUnJGClF3ODlWR1pmampxSG9TZ0t1azkwakFrWVEweVBHRUQ5ZTNxYnRL +dC9CU1oyaFc4L2gxU2RTVHRIM041Q0NGTU9NNGZoNFZGOC93YUQKd1VCcWFpcng4ZkdFaFlXVmFw +ZVJrWUhCWU9DKysrNnpkY1FhRjM4eW5ndlhMdkQzNEwrckhhVnNPYzFnL1dJWTl2Zmk5YXlNaW0r +MApaTTZqU1pQbXFzVVhRdFFNVlU2cm5UOS9QakV4TVF3WU1JQ0pFeWZpNmVsSlhGd2NjWEZ4eGpi +ZmYvODlrWkdSTkdqUVFJMklOVVpSCkZGN1ovQXF6ZGJPcDQxTERWM05YeDlGaGtCWUcvVjY1NmNV +Q2l2ZEVLbjlrWlYyeGNXQWhSRTJUNWMxdGJQMng5Y3o4WlNhL1BmVWIKTHByLzFXdTdPaVJWb3VF +bGVMb3JyRnhWZkhjL3Mvc3I3dFBSZmpaQ09BdUhPU1RsekJSRjRSLzZmekJITjhla1dOaXRHNTd3 +NDBLNAo3N0hpSmRlRkVFN05BVDYxYW8vdmozeVBvaWpjNzN1LzJsSE1kMmdFL0JrQWZlZW9uVVFJ +b1RJcEdEWlNwQlR4RC8wL2VQV2VWLzg2Ci9PUkExaThDN1RKb3EzWVFJWVNhcEdEWXlOY0h2NmFS +V3lPaWZVcWZQbXozcnJlR24rZkNNSXJ2TXk2RWNFb3k2VjNEbWpScFR0YTEKS3pBUitBazRVVkZy +TzV2ME5xSEFCQmZZRndlN25qU3JUM3YvMlFqaHJHVFMyMDVsWlYyQk8zK0VnaUE0VVVUNXA2TGFP +dzM4Q056egpENmhmZTFjT0ZrS1VUd3FHTFlRdWhCMlRLZjVMM29HZEI0NE9oWWpYMUU0aWhGQ0JG +SXlhMWh5NExSbjIxNUlWZHpmOUU0SStnUmJICjFFNGloTEF4S1JnMUxRVFk4eGdVMUpJcjFxKzNM +bDZnY05CMHRaTUlJV3hNQ2tZTnVwWjNEUUtCNUtmVmptSmRTYkhnZVFUdTNLQjIKRWlHRURVbkJx +RUdmNy9zY1RnRVozbXBIc2E3Q2VzV24yVVpOQlJlMTcvd2toTEFWS1JnMVJGRVUzdHZ4SHBSL00w +SEhkblFvWkxhRApIdStyblVRSVlTTlNNR3JJNXRUTnhWK2txaHFqQm1uZ3AzblE5elZva0s1MkdD +R0VEVWpCcUNFTGR5eGtVdWdrdFdQVXJJdGQ0T0NECm9KTjFwb1J3QmxJd2FrQmFaaHFHVXdZZTZm +YUkybEZxbm40V2RGME9IcWZVVGlLRXFHRlNNR3JBOG4zTEdlRS9nc1oxRzZzZHBlYmQKYUFuSkU2 +SHZxMm9uRVVMVU1GVUtoc0Znd00vUER4OGZIeFl1WEZobW0rVGtaRUpDUXZEejgwT24wOWsyWURV +b2lzSm4rejdqa2E1TwpzSGRSSW1FNmRGNGpGL01KVWN1cHN2aWdWcXRsd1lJRmVIdDdFeGtaeWJa +dDIvRDA5RFMrcnlnSzNicDFZOTY4ZVF3WU1JQkxseTZaCnZGL0NIaGNmL08zOGI5ejM1WDJjbkhJ +U0Y0MkxCWGZTczhNNzdsblNyczhiMEdvL3JQckMyTmJlZmpaQ2lHSU9zL2hnUmtZR0FCRVIKRVho +N2V6Tm8wQ0NTa2t6UFBkMjVjeWZkdW5WandJQUJBR1VXQzN2MTJiN1BlS1RiSTQ1eFJ6MXJTb3FG +RHB1aDlUNjFrd2doYW9qTgpQOVdTazVQeDlmVTFQdmYzOXljeE1kR2t6WVlORzlCb05QVHAwNGVo +UTRleVlZTmpYRkZjV0ZUSWl2MHJlTGpydzJwSHNiMjh4ckJ0Ckp0enppdHBKaEJBMXhGWHRBR1hK +eWNsaDc5NjliTnk0a1JzM2JqQnc0RUFPSERoQWd3YWwxMk9hUFh1MjhXdWRUcWZxZk1lbWxFMjAK +ZFcrTFgwcy8xVEtvYXVkVEVENFhia3VDTTJxSEVVS1UwT3YxNlBYNmF2ZGo4NElSRWhMQ2M4ODla +M3grOE9CQm9xS2lUTnFFaDRlVAptNXVMbDVjWEFEMTY5TUJnTUJBWkdWbXF2NXNMaHRvKzMvKzVj +NXhLVzU2QyttQjRCZnE5REorcEhVWUlVZUxXUDZibnpLbmF0Vk1XClRYb1hGUldSa0pCQWFtb3FG +eTllcEduVHBuVHAwb1h1M2J2ajRtTCswYTJTU2U4NzdyaURxS2lvVXBQZTZlbnBEQjQ4R0wxZVQw +NU8KRGoxNzltVDM3dDAwYm14Nm1xbzlUWHBmejd0T3UzbnRPUExNRVZvM2JtMTgzV2ttdlV1NDVN +TWtYMWh6Q2xJcnY1MnJ1M3N6TWpNdgptekcyRU1KYXF2clphZFllUmw1ZUh2UG16YU93c0pDbVRa +dlNzV05IdW5UcFFscGFHdHUzYjJmVnFsVzBhdFdLS1ZPbVVLZE9uVXI3Cm16OS9QakV4TWVUbjV4 +TWJHNHVucHlkeGNYRUF4TVRFMEtKRkN5Wk1tRUNQSGoxbzJiSWxyNzc2YXFsaVlXOVdIMTFOejNZ +OVRZcUYKVXlweUEvMXM2RGNXbGhWUjJVMmpzckljL0taU1FqaVJTdmN3Y25OeldiRmlCVU9HREtG +bHk1Ymx0anQ1OGlTLy9QSUxUenp4aE5WRApsc2VlOWpEdVhYNHZEM2Q5bUllN21VNTRPOTBlQm9D +bUVKNTJoZmoxOFB1OWxmWnBMejlESVp4RlZUODdWYmtPdzFyc3BXQmN1SGFCCnp1OTE1c3kwTXpT +cTI4amtQYWNzR0FCK0dvalFRdHd1S3Q3THNJK2ZvUkRPeEdiWFlSdzVjb1FmZnZpQnk1Y3ZjL2p3 +WVlzSHJJMisKUFBBbHd6b1BLMVVzbk5waFFOR0EzN2RxSnhGQ1dFbVZDb2FYbHhjOWUvWmsvZnIx +ZlBhWm5BN2o5R2RIbFdmVFA2SGZLOFdIcUlRUQpEcy9pZ25IMjdGazJiOTZNVnF0bHhvd1p0Rzd0 +M0pPOHY2Zi9UbHBtR3YwNjlGTTdpdjA1SGdYWnpTRGdLN1dUQ0NHc3dPS0NNVzdjCk9IeDlmVm15 +WkFuUFBQTU1lL2Z1cllsY0R1UDdJOTl6WCtmN2NIV3h5MnNnVmFZcHZpNmp6eHVnS1ZJN2pCQ2lt +cW8xNlgzbHloV2EKTm0zNjE4U3U3ZG5EcEhmdlpiMTV1Yy9MRFBZWlhPYjdUanZwYld5cndCT2hz +TzFGT1B4QW1lM1UvaGtLNFd4cWJOSTdOemVYbzBlUApsdmxlczJiTlRJckYxcTFiTFE3Z3lDNWN1 +OENCUHcvSTRhZ0thY0R3TWtUOEUvT0xqUkRDSGxWYU1PclZxMGQ2ZWpydnZmZGVtV2RGClpXWm1z +blhyVm1KalkybldyRm1OaExSWDY0NnRZOUNkZzZqbldrL3RLUGJ0MkZCd0tRQ2ZIOVZPSW9Tb0Jy +TU92Qjg1Y29SWFhubUYKYWRPbVViZHVYUjU1NUJGeWNuTEl6TXpFeTh1THlNaElGaXhZb05xaEti +V3NQcnFhQjdzOHFIWU0rNmU0Z09IL0lPSTErSDB3bFYzOQpMWVN3VDJZVmpMMTc5M0xod2dXeXNy +SjQ5OTEzR1RCZ0FIMzY5S25wYkhidGV0NTE5S2w2UHZuYkoycEhjUXlIUnNBOXM2RERKa2pwCnIz +WWFJVVFWbUhXV1ZMZHUzYWhidHk0dFdyUmcxcXhaN05tenA2WnoyYjM0ay9HRTNCWkNzd2JPZFJp +dXlwUTZzUFdsditZeWhCQ08KeUt5Q2taQ1F3SkVqUjRyL2dZc0wzdDdlTlJyS0Vhdyt1cHI3T3Qr +bmRnekhzbjgwTkQwRmQyeFRPNGtRb2dyTU9xMVdwOVBSdUhGagpEaDQ4U051MmJXbmF0Q2xqeG95 +aFY2OWU3Tnk1azVFalI5b2lheWxxblZaYldGU0kxMXd2ZGo2eEUrK21GUmRQT2EzMkZzRkx3WDhW +CmZQNlRzWjJjVml1RWJkWG80b01IRHg2a1M1Y3VRUEdxdEVsSlNTUW5KNU9VbE1UKy9mdkp6TXkw +UExFVnFGVXd0cDdheXVRZko3UDMKcWNvdldwU0NjWXM2dVJEckExK3Rnck1oU01FUXd2WlVXNjEy +M3J4NVRKMDZ0VHBkVkpsYUJXUEd6ek5ZT0hjUmVUL25tUGt2cEdDWQpDSDBQT3NiRGw2dVJnaUdF +N2FsV01Bb0xDODI2YVZKTlVLTmdLSXBDcC9jNmNmeGZ4K0djSFg0WTIwVzdTdHE2WnNPVWpzV0hw +UzRFClNjRVF3c1pzdHJ6NXJhcFNMQXdHQTM1K2Z2ajQrTEJ3NGNKUzcrdjFlanc4UE5CcXRXaTFX +djc1VC9zNXMrYndwY1BrRnVUQ09iV1QKT0xDQ0JwQXd2WGlOS1NHRXcxQmx4YndwVTZZUUZ4ZUh0 +N2Mza1pHUmpCNDkydVNlM2dCOSsvWmx6Wm8xYXNTcjBPb2pxeG5XZVJpTApXS1IyRk1lMjh5bVk4 +alo0VnQ1VUNHRWZMTnJET0hQbVRMVUh6TWpJQUNBaUlnSnZiMjhHRFJwRVVsSlNxWGIyZXBoQ1Rx +ZTFrcnpHCmtEZ0ZuUHY2VHlFY2lrVUZZK0RBZ1F3ZVBKaVZLMWVTbjU5ZnBRR1RrNVB4OWZVMVB2 +ZjM5eWN4TWRHa2pVYWpZZnYyN1FRRkJURnQKMmpST25EaFJwYkdzN1Z6V09ZNm1INlZ2Kzc1cVI2 +a2Rka3dDSHpoeDJUNSt2a0tJaWxsMFNPclFvVU5zMzc2ZFpjdVc4Znp6enpOMAo2RkFtVEpoQWNI +Q3dWVU1GQndkeit2UnAzTnpjK09TVFQ1Z3laUXJyMXEwcnMrM3MyYk9OWCt0ME9uUTZuVld6M0d6 +dHNiVkUzUlZGCjNUcDFhMndNcDVMckFjbnc1cTl2c25Ub1VyWFRDRkZyNmZWNjlIcDk5VHRTcXVq +SEgzOVUyclJwbzdScTFVcnAxYXVYa3BDUVlOYS8KdTNyMXFoSVVGR1I4UG1uU0pHWGR1blhsdGk4 +cUtsSmF0V3FsNU9Ua2xIcXZHdkdyNU43bDl5cGY3UC9DT0RZb1pqeXMzVTdOc1dzZwpZNE02Q2kr +ZzRGRnk4NHl5SCs3dXpXejZzeGFpTnF2cVo2ZEZoNlRTMHRKNC9mWFhDUWdJWU5teVpYejg4Y2Vj +TzNlT3hZc1g4OWhqCmo1blZoNGVIQjFCOHBsUnFhaXJ4OGZHRWhZV1p0TGx3NFlKeERtUHQyclYw +NjlhTmV2WFVYVUw4ZXQ1MXRwN2F5dUM3eXI1UmtxaWkKN0VMWS9SejBta1FGOVlLc3JDc3FoaFJD +Z0lXSHBBWVBIc3lFQ1JQUTYvVW1aelVGQmdieTFGTlBtZDNQL1BuemlZbUpJVDgvbjlqWQpXRHc5 +UFltTGl3TWdKaWFHYjc3NWhpVkxsdURxNmtxM2J0MllPM2V1SlRGcmhPR1VBVzBiTFI3MVBkU09V +dnRzbnc2VC9Jb1hKN3pXClJ1MDBRb2h5V0hUaDNvNGRPd2dORGEzME5WdXg1WVY3MHpaTW8xbjla +cnpTOXhYajJIWjVVWnhkdEt0Q24xRlRvTWdOZnY1UHVlMXMKOWJNV29yYXp5WVY3WmUxRnhNVEVX +RHlvSTlwNGNpTUQ3eHlvZG96YWEvdHpvRjBHRFMrcG5VUUlVUTZ6RGtrbEp5ZXpZOGNPTGw2OAp5 +T0xGaTQyVjZlTEZpMDV4VzliejE4NXpPdk0wUGRyMlVEdEs3WlhaRGc0K0NEM253YWJYMVU0amhD +aURXWHNZR1JrWm5ENTltdno4CmZFNmZQazFhV2hwcGFXbDRlWG54MFVjZjFYUkcxVzA4dVpGNzJ0 +K0RxNHNxRjhZN2oyMHZRSS8zb2I1TWNBdGhqeXlhd3poMjdCaWQKT25XcXlUd1dzZFVjeHJqdng5 +SHp0cDQ4SGZLMHlkZ09NejlnODNiVjZQTnY0K0h5bldCNHBWUTdtY01Rd2pwcWRMWGE2T2hvMXE5 +ZgpUL3YyN2YvNm9EUWQrT1RKa3hZUGJBMjJLQmlLb25EYk83ZGhtR0RncnVaM21ZenRjQi9HTm10 +WGpUNWJISVBIZXNPQ2s1RG5idEpPCkNvWVExbEhWejA2empyRXNYNzRjZ0owN2QxbzhnS003ZFBF +UTlWenJjV2V6TzlXTzRoelNPOEhKQVJDeUJINTlYdTAwUW9pYm1GVXcKbWpadENsQnFSVmxuRUg4 +eW5vRWRCNWJhc3hJMWFPdExNSFpnOFZwVCtRM1ZUaU9FK0l0WkJlUENoUXRsZm1BcWlvSkdvNkZW +cTFaVwpEMll2NGsvR016NXd2Tm94bk11ZlhlRjBMK2orQVNRK3EzWWFJY1JmekpyRDhQSHhLVzU4 +UzlFb0tSakhqaDJybVhTVnFPazVqTHpDClBEemY5aVJsU2dvdEdyWW9OYmJEelEvWXJKMFYrdlRh +QXc5SHc0SVR4VGRja2prTUlheW1SaS9jNjlTcEU3Ly8vanQ1ZVhuazUrZVQKbDVkbi9McXF5NXc3 +Z29UVENYVDI3RnlxV0FnYk9LK0ZNNkhRWFZheEZjSmVtTFdIa1pHUmdZZUhCNWN1bGI0S1Y2UFIw +S0tGT2grbwpOYjJIOGZLbWx5bFNpbmlqZitsYmljb2VoZzM2YkxNYlJnK0ZkNDlEUVVQWnd4RENT +bXIwTEttU0ZXYWRiZEk3L21ROGIvWi9VKzBZCnp1dGNNSnp0VWJ5WFVmcW1qRUlJRzdQNDB1Vkxs +eTZ4WWNNR05Cb05rWkdScXUxZDFMUXIyVmM0ZlBFd3ZXN3ZwWFlVNTdabFZ2RmUKeGk2MWd3Z2hM +RnA4Y1BueTVZU0hoNU9Ra01EMjdkc0pEdzgzWHFOUjIyeEsyVVR2TzNwVHoxWGQrM0E0dlpLOURP +dmUxRkVJVVFVVwo3V0g4KzkvL1p1dldyWGg1ZVFIRnA5dEdSa2J5OE1NUDEwZzROVzFNMmNqQWpy +STZyVjNZOGc4WXZZYWNnaHpxdTlaWE80MFFUc3VpClBZem16WnVUbloxdGZKNmRuVTN6NXMydEhz +b2V4SitJWjBESEFXckhFQURudXNNNVdMcEx6cGdTUWsxbUZZekpreWN6ZWZKa1dyWnMKU2ZmdTNi +bnZ2dnNZTm13WXdjSEJ0R3paMHVKQkRRWURmbjUrK1BqNHNIRGh3bkxiSlNjbjQrcnF5cmZmZm12 +eEdOV1JjaVdGYTNuWAo2TnFxcTAzSEZSWFF3MXUvdmtWT1FZN2FTWVJ3V21ZZGt1cmV2YnZ4b3Iz +QmcvOTNUK3NISG5pZ1NrdG1USmt5aGJpNE9MeTl2WW1NCmpHVDA2TkdsenNBcUxDemtoUmRlSUNv +cXl1YW5VOGFmTE42N2tPVkE3TWc1MExiUjh1SHVENWtVT2tudE5FSTRKYk1LeHZqeDQ2MDIKWUVa +R0JnQVJFUkVBREJvMGlLU2tKS0tqbzAzYUxWeTRrQkVqUnBDY25HeTFzYzBWZnpLZUlUNURiRDZ1 +cU5pc3ZyUDQyNWQvNCsvQgpmNWU1RENGVVlORWNSbloyTnF0WHIyYml4SW1NSGoyYU1XUEdNR2JN +R0lzR1RFNU94dGZYMS9qYzM5K2Z4TVJFa3pabnpweGg5ZXJWClBQMTA4ZjBuYlBtWGZtRlJJWnRT +TnNuOGhSM3EwYllIMmpaYS9ydjd2MnBIRWNJcFdYU1cxTXN2djR4R28ySERoZzA4Ly96ekxGKysK +bkx2dnZ0dnFvWjU5OWxuZWZQTk40OVdJRlIyU21qMTd0dkZyblU2SFRxZXIxdGk3eiszR3E3RVh0 +elc1clZyOWlKcFJzcGZ4ZVBEagpzcGNoaEpuMGVqMTZ2YjdhL1ZoMHg3M2c0R0IyNzk1Tmx5NWRP +SGp3SUJrWkdRd1lNTUNpdzBZWkdSbm9kRHIyN05rREZFK29SMFZGCm1SeVM2dGl4bzdGSVhMcDBp +WVlORzdKMDZWS0dEUnRtR3I0R2xnWjVZK3NiL0huOVQrWkh6YSt3blN3Tll2dXhTMzdXUTFZTVlm +QmQKZzNrbTlCa3pzd2doYmxhaml3K1djSE56QTZCSGp4NnNXN2VPQ3hjdWtKTmoyVmtySmN1TUdB +d0dVbE5UaVkrUEp5d3N6S1ROeVpNbgpTVWxKSVNVbGhSRWpSckJreVpKU3hhS21iRHk1VVE1SDJT +VlhOQm9OR28yRzljK3RaOUtYazlDNGFveXZsVHlhTkttZHAza0xZUThzCk9pVDF6RFBQY09YS0Zh +Wk9uY3JNbVRNNWMrWU1yNzc2cXNXRHpwOC9uNWlZR1BMejg0bU5qY1hUMDVPNHVEZ0FZbUppTE83 +UFd2SUsKODloeFpnZDk3dWlqV2daUm5nS01leUpuZ1F2UkVCd055Uk5OV21WbHlabHRRdFFVaXc1 +SndmL1drZ0tJakl4VWRVRkNheCtTU2ppZAp3RE0vUE1QdW1OMW1qVjJiRHZjNFhNYmJkc0NEdzR0 +WHNpMnNaOUpPVnJVVm9tSTJPU1IxODFwU2lZbUo5T3JWcTFhdEpXVTRaYUNQCnQreGRPSVF6b1hD +aEcyaVhxWjFFQ0tkaDBSNUdVRkFRUC8zMFU2bTFwUGJ1M1Z0akFTdGk3VDJNNkJYUlBCYjBHTVA5 +aDVzMWRxMzkKNjczYTdXdzBkcGw3R2JLSElVUmxiTEtIVVp2WGtpb3NLdVRYUDM3bDdqdXNmNXF3 +cUNGblFvdnYveTE3R1VMWWhGbVQzcE1uVHdZdwpyaVZWY3UzRnRtM2JHRGl3ZHF6b3V2L1AvWGcx +OXFKMTQ5WnFSeEdXME0rQ0IwZkNuc2R1bWNzUVFsaGJsZGFTS3ZtNnFtdEoyYU90CnA3WVM0UjFC +a3liTnljcTZvblljWWE0ellmQm5GOUIrQkR1ZlVqdU5FTFdheFdkSkFlemF0UXVOUmtOd3NMcDN0 +YkhtSE1iSXIwY3kKck5Nd3hnYU5SZVlIcXR2T3htTzNTNFNSRDhLN3YwTmhmWm5ERUtJU05wbkRN +QmdNZE9yVWlaZGVlb2tYWDN5UlRwMDZzWFhyVm9zSAp0VGVLb21BNFpTRENPMEx0S0tJcTBuckNu +d0hRSTA3dEpFTFVhaFpkdVBmMjIyK3paczBhNCtLQlI0OGVaZnIwNmZUcDQ5aW5vdjUrCitYZnF1 +OWJIdTZtMzJsRkVWVzE4RXg0ZENPcWNzQ2VFVTdCb0QrUHk1Y3UwYmR2VytMeE5telpjdm56WjZx +RnN6WERLSUZkM083b0wKM2VCNEZQUldPNGdRdFpkRmV4aVBQdm9vMGRIUmpCdzVFa1ZSK1BiYmJ4 +azdkbXhOWmJNWk9SeFZTMngrRFdJKzVXeldXZHE2dDYyOAp2UkRDSW1aUGVpdUt3cmx6NXpoLy9q +enIxcTFEbzlFd1pNZ1F0RnB0VFdjc2w3VW12VHNzNk1BUFkzN0FyNldmaWhmazJlbUVjcFhhCnFU +ajJRQTFQVEg2Q0Q0WitZRWFmUWppbnFuNTJXbFF3dW5idHlvRURCeXdlcEtaWW8yQ2N6amhOOEFm +Qi9EbmpUK09LcC9KaFhOMTIKS281ZFgwUExWMXV5WmZ3Vy9GcjZtZEd2RU02bnhzK1MwbWcwaElX +RnNYNzllb3NIc1dkYi95aSsvcUsyWEUvaTlITGcrZDdQOCtJdgpMNnFkUkloYXg2Sko3NlNrSklZ +T0hZcVhseGRhclJhdFZxdjZ0UmpWSlJQZXRjK2swRW5zT2IrSFgvLzRWZTBvUXRRcUZrMTZyMTY5 +CnV0WmRGR1U0WmVESjdrK3FIVU5ZVVgzWCtyeDJ6MnM4Ri84Y3Z6NzJxK3c5Q21FbFp1MWg1T2Zu +czI3ZE9wWXVYY3JwMDZmcDJMRWoKZDkxMWwvSGhxQzVldjhpWnJETUV0ZzVVTzRxd3NvZTdQc3ox +L090OGYrUjd0YU1JVVd1WVZUQmVldWtsbGl4WlFzdVdMWG4xMVZlWgpQNy9pKzExWHhtQXc0T2Zu +aDQrUER3c1hMaXoxL3VyVnF3a01EQ1FvS0lqbzZHaUw3aGx1aVcxL2JLUFg3YjJvNDFLblJ2b1g2 +cW5qClVvZTNCcnpGaTcrOFNFRlJnZHB4aEtnZEZETUVCd2NyZVhsNWlxSW95cFVyVjVTSWlBaHov +bG01Z29LQ2xDMWJ0aWlwcWFsSzU4NmQKbFlzWEw1cThmKzNhTmVQWGVyMWU2ZE9uVDVuOW1CbS9Y +TS8rOUt6eWh1R05VbjJDWXNaRHJYYVNzYkoySllxS2lwUituL1JUM2s5Kwp2MXIvUHhHaXRxbnFa +NmRaZXhoRlJVVzR1YmtCMExScFV6SXpNNnRjb0RJeU1nQ0lpSWpBMjl1YlFZTUdrWlNVWk5LbVVh +TkdKdTNyCjE2OWY1ZkVxc3ZYVVZybkRYaTJtMFdoNGU4RGJ6Tmt5aCt0NTE5V09JNFRETTJ2U2U5 +KytmYmk3dXh1ZloyZG5HNTlyTkJxTENraHkKY3JKeExTb0FmMzkvRWhNVGlZNk9ObW4zM1hmZk1Y +WHFWSzVkdThhdVhidks3Vy8yN05uR3IzVTZIVHFkenF3Y21ibVpITGwwaEpDMgpJV1puRjQ3QXRm +UWs5M0JvdktZeEdFeGZkbmR2Um1hbTR5OXRJMFJsOUhvOWVyMisydjJZVlRBS0N3dXJQWkNsN3Iv +L2Z1Ni8vMzYrCit1b3IvdmEzdjdGbno1NHkyOTFjTUN5eC9mUjJ1cmZ0VGoxWHVlbE83VkpBcVF2 +OE5wMkVKMEpoMXlHNDNzcjRjbGFXbkQwbG5NT3QKZjB6UG1UT25TdjFZZEIyR05ZU0VoSERreUJI +ajg0TUhEOUt6Wjg5eTI0OGFOWXF6WjgrYTNCcldHa291MkJOTzRFcEgyUGN3NkdhcgpuVVFJaDJi +aTNkZEpBQUFjV1VsRVFWVHpndUhoNFFFVW55bVZtcHBLZkh3OFlXRmhKbTFPbkRoaHZON2poeDkr +b0h2MzdqUm8wTUNxCk9ReW5ERVRjSVFYRGFXeVpCWDdmUXB2ZGFpY1J3bUZaZE9HZXRjeWZQNStZ +bUJqeTgvT0pqWTNGMDlPVHVMamltOS9FeE1Td2F0VXEKUHYzMFU5emMzTkJxdGJ6OTl0dFdIVCtu +SUljOTUvWVFmbnU0VmZzVmRpeTdPZnp5QnR6N0RDejdGY3c3MzBNSWNaTXEzYUxWWGxSMQpBUzNE +S1FNemZwN0JqaWQybE5tbkxPeFgzWFpxamwxQk8wMFJQTlliZGo4QmV4NERySGVMWHlFY2lVMXUw +VnBiR0U0WjVIUmFaNlM0CndBK0xvUDlMMEVET2poTENVazVaTUxiK3NWWG1MNXpWdVdBNE5BTDZ2 +YXgyRWlFY2p0TVZqSUtpQWhKT0ozRDNIWGVySFVXb1pkTnIKNFBzZHRGRTdpQkNPeGVrS3hwNXpl +N2pENHc1YU5HeWhkaFNobHB4bThNdS9JQnFLbENLMTB3amhNSnl1WUNTa0pkRDdqdDVxeHhCcQor +MjBzRk1HeVBjdlVUaUtFdzNES2doSGVUazZuZFhxS0Mvd0EvN2ZwLzBpL2thNTJHaUVjZ3RNVmpN +UzBSSHEySy8vS2N1RkV6c09vCkxxUDR2MDMvcDNZU0lSeUNVeFdNODlmT2s1R1RRYWNXbmRTT0l1 +ekVxL2U4eXVxanEwaytVelAzWEJHaU5uR3FncEdVbGtSWXV6QmMKTkU3MWJZc0tOSzNmbExjR3ZN +WEVIeVpTV0dUN1JUYUZjQ1JPOWNtWmtKWkF6OXZrY0pRdzlXaTNSMm5vMXBCM2s5NVZPNG9RZHMy +cApDb2JNWDRpeWFEUWFsZzFieHV0YlgrZm9wYU5xeHhIQ2JqbE53U2dvS21EWHVWMkUzaGFxZGhS +aGgrNXNmaWR6ZEhNWXYzcThISm9TCm9oeE9VVENhTkdtTzIyMXVYRHR6amVZTm02UFJhTXA5Q09m +MWRNalROSEJ0d055RXVXcEhFY0l1T1VYQnlNcTZBdTBXUTlvRWlsY3kKcmVnaG5KV0x4b1ZsOXkz +ajM5di96Y0UvRDZvZFJ3aTc0eFFGQTRCMmlaQW04eGVpWXUyYnR1ZjFmcTh6N3Z0eDVCZm1xeDFI +Q0x1aQpTc0V3R0F6NCtmbmg0K1BEd29VTFM3Mi9mUGx5QWdNRENRd01aTXlZTVJ3N2RxejZnMHJC +RUdaNkl2Z0pXalJzd1Z1L3ZxVjJGQ0hzCmlpbzNVTkpxdFN4WXNBQnZiMjhpSXlQWnRtMGJucDZl +eHZjVEVoTHc5L2ZIdzhPRFR6NzVoSTBiTi9MWlo1K1Y2c2ZjbTRCb0dtcmcKV1hkNDh3b29kU3By +amQzZCtNZHV4cTV0R2QyQWdyTGZhZ0xFQUorQys0MW1aR2JLL1RORTdlRXdOMURLeU1nQUlDSWlB +bTl2YndZTgpHa1JTVXBKSm0vRHdjT085djZPam85bXlaVXYxQm0wSG5Ba3hvMWdJNTFKQXVYTlpt +UXJFZndUM0I1SjE0NHFhSVlXd0d6WXZHTW5KCnlmajYraHFmKy92N2s1aVlXRzc3RHo3NGdLRkRo +MVp2MEhiSTRTaGh1YjNqSU9OMmtIdHRDUUdBcTlvQktySng0MFkrLy94enRtL2YKWG02YjJiTm5H +Ny9XNlhUb2RMclNqZG9CU2JKQ3JiQ1VCdForQURGdDBhZnEwYlhYcVIxSWlDclI2L1hvOWZwcTky +UHpPWXlNakF4MApPaDE3OXV3QllQTGt5VVJGUlJFZEhXM1NidCsrZlR6d3dBUDg5Tk5QM0hYWFhX +WDJaYzV4dUNLbGlEb3YxWUYzLzRRYkxjMUk2QWpICjNpVmo5ZHRaMExhamhqWVQyN0RyeVYyMGNa +ZmI5QW5INXpCekdDVnpFd2FEZ2RUVVZPTGo0d2tMQ3pOcDg4Y2ZmekI4K0hDV0wxOWUKYnJFdzEr +R0xoK0VHWmhZTEljcHdFbUs2eHpCNjFXZ0tpc3FaSkJmQ0NhaHlXdTM4K2ZPSmlZbGh3SUFCVEp3 +NEVVOVBUK0xpNG9pTAppd1BnMVZkZjVmTGx5enoxMUZOb3RWcENRNnUrbkVkaVdpS2tXU3U1Y0ZZ +dlI3eE0zVHAxZVdYeksycEhFVUkxcXB4V2F5M203Rlk5CnNmWUpQbnp0UTBoMndrTXBrdEZxZlNx +S3dzWHJGK24rUVhjV1J5OW1TS2NoWm80aGhQMXhtRU5TdHBad09rSDJNSVJWdEd6VWtpOUgKZk1u +amF4NG45V3FxMm5HRXNMbGFYVEF5Y2pLS2Y3RXZxSjFFMUJhOWJ1L0ZDNzFmWU9UWEk4a3R5RlU3 +amhBMlZhc0xSdkxaWklMYgpCRU9SMmtsRWJUSzE1MVJ1YjNJNzAzNmVwbllVSVd5cVZoZU1oTk1K +Y3NNa1lRV3VKa3ZndTdpNDhOMjQ3MWk4WVRHYXdQKzkzcVJKCmM3V0RDbEdqYW5YQlNEd2pkOWdU +MWxER0VpSzVDbnk1RHlKYmd2Y1dRQ2xlUmwrSVdxeldGZ3hGVWVTV3JLSm0vZGtWVmkySGtTT2gK +NVNHMTB3aFI0MnB0d1RoKytUaU42emFtclh0YnRhT0kydXprUUloL0d4NitGeHFySFVhSW1sVnJD +MFpDbXN4ZkNCdjViUnpzZmh3ZQpocXpjTExYVENGRmphbTNCU0V4THBPZHRVakNFalJoZWhyUHc0 +RGNQeXAzNlJLMVZ1d3VHN0dFSW05SEFldENnNGVuMVQxZnBLbG9oCjdGMnRMQmpYODY1ek5QMW84 +VFVZUXRoS0Vhd2N1Wkk5NS9md1Q4TS8xVTRqaE5YVnlvS3g4K3hPdXJicVNqM1hlbXBIRVU2bWNk +M0cKckIrem5tVjdsN0ZveHlLMTR3aGhWWFo5QTZXcWtzTlJRazFlamIzWU5IWVQvVDd0UjE1aEhs +UERwNm9kU1FpcnFKVjdHSWxuRWdsdgpKM2ZZRStycDBLd0RXOFp2WWZIT3hmeHI2Ny9VamlPRVZk +UzZnaUVYN0FsN2NZZkhIV3dadjRWUDkzM0tMUDBzbVFnWERxL1dGWXhUCkdhZUE0bDlXSWRUVzFy +MHQrbkY2dmozOExTLys4cUlVRGVIUVZDa1lCb01CUHo4L2ZIeDhXTGh3WWFuM2p4dzVRbmg0T1BY +cjEyZnUKM0xrVzlWMnlkNkhSYUt3VlY0aHFhZDI0Tlp2SGJXYkRpUTFNKzNtYUZBM2hzRlFwR0ZP +bVRDRXVMbzZOR3pleWFORWlMbDI2WlBKKwppeFl0V0xod0lUTm16TEM0NzhRMG1iOFE5c2V6b1Nl +YnhtN2kxejkrWmVJUEV5a3NLbFE3a2hBV3MzbkJ5TWpJQUNBaUlnSnZiMjhHCkRScEVVbEtTU1p1 +V0xWdlNvMGNQM056Y0xPNWZsZ1FSNmpGZEJ2M1dSL09HelVtZW5NelNWUjh5NUlzaFhNMjVxblpn +SVN4aTg0S1IKbkp5TXI2K3Y4Ym0vdnorSmlZbFc2VHVuSUljRGZ4NmdlNXZ1VnVsUENNdVVzUXg2 +R2N1aUYzNVN3RjNON3lMc3d6Q09YanFxWGx3aApMT1R3MTJITW5qM2IrSFZMLzViNGV2clNxRzRq +OVFJSlVaa2lXRGg0SVV0M0xhWFBSMzM0NUcrZk1OaG5zTnFwUkMybTErdlI2L1hWCjdzZm1CU01r +SklUbm5udk8rUHpnd1lORVJVVlZ1YitiQzhhOGhIbjBiQ3lIbzRSamVLTDdFL2kxOUdQazF5T1pI +ajZkNmVIVDVXUU4KVVNOME9oMDZuYzc0Zk02Y09WWHF4K2FIcER3OFBJRGlNNlZTVTFPSmo0OG5M +Q3lzekxhV25rMlNrSllnSzlRS2gzTDNIWGVUOVBjawpWdXhmd2Rqdng1SlRrS04ySkNIS3BWRlVP +TWR2eTVZdFBQWFVVK1RuNXhNYkcwdHNiQ3h4Y1hFQXhNVEVjUDc4ZVVKQ1Fzak16TVRGCnhRVjNk +M2NPSFRwRTQ4YW1kNmpSYURRbVJlV09lWGZ3eTloZjhHbmhVNnBkOFRGa2M1amJWcTEyYW80dEdh +M1Y3dFpmdXh2NU4zaHMKOVdNY1N6L0dwL2QvU2tDckFEUDZFYUpxYnYzc05QdmZxVkV3ck9YbWIv +cE01aGtDM3cvazRuTVhTKzNXUzhHd2RUczF4M2FNakdYOQoyaW1Ld29lN1ArU2xUUzh4STN3R00z +ck5vSTVMSFRQNkU4SXlUbHN3alB3QUxiQ2l2TmIyL3lFaUdXM1pUczJ4Sy81bFRiMmF5b1RWCkU4 +Z3R5T1hqdjMxTXB4YWR6T2hUQ1BOVnRXRFVncVZCL2pwZHNkME1TSHZ0Zjg5TkhrSTRqdlpOMi9Q +TDJGOTRLT0FoZXYyM0YrOG0KdlV1UlVxUjJMQ0ZxUThINFM3dEVTSk1KYjFFN3VHaGNpQTJMWmZ2 +ajIvbnl3SmYwLzdRL3h5OGZWenVXY0hLMW8yQzQ1RU9iUFhBbQpWTzBrUWxoVnB4YWQyRHBoSzlF +KzBmVDhzQ2RUTjB6bGN2Wmx0V01KSjFVN0NrYnJmWENsQStRMlVUdUpFR2FvZUFtUm14OU5talNu +Cmprc2RadlNhd2NHSkI4a3R5S1h6ZTUxNUorRWRjZ3R5MWY1R2hKT3BIUVhqOWdRNUhDVWNpQmxM +aVB6MXlNcTZZdnhYclJ1M1puSDAKWWd6akRlaFQ5Zmd0OG1QbHdaV3krcTJ3bVZwd2xwUUNEendD +S2YxZ3oyUGx0Y1FSenB5UmpMWnNwK2JZbG1VczcxZDBjOHBtWnNUUAp3TTNGamYvcjgzOUVkNHJH +UlZNNy9nWVVOY3VKVDZ0VklQWXUrR0lOWFBRdnJ5VzE3VU5FTWxhM25acGpXNmRnQUJRcFJhdzh1 +SkovCmIvODMxL091TTdYblZCNE5mSlNHYmczTjdGODRvNm9XRElkZmZKQkdmMExEUzNESnQvSzJR +amdjVjdQV2wycnMzcFIxKzc1bmJzSmMKWHRuOENrLzFlSXBuUXA2aGRlUFdOc2dvbklYajc3L2Vs +bFI4ZHBUaStOK0tFS1daTjk5eExlc3FmZHYzWmMzb05XeWRzSldMTnk3aQp1OGlYOGQrUFoxUEtK +cmxoazdBS3h6OGsxZThsS0hJRmZVV3JMOWErd3hTU3NicnQxQnk3WmpMZStxdDg2Y1lsUHQ3N01W +OGMrSUp6CldlY1lGVENLTVFGajZORzJoNnlLNitTY2R3NWpiRC9ZUGdPT1YzUS9BZWY5RUpHTTlq +aTJiUXJHelk1Y09zSVhCNzVneGY3aXRYUEcKZEIzRDZJRFIrSHJLb1Z4bjVMd0Y0MFYzbUo4SzJj +MHJhb216Zm9oSVJuc2MyL1lGbzRTaUtPdzh1NU12RG56Qmx3ZStwRW05Smd6bwpPSUQrSGZxamE2 +K2pXWU5tWnVZU2pzeDVDOGFrenZEZWtjcGE0cXdmSXBMUkhzZXVpWXh1Rk05M1ZNemR2Um1abWNW +WGloY3BSZngyCi9qYzJudHpJTHltLzhPdnBYL0h6OURNV2tONTM5S2ErYTMwemN3cEg0cndGNDIv +ajRQdVBLMnVKYzM2SVNFYjdIRnZkak9YOXl1Y1cKNUpLWWxzakdsSTM4Y3ZJWDl2KzVuKzV0dWhQ +Y0pwZ2dyeUNDdklMdzgvVERyWTZibWRtRnZYTGVndEZqQ2V4OHFyS1d5SWVJTGR1cApPYlprckt5 +ZHViL3ltYm1aSkp4T1lPLzV2ZXk5c0plOTUvZHk2dW9wZkQxOWpRVWt5Q3VJd05hQmVOVDNNS3RQ +WVI4Y3FtQVlEQVppClltSW9LQ2dnTmphV3laTW5sMnJ6NG9zdjh0VlhYOUdzV1RPV0wxK09yMi9w +eVRtTlJnTmVlK0I4VUNVanF2MGhzaG5RV2FrL1M4ZTIKcEoyZWluUGFRMGFvT0tka3JKamxoNjV1 +ZGozdk9nZitQR0JTUlBaZjJFOTkxL3A0Ti9XbWZkUDJ4UStQNHYrV3ZOYWtYdlhXZWRQcgo5U2Iz +cExaWGpwTFRvUzdjbXpKbENuRnhjWGg3ZXhNWkdjbm8wYVB4OVBRMHZyOWp4dzYyYnQzS3pwMDcy +YkJoQXpObXpHRGR1blZsCmQvYW5JOXpLVWsvbEJjTWU2SkdjMXFMSFBqT1dYTmRSWXZaZkQxTlpX +V1dmZHR1b2JpUEMyb1VSMWk3TStKcWlLRnk4Y1pIVXE2bWMKdW5xSzFLdXBIRWsvd2s4bmZqSytW +cmRPWGRvM2JjL3RIcmZqMmRDVEZnMWEwS0pCQzVvM2FFNkxocVcvcnVkYXoyUmNSL2tnZHBTYwpW +V1h6Z3BHUmtRRkFSRVFFQUlNR0RTSXBLWW5vNkdoam02U2tKRWFNR0VIejVzMFpQWG8wTDcvOGN2 +a2RGam4reGVwQzJCL3pyakF2CjVnYmtWOWppZXNQcjVMWXQ0T1UxTDVOK0k1MzA3T0xIc2N2SFNM +K1J6dVhzeThXdi9mVzFXeDIzNHFMU3NMaVFuRGx3aHFPcmpsTGYKdFQ0TlhCdlF3SzFCOFg5di92 +cXYvOVozclYvcXRaTC8xbk90UngxTkhlcTQxTUZGNDBJZHpWLy8vZXU1cUpqTlAyMlRrNU5ORGkv +NQorL3VUbUpob1VqQjI3TmpCbzQ4K2FuemVzbVZMVHB3NHdaMTMzbW5UckVJNHIxdjNSQ3BpeHVH +d0czRGp1QnZEL1lkWDJsdGo5NmFjCnZmZ0g2ZGwvRlpJYjZmeDN4MzhaMm1rbzJmblpaQmRrazUy +ZlRVNUJEdGZ6cjNNcCs1TEo2emUvZit0cnVZVzVGQllWVXFRVVVhajgKOWQraVFncVY0aXZoeXlv +aVpUMHY3NzMwNUhTK1hmSnRtVzFkTkM1b0tDN0NOeGRqdFY2ckNydjg4MXhSbEZMSDE4ci9SczNk +QUpacwpLR3YzT2Vldmg3WDZzNlN0cGUwcXkya1BHYUhpbkpMUnNuYmw1YXlKakpXN2xuV1ZKdlZM +ejNsOHRlZ3JxNDFSbnFLLy9sY2RGMys0CmFLVTA5c2ZtQlNNa0pJVG5ubnZPK1B6Z3dZTkVSVVda +dEFrTEMrUFFvVU5FUmtZQ2NQSGlSVHAyN0ZpcUx3Yyt3VXNJSVJ5T3pRL2EKZVhnVW4zNW5NQmhJ +VFUwbFBqNmVzTEF3a3paaFlXR3NXcldLOVBSMFZxeFlnWitmbjYxakNpR0V1SVVxaDZUbXo1OVBU +RXdNK2ZuNQp4TWJHNHVucFNWeGNIQUF4TVRHRWhvWnk5OTEzMDZOSEQ1bzNiODdubjMrdVJrd2ho +QkEzVSt6Y2xpMWJGRjlmWCtXdXUrNVMzbjMzCjNUTGJ6Snc1VStuUW9ZTVNIQnlzSEQ1ODJNWUpp +MVdXYy9QbXpVcVRKazJVb0tBZ0pTZ29TSG50dGRkc25uSENoQWxLcTFhdGxJQ0EKZ0hMYjJNTzJy +Q3luUFd4TFJWR1VQLzc0UTlIcGRJcS92Ny9TdDI5Zlpmbnk1V1cyVTN1Ym1wTlQ3VzJhbloydGhJ +YUdLb0dCZ1VwWQpXSmp5emp2dmxObE83VzFwVGs2MXQrWE5DZ29LbEtDZ0lHWElrQ0Zsdm0vcDly +VDdnaEVVRktSczJiSkZTVTFOVlRwMzdxeGN2SGpSCjVQMmtwQ1NsZCsvZVNucDZ1ckppeFFvbE9q +cmFMbk51M3J4WkdUcDBxQ3JaU2hnTUJtWDM3dDNsZmhEYnk3YXNMS2M5YkV0RlVaUnoKNTg0cGUv +YnNVUlJGVVM1ZXZLaDA2TkJCeWN6TU5HbGpEOXZVbkp6MnNFMnZYNyt1S0lxaTVPVGtLRjI2ZEZG +Ky8vMTNrL2Z0WVZzcQpTdVU1N1dGYmxwZzdkNjR5WnN5WU12TlVaWHZhOVluSE4xK3o0ZTN0YmJ4 +bTQyYTNYck54K1BCaHU4d0o2ay9TOStuVGgyYk55bCtOCjFCNjJKVlNlRTlUZmxnQmVYbDRFQlJX +dk11RHA2VW1YTGwzWXVYT25TUnQ3MktibTVBVDF0Mm5EaHNXM2xiMTI3Um9GQlFYVXEyZDYKOFo0 +OWJFdW9QQ2VvdnkwQjB0TFMrT0dISC9qNzMvOWVacDZxYkUrN0xoamxYYk54c3gwN2R1RHYvNzk3 +ZVpkY3MyRkw1dVRVYURScwozNzZkb0tBZ3BrMmJadk9NNXJDSGJXa09lOXlXeDQ4ZjUrREJnNFNH +aHBxOGJtL2J0THljOXJCTmk0cUtDQXdNcEhYcjFreWFOSW5iCmI3L2Q1SDE3MlphVjViU0hiUWt3 +ZGVwVS92M3ZmK1BpVXZiSGZGVzJwMTBYREhNb0ZsMnpvWjdnNEdCT256NU5jbkl5L3Y3K1RKa3kK +UmUxSXBjaTJySnFzckN4R2pSckZ2SG56YU5Tb2tjbDc5clJOSzhwcEQ5dlV4Y1dGMzM3N2plUEhq +N040OFdMMjdObGo4cjY5Yk12SwpjdHJEdGx5M2JoMnRXclZDcTlXV3U3ZFRsZTFwMXdVakpDU0VJ +MGYrZDYrTGd3Y1Awck5uVDVNMkpkZHNsQ2p2bW8yYVpFNU9kM2QzCkdqWnNpSnViRzQ4Ly9qakp5 +Y25rNXViYU5HZGw3R0ZibXNPZXRtVitmajdEaHcvbjBVY2Y1Yjc3N2l2MXZyMXMwOHB5MnRNMmJk +KysKUGZmZWUyK3B3N3Iyc2kxTGxKZlRIcmJsOXUzYldiTm1EUjA2ZEdEMDZORnMyclNKc1dQSG1y +U3B5dmEwNjRMaEtOZHNtSlB6d29VTAp4bXErZHUxYXVuWHJWdWF4VHpYWnc3WTBoNzFzUzBWUmVQ +enh4d2tJQ09EWlo1OHRzNDA5YkZOemNxcTlUUzlkdXNUVnExY0JTRTlQCjUrZWZmeTVWMk94aFc1 +cVRVKzF0Q2ZER0cyOXcrdlJwVWxKUytQTExMK25YcngrZmZ2cXBTWnVxYkUrN1hCcmtabzV5elVa +bE9iLzUKNWh1V0xGbUNxNnNyM2JwMVkrN2N1VGJQT0hyMGFMWnMyY0tsUzVlNC9mYmJtVE5uRHZu +NStjYU05ckl0Szh0cEQ5c1M0TmRmZitYegp6eituVzdkdWFMVmFvUGdYOVk4Ly9qQm10WWR0YWs1 +T3RiZnB1WFBuR0RkdUhJV0ZoWGg1ZVRGanhnemF0R2xqZDcvcjV1UlVlMXVXCnBlUlFVM1czcDBQ +ZlFFa0lJWVR0MlBVaEtTR0VFUFpEQ29ZUVFnaXpTTUVRUWdoaEZpa1lRZ2doekNJRlExaVZpNHNM +TTJiTU1ENy8KejMvK3c1dzU1dHc4eW5wME9oMjdkKzhHSURvNm1zek16R3IxcDlmckdUcDBxTm12 +MThSWU5lbnMyYk9NSERuU3BtTUt4eVFGUTFoVgozYnAxK2U2NzcwaFBUd2NzdnhLM3NMQ3cyaGx1 +SG5QOSt2VTBhVkw2N20zaWY5cTJiY3ZYWDMrdGRnemhBS1JnQ0t0eWMzUGp5U2VmClpONjhlYVhl +TzN2MkxGT21UQ0V3TUpDcFU2ZHk0Y0lGQU1hUEg4KzBhZE1JQ3d2amhSZGVZTUtFQ1V5ZlBwM1Ew +RkE2ZCs3TW5qMTcKZVBMSkorblNwUXV6Wjg4MjlqZHg0a1JDUWtMbzFhc1hTNWN1TFROUCsvYnRT +VTlQNS8zMzMwZXIxYUxWYXVuUW9RUDkrdlVEaXRjQgpHenQyTEdGaFljeWNPZE40Ulc1eWNqTDkr +L2RIcTlXeVljT0dTci92N094czNubm5IZnIyN1V0MGREUjZ2UjZBOFBCd2s2dHBTL1orCmNuSnl5 +bXhmbnRPblR6TjQ4R0NDZ29JSURBemt4SWtUcEthbTR1L3Z6K09QUDQ2Zm54OXo1c3d4NW4vdHRk +Y0lEUTBsSkNTRU45NTQKdzZTZjZkT25vOVZxNmQ2OU95a3BLYVNtcHRLMWExY0FQdjc0WXg1NjZD +SHV2ZmRlQWdJQ2VQZmRkNDMvOXFlZmZpSThQSnpRMEZDZQpmZlpaSmsrZVhDcm4zcjE3NmQrL1Aw +RkJRUVFIQjNQdDJyVkt0NTF3SU5WWk9sZUlXelZ1M0ZqSnpNeFUycmR2cjJSa1pDai8rYzkvCmxO +bXpaeXVLb2loVHAwNVYzbjc3YlVWUkZPV05OOTVRbm4vK2VVVlJGR1hjdUhGSzM3NTlqVXR1ang4 +L1hoazhlTENTbTV1cmZQengKeDByanhvMFZ2VjZ2NU9ibUtuNStmc2FsNHk5ZnZxd29pcUxrNXVZ +cVlXRmh5clZyMXhSRlVSU2RUcWZzMnJWTFVSUkZhZCsrdlpLZQpubTdNbDUrZnIvVHAwMGRadDI2 +ZHNlM1ZxMWNWUlZHVTU1OS9Ydm55eXk4VlJWR1VidDI2S1VsSlNjcTFhOWVVcUtpb01wZUgzcng1 +CnMvRStBeDk5OUpHeVlNRUNSVkVVNWZ6NTgwcG9hS2lpS0lveWI5NDhaZGFzV1lxaUtNclpzMmVW +enAwN1Y5ais1ajV2Tm12V0xPWEQKRHo4MGZnL1oyZGxLU2txS290Rm9sRysvL1ZiSnljbFJIbmpn +QWVXYmI3NHgyVFlGQlFYSzBLRkRsU05IamhpMzlhSkZpNHpiN2NhTgpHMHBLU29weEtmbVBQdnBJ +YWRXcWxYTDI3RmtsTXpOVGFkZXVuWktYbDZmazUrY3I3ZHUzVjFKU1VwVDA5SFFsT0RoWW1UeDVj +cW1jCjQ4YU5Velp1M0tnb1N2RXk0QVVGQmFYYUNNY2xleGpDNnR6ZDNSazdkcXpKWDZjQVAvNzRJ +NDg5OWhnQWp6LytPR3ZYcmdXS0R5R04KR0RFQ2QzZDNZOXNSSTBaUXQyNWR3c1BEYWRxMEtYMzc5 +cVZ1M2Jwb3RWcmpTc0R4OGZGRVIwZWoxV281ZWZJa216WnRxalJiYkd3cwovZnYzSnpvNm1sMjdk +bkhnd0FGME9oMWFyWloxNjlaaE1CZzRjK1lNaXFJUUdocEtvMGFOR0RWcVZLWExWYTlhdFlxbFM1 +ZWkxV3FKCmlvcml3b1VMcEtTazhPQ0REL0xOTjk4QXNITGxTdU5jUVZudFQ1NDhXVzcvSVNFaHpK +OC9uN2ZlZW92TGx5OVR2MzU5b0hoWm12dnYKdjU5Njllb3hldlJvZnZycEp3QjI3dHpKOE9IRDZk +YXRHN3QzNytibm4zOG1MeStQelpzMzg4UVRUd0RGaHc4Yk5HaFFhcXhCZ3diUgpwazBiM04zZDhm +ZjNaL2Z1M1NRbUp0SzFhMWZhdDI5UDgrYk5HVFpzV0puYkpEdzhuSmt6Wi9MZWUrOVJVRkJBblRw +MUt2MlpDTWRoCjkwdURDTWYwN0xQUEVod2N6SVFKRTB4ZUwrK0R0MDJiTmliUFM5Ym5xbHUzTGsy +Yk5qVytYcmR1WGZMeThzakt5bUxtekpsczNicVYKMjI2N2pmdnZ2NThyVjY1VW1Pbmpqei9tOU9u +VExGNjhHQ2hlcGpvZ0lJRE5temVidEV0TFN6UHZtN3hKVVZFUml4WXRJaUlpb3RSNwpMVnEwWVAv +Ky9heGN1ZEs0TkVONTdVdVc2N2hWZEhRMDNidDM1L1BQUDZkMzc5NTgvZlhYSnR1bFJNbjh6ZVRK +ay9ubW0yOElDQWhnCjZ0U3BYTGx5QlkxR1UrWUtwYmU2ZFh2bjVPVGc2dXBxTWpkVVhoOHhNVEVN +SERqUXVCUkpVbElTclZ1M3JuQTg0VGhrRDBQVWlHYk4KbXZIZ2d3L3kzLy8rMS9oQmMrKzk5L0xK +SjU5UVZGVEVzbVhMR0Rac1dKWDZWaFNGcTFldjR1Ym1ocGVYRjhlT0hlT1hYMzZwOE4vcwoycldM +dVhQbjh0bG5ueGxmQ3drSjRjS0ZDOFk5bHV2WHIvUDc3Ny9UcmwwNzZ0U3BRM0p5TXRldlgyZmx5 +cFdWWmhvelpneHhjWEZrClpXVUJtQ3g1UFdyVUtONTY2eTB5TXpNSkNBaW90SDFaVWxKU2pHc1g5 +ZS9mM3pndmtwR1J3ZmZmZjA5dWJpNWZmZlVWVVZGUjVPVGsKa0pXVlJmdjI3VGx6NWd5clY2OEdp +dWVYN3JubkhwWXVYWXFpS09UbTVwS2RuVjNwOTZiUmFPalpzeWY3OSs4bk5UV1Z5NWN2czI3ZAp1 +akpQYURoeDRnUWRPM2JrSC8vNEI3Nit2blp4cnhKaFBWSXdoRlhkL0NFeWZmcDBMbDI2Wkh3K1k4 +WU0vdmpqRDdSYUxSY3VYR0RhCnRHbGwvcnRibjVmMTN1MjMzODd3NGNNSkNBaGcwcVJKNVo2S1d2 +Slg5YUpGaTdoeTVRcjMzSE1QV3EyV0o1OThFb0RQUHZ1TUpVdVcKMEsxYk4zcjE2c1hSbzBjQitP +Q0REM2p4eFJlNSsrNjdDUXdNTFBQRFVhUFJHRjhmTVdJRW9hR2hSRVpHRWhBUXdLeFpzNHp0Um93 +WQp3VmRmZmNXRER6NW84bHBaN1cvdTgyWXJWNjRrSUNDQWtKQVFidHk0WWV6TDE5ZVhOV3ZXRUJR +VVJFQkFBTkhSMGRTdlg1K1pNMmNTCkdocktxRkdqdVBmZWU0Mzl2UDc2Nnh3L2ZwekF3RUI2OSs1 +dFBQR2daTXp5eHE5VHB3N3Z2ZmNlbzBhTklpb3FpcTVkdTlLaFE0ZFMKN1JZc1dFRFhybDBKRFEz +RjE5ZVhYcjE2bGZsekVZNUpGaDhVd2tHbHBxWXlkT2hROXUvZmI1UHhybCsvVHFOR2pjakl5R0RJ +a0NGOAorT0dIZE83YzJTWmpDL3NnY3hoQ09EQmIzbkZ1OXV6WmJOeTRFVGMzTng1NTVCRXBGazVJ +OWpDRUVFS1lSZVl3aEJCQ21FVUtoaEJDCkNMTkl3UkJDQ0dFV0tSaENDQ0hNSWdWRENDR0VXYVJn +Q0NHRU1Ndi9BMkdrMllXcWd3ZTFBQUFBQUVsRlRrU3VRbUNDCg== + + + + + + + +
176 docs/examples/newparallel/rmt/rmt.py
 @@ -1,56 +1,146 @@ -#------------------------------------------------------------------------------- -# Driver code that the client runs. -#------------------------------------------------------------------------------- -# To run this code start a controller and engines using: -# ipcluster -n 2 -# Then run the scripts by doing irunner rmt.ipy or by starting ipython and -# doing run rmt.ipy. - -from rmtkernel import * -import numpy +# 2 + +# + +# # Eigenvalue distribution of Gaussian orthogonal random matrices + +# + +# The eigenvalues of random matrices obey certain statistical laws. Here we construct random matrices +# from the Gaussian Orthogonal Ensemble (GOE), find their eigenvalues and then investigate the nearest +# neighbor eigenvalue distribution $\rho(s)$. + +# + +from rmtkernel import ensemble_diffs, normalize_diffs, GOE +import numpy as np from IPython.parallel import Client +# -def wignerDistribution(s): +# ## Wigner's nearest neighbor eigenvalue distribution + +# + +# The Wigner distribution gives the theoretical result for the nearest neighbor eigenvalue distribution +# for the GOE: +# +# $$\rho(s) = \frac{\pi s}{2} \exp(-\pi s^2/4)$$ + +# + +def wigner_dist(s): """Returns (s, rho(s)) for the Wigner GOE distribution.""" - return (numpy.pi*s/2.0) * numpy.exp(-numpy.pi*s**2/4.) + return (np.pi*s/2.0) * np.exp(-np.pi*s**2/4.) +# -def generateWignerData(): - s = numpy.linspace(0.0,4.0,400) - rhos = wignerDistribution(s) +def generate_wigner_data(): + s = np.linspace(0.0,4.0,400) + rhos = wigner_dist(s) return s, rhos - -def serialDiffs(num, N): - diffs = ensembleDiffs(num, N) - normalizedDiffs = normalizeDiffs(diffs) - return normalizedDiffs +# + +s, rhos = generate_wigner_data() + +# + +plot(s, rhos) +xlabel('Normalized level spacing s') +ylabel('Probability $\rho(s)$') + +# + +# ## Serial calculation of nearest neighbor eigenvalue distribution + +# + +# In this section we numerically construct and diagonalize a large number of GOE random matrices +# and compute the nerest neighbor eigenvalue distribution. This comptation is done on a single core. + +# + +def serial_diffs(num, N): + """Compute the nearest neighbor distribution for num NxX matrices.""" + diffs = ensemble_diffs(num, N) + normalized_diffs = normalize_diffs(diffs) + return normalized_diffs + +# + +serial_nmats = 1000 +serial_matsize = 50 + +# + +%timeit -r1 -n1 serial_diffs(serial_nmats, serial_matsize) +# -def parallelDiffs(rc, num, N): +serial_diffs = serial_diffs(serial_nmats, serial_matsize) + +# + +# The numerical computation agrees with the predictions of Wigner, but it would be nice to get more +# statistics. For that we will do a parallel computation. + +# + +hist_data = hist(serial_diffs, bins=30, normed=True) +plot(s, rhos) +xlabel('Normalized level spacing s') +ylabel('Probability $P(s)$') + +# + +# ## Parallel calculation of nearest neighbor eigenvalue distribution + +# + +# Here we perform a parallel computation, where each process constructs and diagonalizes a subset of +# the overall set of random matrices. + +# + +def parallel_diffs(rc, num, N): nengines = len(rc.targets) num_per_engine = num/nengines print "Running with", num_per_engine, "per engine." - ar = rc.apply_async(ensembleDiffs, num_per_engine, N) - return numpy.array(ar.get()).flatten() - - -# Main code -if __name__ == '__main__': - rc = Client() - view = rc[:] - print "Distributing code to engines..." - view.run('rmtkernel.py') - view.block = False - - # Simulation parameters - nmats = 100 - matsize = 30 - # tic = time.time() - %timeit -r1 -n1 serialDiffs(nmats,matsize) - %timeit -r1 -n1 parallelDiffs(view, nmats, matsize) - - # Uncomment these to plot the histogram - # import pylab - # pylab.hist(parallelDiffs(rc,matsize,matsize)) + ar = rc.apply_async(ensemble_diffs, num_per_engine, N) + diffs = np.array(ar.get()).flatten() + normalized_diffs = normalize_diffs(diffs) + return normalized_diffs + +# + +client = Client() +view = client[:] +view.run('rmtkernel.py') +view.block = False + +# + +parallel_nmats = 40*serial_nmats +parallel_matsize = 50 + +# + +%timeit -r1 -n1 parallel_diffs(view, parallel_nmats, parallel_matsize) + +# + +pdiffs = parallel_diffs(view, parallel_nmats, parallel_matsize) + +# + +# Again, the agreement with the Wigner distribution is excellent, but now we have better +# statistics. + +# + +hist_data = hist(pdiffs, bins=30, normed=True) +plot(s, rhos) +xlabel('Normalized level spacing s') +ylabel('Probability $P(s)$') +
36 docs/examples/newparallel/rmt/rmtkernel.py
 @@ -2,43 +2,41 @@ # Core routines for computing properties of symmetric random matrices. #------------------------------------------------------------------------------- -import numpy -ra = numpy.random -la = numpy.linalg +import numpy as np +ra = np.random +la = np.linalg def GOE(N): """Creates an NxN element of the Gaussian Orthogonal Ensemble""" m = ra.standard_normal((N,N)) m += m.T - return m + return m/2 -def centerEigenvalueDiff(mat): +def center_eigenvalue_diff(mat): """Compute the eigvals of mat and then find the center eigval difference.""" N = len(mat) - evals = numpy.sort(la.eigvals(mat)) - diff = evals[N/2] - evals[N/2-1] - return diff.real + evals = np.sort(la.eigvals(mat)) + diff = np.abs(evals[N/2] - evals[N/2-1]) + return diff -def ensembleDiffs(num, N): - """Return an array of num eigenvalue differences for the NxN GOE - ensemble.""" - diffs = numpy.empty(num) +def ensemble_diffs(num, N): + """Return num eigenvalue diffs for the NxN GOE ensemble.""" + diffs = np.empty(num) for i in xrange(num): mat = GOE(N) - diffs[i] = centerEigenvalueDiff(mat) + diffs[i] = center_eigenvalue_diff(mat) return diffs -def normalizeDiffs(diffs): +def normalize_diffs(diffs): """Normalize an array of eigenvalue diffs.""" return diffs/diffs.mean() -def normalizedEnsembleDiffs(num, N): - """Return an array of num *normalized eigenvalue differences for the NxN - GOE ensemble.""" - diffs = ensembleDiffs(num, N) - return normalizeDiffs(diffs) +def normalized_ensemble_diffs(num, N): + """Return num *normalized* eigenvalue diffs for the NxN GOE ensemble.""" + diffs = ensemble_diffs(num, N) + return normalize_diffs(diffs)