ktongue/GoogleDriveTongue / Colab Notebooks /numeric_methods.ipynb
ktongue's picture
download
raw
52.2 kB
{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyNlKqpv3ASn/44I/wkCGJ3z"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","source":["!git clone https://github.com/strawhat04/ADE-python.git"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"PQXglTlfXsgg","executionInfo":{"status":"ok","timestamp":1765306902010,"user_tz":-60,"elapsed":2457,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"89a5cca5-5031-41f4-998f-580613de5679"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["Cloning into 'ADE-python'...\n","remote: Enumerating objects: 317, done.\u001b[K\n","remote: Counting objects: 100% (317/317), done.\u001b[K\n","remote: Compressing objects: 100% (204/204), done.\u001b[K\n","remote: Total 317 (delta 146), reused 277 (delta 110), pack-reused 0 (from 0)\u001b[K\n","Receiving objects: 100% (317/317), 16.61 MiB | 17.66 MiB/s, done.\n","Resolving deltas: 100% (146/146), done.\n"]}]},{"cell_type":"code","source":["ls"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tSyAzC8efeyo","executionInfo":{"status":"ok","timestamp":1765306928476,"user_tz":-60,"elapsed":111,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"c7851ddf-8923-4421-a873-c4a4cae1dd17"},"execution_count":11,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[0m\u001b[01;34mADE-python\u001b[0m/ \u001b[01;34msample_data\u001b[0m/\n"]}]},{"cell_type":"code","source":["cd ADE-python/"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zW1aiyZWfie2","executionInfo":{"status":"ok","timestamp":1765306943144,"user_tz":-60,"elapsed":9,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"8c7124a8-4c43-4218-eff5-116ccb5b372b"},"execution_count":12,"outputs":[{"output_type":"stream","name":"stdout","text":["/content/ADE-python\n"]}]},{"cell_type":"code","source":["%ls"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"q9i0p2c1fnRD","executionInfo":{"status":"ok","timestamp":1765306960819,"user_tz":-60,"elapsed":118,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"1226278c-7b2f-46f1-cd9d-3ac85a859288"},"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["README.md \u001b[0m\u001b[01;34mstructured_grid\u001b[0m/ \u001b[01;34munstructured_Grid\u001b[0m/\n"]}]},{"cell_type":"code","source":["%%writefile EqDiscretization.py\n","import numpy\n","import math\n","\n","#this function returns normal of face of elements with the sign\n","def fnormal(MeshCoordi, facenodes, centroid):\n","\t[x1,y1]=MeshCoordi[facenodes[0]]\n","\t[x2,y2]=MeshCoordi[facenodes[1]]\n","\n","\t[xg1 ,yg1]=centroid[0]\n","\t[xg2 , yg2]=centroid[1]\n","\n","\t#since face normal have 2 directions, this condition checks the outward vector\n","\t#thi condition check whether cos() betwwen [-(y2-y1),x2-x1] and vector from current mess to neighbouring cell\n","\t#if its value is positive means acute angle hence outward angle\n","\tif numpy.array([-(y2-y1),x2-x1]) @ numpy.array([xg2-xg1,yg2-yg1]) >0:\n","\t\treturn numpy.array([-(y2-y1),x2-x1])\n","\telse:\n","\t\treturn numpy.array([(y2-y1),-(x2-x1)])\n","\n","#this function compute area of face by taking face points\n","def fArea(MeshCoordi,facenodes):\n","\n","\t[x1,y1]=MeshCoordi[facenodes[0]]\n","\t[x2,y2]=MeshCoordi[facenodes[1]]\n","\n","\treturn math.hypot(x1-x2,y1-y2)\n","\n","#advection flux coeff\n","def F(rho, v, MeshCoordi,facenodes,centroid):\n","\treturn -rho*(v @ fnormal(MeshCoordi,facenodes,centroid))\n","\n","#diffusion flux coeff\n","def gDiff(MeshCoordi,facenodes, centroid):\n","\t#gdiff = area of face/ distanec between centroid of face [ this is for non-skew elements ]\n","\t[xg1 ,yg1]=centroid[0]\n","\t[xg2 , yg2]=centroid[1]\n","\t#fArea compute area of face and function hypot finds distance between two points\n","\treturn fArea(MeshCoordi,facenodes)/math.hypot(xg1-xg2,yg1-yg2)\n","\n","#Power law advection scheme\n","def funA(F,D):\n","\tif D==0:\n","\t\treturn 0\n","\telse:\n","\t\treturn max(0,(1-0.1*abs(F/(D)))**5 )\n","\n","#this function will only work for pygmsh, for different module you need to change algo to find the mesh element face location\n","def get_Bcondition(MeshCoordi,c_cell,c_ni_faceNodes,cellCentroid):\n","\t#input the boundary condition here, as in array of face1, face2, face3......\n","\tphif=numpy.array([5,0,0,0])\n","\t#specify type of boundary conditon\n","\t#'d' > dicirchelt 'n' > neumann\n","\tbc='d'\n","\t#cordinates of boundary face of current cell\n","\t[bp1,bp2]=c_ni_faceNodes\n","\t#check which face this belongs\n","\n","\t#find the boundary index of the face by searching point in boundary array\n","\tfor bindx in range(len(bfaceArray)):\n","\t\tif (bp1 in bfaceArray[bindx,:]) and (bp2 in bfaceArray[bindx,:]):\n","\t\t\tbreak\n","\n","\t#find the face index on which the boundary faces laying\n","\tfor i in range(bindx+1):\n","\t\tif bfaceArray[i,0] in [0,1,2,3]:\n","\t\t\tfindx=bfaceArray[i,0]\n","\n","\n","\tif bc=='d':\n","\t\t#computing boundary flux for Dirichlet conditon\n","\t\tDb=gamma*gDiff(MeshCoordi,c_ni_faceNodes,[cellCentroid[c_cell], (MeshCoordi[bp1]+MeshCoordi[bp2])/2])\n","\t\tAb=F(rho,numpy.array([ux,uy]),MeshCoordi,c_ni_faceNodes,[cellCentroid[c_cell], (MeshCoordi[bp1]+MeshCoordi[bp2])/2])\n","\t\tfmat=(Db*funA(Ab,Db) + max(Ab,0))\n","\n","\t\tbmat=(Db*funA(Ab,Db) + max(Ab,0))*phif[findx]\n","\n","\t\t#print(\"incell\",c_cell,phif[findx],bmat)\n","\n","\tif bc=='n':\n","\t\t#computing boundary flux for Neumann condition\n","\t\tfmat=0\n","\t\tbmat=phif[findx]*fArea(MeshCoordi, c_ni_facenodes)\n","\n","\treturn fmat, bmat\n","\n","class linMatrix:\n","\t#this function compute transient value of scalar for ADE equation at t step\n","\t#dt is time step and ph0 is t-1 calue\n","\t@staticmethod\n","\tdef get_linMatrix(pymesh, custom_mesh, dt, phi0):\n","\t\tglobal gamma, rho, ux, uy\n","\t\tgamma=0\n","\t\trho=1\n","\t\tux,uy=[1,0]\n","\n","\n","\t\tMeshCells=pymesh.cells[1].data\n","\t\tMeshCoordi=pymesh.points[:,0:2]\n","\t\tneighbourID=custom_mesh.neighCellID\n","\t\tcommonFace=custom_mesh.commonFaceID\n","\t\tcellCentroid = custom_mesh.centroid\n","\t\tcellvolume=custom_mesh.volume\n","\t\tcellFaceID=pymesh.cellFaceID\n","\t\tglobal bfaceArray\n","\t\tbfaceArray=pymesh.cells[0].data\n","\t\tglobal fface\n","\t\tfface=len(pymesh.cells[2].data)\n","\n","\t\ttotalMeshCells=len(MeshCells)\n","\t\tfluxMat=numpy.zeros((totalMeshCells, totalMeshCells))\n","\t\tbMat=numpy.zeros((totalMeshCells,1))\n","\n","\t\t#loop over all control volume elements, to discretize the eqaution\n","\t\t#c_cell = current cell index of mesh\n","\t\tfor c_cell in range(totalMeshCells):\n","\t\t\t#this n_index variable to track the neighbour elements and common face\n","\t\t\t#NOTE the squential order of neighbour cell array is same as order of common face array\n","\t\t\t#like for ei [ep, eq, el] are neighbouring elements and [fp,fq,fl] are face share by ei cell, so fp face is shared by ei and ep and fq face is share by ei and eq , so on\n","\t\t\tn_index=0\n","\t\t\t#loop over each neighbouring elements\n","\t\t\tflag=1\n","\t\t\tfor n_cell in neighbourID[c_cell]: #n_cell neighbouring cell index\n","\n","\t\t\t\t#c_ni_faceNodes gives cordinates index of common face between current cell and 1st neighbouring cell\n","\t\t\t\t# like if c_ni_facenodes is [6,8] this means 6 and 8th node\n","\t\t\t\tc_ni_faceNodes=cellFaceID[commonFace[c_cell,n_index]]\n","\t\t\t\t#this will handle the boundary cell elements\n","\t\t\t\tif n_cell == None:\n","\t\t\t\t\tfluxMat[c_cell,c_cell], bMat[c_cell]=get_Bcondition(MeshCoordi,c_cell,c_ni_faceNodes,cellCentroid)\n","\t\t\t\t\tflag=0\n","\n","\t\t\t\t#non boundary elements\n","\t\t\t\telse:\n","\n","\t\t\t\t\t#D is diffusion flux contribution\n","\t\t\t\t\tD=gamma*gDiff(MeshCoordi,c_ni_faceNodes,[cellCentroid[c_cell],cellCentroid[n_cell]])\n","\t\t\t\t\t#A is advection flux contribution\n","\t\t\t\t\tA=F(rho,numpy.array([ux,uy]),MeshCoordi,c_ni_faceNodes,[cellCentroid[c_cell], cellCentroid[n_cell]])\n","\t\t\t\t\t#General scheme by Patankar\n","\t\t\t\t\tfluxMat[c_cell,n_cell]=-(D*funA(A,D) + max(A,0))\n","\t\t\t\t\t#print(\"face\",c_cell, c_ni_faceNodes, A)\n","\t\t\tn_index+=1\n","\n","\t\t\t#if flag==1:\n","\t\t\t#\tbMat[c_cell]+=rho*cellvolume[c_cell]*phi0[c_cell]/dt\n","\t\t\tbMat[c_cell]+=rho*cellvolume[c_cell]*phi0[c_cell]/dt\n","\n","\t\t\tfluxMat[c_cell,c_cell]+= -( numpy.sum(fluxMat[c_cell,:]) - fluxMat[c_cell,c_cell] ) + rho*cellvolume[c_cell]/dt\n","\n","\t\t#print(fluxMat)\n","\t\treturn fluxMat, bMat"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"WKU_A-K1f4B8","executionInfo":{"status":"ok","timestamp":1765307300036,"user_tz":-60,"elapsed":59,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"aabce327-7462-41e3-f748-9e6759b4edfc"},"execution_count":23,"outputs":[{"output_type":"stream","name":"stdout","text":["Writing EqDiscretization.py\n"]}]},{"cell_type":"code","source":["%%writefile MeshProcessing.py\n","#Mesh Class to coumpute different attribute of Mesh Topology like storing neighbouring elements, faces of each mesh cells\n","#\n","\n","import numpy\n","\n","class MeshTopoogy:\n","\n","\t#initiate instances\n","\tdef __init__(self, mesh):\n","\t\tprint(\"in class\")\n","\t\tself.MeshCells=mesh.cells[1].data\n","\t\tself.Bnodes=mesh.cells[0].data\n","\t\tself.MeshNodeCoordi=mesh.points[:,0:2]\n","\t\tself.cellFaceID=mesh.cellFaceID\n","\n","\t\tself.BoundaryFace = []\n","\t\tself.neighCellID=[]\n","\t\tself.commonFaceID=[]\n","\n","\t\tself.TotalMeshElement=len(self.MeshCells)\n","\t\t#these are buffere list to store temporary elements later\n","\t\tself.buff=[]\n","\t\tself.buff2=[]\n","\n","\t\tself.centroid=numpy.zeros((self.TotalMeshElement, 2))\n","\t\tself.volume=numpy.zeros((self.TotalMeshElement))\n","\n","\t\tself.xcordi=numpy.zeros((3))\n","\t\tself.ycordi=numpy.zeros((3))\n","\n","\n","\tdef get_neighbourCELL(self):\n","\t\t# now to store neighnbouring element, we'll loop over all mesh elemeents first\n","\t\tfor i in range(self.TotalMeshElement):\n","\t\t\t#loop over the each face of the ith element\n","\t\t\tfor j in range(len(self.MeshCells[i,:])):\n","\t\t\t\t#searching the face points of the ith mesh elements [Pi1,Pi2] with every elements face points\n","\t\t\t\tfor k in range(self.TotalMeshElement):\n","\t\t\t\t\t# we are checking the index(ID) of mesh element which have both p1 point and p2 point present\n","\t\t\t\t\tif (self.MeshCells[i,j] in self.MeshCells[k,:]) and (self.MeshCells[i,j-1] in self.MeshCells[k,:]):\n","\t\t\t\t\t\t# avoiding the storing ID of itself and\n","\t\t\t\t\t\tif k!=i : #and k not in self.buff\n","\t\t\t\t\t\t\tself.buff.append(k)\n","\t\t\t\t\t\t\tbreak\n","\n","\t\t\t\t\t#if those [p1,p2] is not shared by any other element this means it's a boundary element\n","\t\t\t\t\tif k==self.TotalMeshElement-1:\n","\t\t\t\t\t\tself.buff.append(None)\n","\n","\t\t\t\t#same algorithm as bove to store common faceID\n","\t\t\t\tfor l in range(len(self.cellFaceID)):\n","\t\t\t\t\tif (self.MeshCells[i,j] in self.cellFaceID[l,:]) and (self.MeshCells[i,j-1] in self.cellFaceID[l,:]):\n","\t\t\t\t\t\tself.buff2.append(l)\n","\t\t\t\t\t\tbreak\n","\n","\t\t\t\t# for m in range(len(self.Bnodes)):\n","\t\t\t\t# \tif (self.MeshCells[i,j] in self.cellFaceID[m,:]) and (self.MeshCells[i,j-1] in self.cellFaceID[m,:]):\n","\t\t\t\t# \t\tif m not in self.BoundaryFace:\n","\t\t\t\t# \t\t\tself.BoundaryFace.append(m)\n","\n","\t\t\t#https://ask.sagemath.org/question/25998/why-does-append-overwriteclobber-every-existing-element-of-a-list-with-the-one-that-was-just-appended/\n","\n","\t\t\tself.neighCellID.append(self.buff[:])\n","\t\t\tself.commonFaceID.append(self.buff2[:])\n","\n","\t\t\tself.buff.clear()\n","\t\t\tself.buff2.clear()\n","\n","\t\t\t#This part will compute the mesh data\n","\t\t\tfor m in range(len(self.MeshCells[i,:])):\n","\t\t\t\t#store ith mesh coordinates in xcordi and y cordi array\n","\t\t\t\t[self.xcordi[m], self.ycordi[m]] = self.MeshNodeCoordi[self.MeshCells[i,m]]\n","\n","\t\t\t\tself.centroid[i]=[numpy.sum(self.xcordi)/3, numpy.sum(self.ycordi)/3]\n","\t\t\t\t#in 2D its equal t area of mesh, by vector product for finding area for triangle\n","\t\t\t\tself.volume[i]=0.5*abs(self.xcordi[0]*(self.ycordi[1]-self.ycordi[2])+self.xcordi[1]*(self.ycordi[2]-self.ycordi[0])+self.xcordi[2]*(self.ycordi[0]-self.ycordi[1]))\n","\n","\n","\t\tself.neighCellID=numpy.array(self.neighCellID)\n","\t\tself.commonFaceID=numpy.array(self.commonFaceID)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"1ZIs8cB2f-vJ","executionInfo":{"status":"ok","timestamp":1765307300707,"user_tz":-60,"elapsed":32,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"abdb7cdb-00fa-49cd-b80d-2ec4fed22ea8"},"execution_count":24,"outputs":[{"output_type":"stream","name":"stdout","text":["Writing MeshProcessing.py\n"]}]},{"cell_type":"code","source":["# !apt-get update\n","# !apt-get install -y libglu1-mesa\n","# !pip install pygmsh\n","import numpy as np\n","import pygmsh\n","from MeshProcessing import MeshTopoogy\n","from EqDiscretization import linMatrix\n","from scipy import linalg\n","import matplotlib.pyplot as plt\n","from matplotlib.animation import FuncAnimation\n","\n","#this function is to give unique ID to every face of triangular elemental mesh\n","def meshcellFaceID(mesh):\n","\tcells=mesh.cells[1].data\n","\t#inititalizing list to store cell Face\n","\tcellFaceID = []\n","\n","\t#first loop at every cell element\n","\tfor i in range(len(cells)):\n","\t\t#loop over all 3 sides of triangular element\n","\t\tfor j in range(3):\n","\t\t\t#keep adding those list of two points making triangular elemental side and avoid repeatation\n","\t\t\tif [ cells[i,j-1], cells[i,j]] and [cells[i,j], cells[i,j-1]] not in cellFaceID:\n","\t\t\t\t#print(\"in if\")\n","\t\t\t\tcellFaceID.append([cells[i,j-1], cells[i,j]])\n","\n","\t#return after converting list of face ID into numpy array\n","\treturn np.array(cellFaceID)\n","\n","\n","with pygmsh.geo.Geometry() as geom:\n"," geom.add_polygon(\n"," [\n"," [0.0, 0.0],\n"," [0, 1],\n"," [1.0, 1],\n"," [1, .0],\n"," ],\n"," mesh_size=0.1\n"," )\n"," pymesh= geom.generate_mesh()\n","\n","\n","print(\"\\n---------------\\n\")\n","print(pymesh.points)\n","\n","pymesh.cellFaceID=meshcellFaceID(pymesh)\n","\n","print(dir(pymesh))\n","# print(pymesh.cells)\n","# print(\"\\n--------sorting cell:1-------------\\n\")\n","\n","mtopo = MeshTopoogy(pymesh)\n","mtopo.get_neighbourCELL()\n","\n","# print(\"neighbour element\",mtopo.neighCellID)\n","# print(\"centroid\",mtopo.centroid)\n","\n","\n","# print(\"boundary face\", mtopo.BoundaryFace)\n","lin=linMatrix()\n","\n","runtime=1.2\n","dt=0.05\n","\n","phi=0*np.ones((int(runtime/dt)+1,len(mtopo.centroid)))\n","\n","#phi[0,6]=phi[0,25]=phi[0,21]=phi[0,1]=2\n","\n","fluxMat, bMat=lin.get_linMatrix(pymesh,mtopo,dt, np.zeros((len(mtopo.centroid))))\n","# print(\"flux mat\", fluxMat)\n","# print(\"bMat\", bMat)\n","\n","for t in range(len(phi[:,0])-1):\n","\tfluxMat, bMat=lin.get_linMatrix(pymesh,mtopo,dt, phi[t,:])\n","\tphi[t+1,:]=np.transpose(np.linalg.solve(fluxMat,bMat))\n","# \tprint(\"bmat\", bMat)\n","\n","\n","# print(phi[-1,:])\n","# print(np.max(phi))\n","\n","# print(phi.shape)\n","pmax=np.max(phi)\n","pmin=np.min(phi)\n","\n","\n","pymesh.field_data=phi[-1,:]\n","print(pymesh.field_data)\n","pymesh.write(\"out.vtk\")\n","fig = plt.figure()\n","axis = plt.axes(xlim=(0, 1), ylim=(0,1))\n","\n","plot1=axis.tricontour(mtopo.centroid[:,0],mtopo.centroid[:,1], phi[1,:], levels=16, linewidths=0.05, colors='k')\n","cntr = axis.tricontourf(mtopo.centroid[:,0],mtopo.centroid[:,1], phi[1,:], levels=16, cmap ='OrRd', vmin=pmin,vmax=pmax)\n","fig.colorbar(cntr, ax=axis)\n","axis.plot(mtopo.centroid[:,0],mtopo.centroid[:,1], 'ko', ms=3)\n","\n","\n","print(\"Animating\")\n","def animate(t):\n"," axis.clear()\n"," plot1=axis.tricontour(mtopo.centroid[:,0],mtopo.centroid[:,1], phi[t,:], levels=16, linewidths=0.05, colors='k')\n"," cntr = axis.tricontourf(mtopo.centroid[:,0],mtopo.centroid[:,1], phi[t,:], levels=16,cmap ='OrRd')\n","# fig.colorbar(cntr, ax=axis)\n"," axis.set_title(\"Pure advection, Source at x=0amd vx=1, vy=0\\nat t:(%f) seconds\"%(dt*t))\n","vis=FuncAnimation(fig,animate,frames=range(0,len(phi)), interval=200,repeat=False)\n","vis.save('mtp1.gif', writer='imagemagick')\n","#mesh3=meshplex.MeshTri(pymesh.points, pymesh.cells[1].data)\n","#mesh3.show()\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"_WXLsby6gCGe","executionInfo":{"status":"ok","timestamp":1765307441023,"user_tz":-60,"elapsed":5072,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"730f3116-3502-4ece-adb6-f60f1f600d07"},"execution_count":26,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","---------------\n","\n","[[0. 0. 0. ]\n"," [0. 1. 0. ]\n"," [1. 1. 0. ]\n"," [1. 0. 0. ]\n"," [0. 0.1 0. ]\n"," [0. 0.2 0. ]\n"," [0. 0.3 0. ]\n"," [0. 0.4 0. ]\n"," [0. 0.5 0. ]\n"," [0. 0.6 0. ]\n"," [0. 0.7 0. ]\n"," [0. 0.8 0. ]\n"," [0. 0.9 0. ]\n"," [0.1 1. 0. ]\n"," [0.2 1. 0. ]\n"," [0.3 1. 0. ]\n"," [0.4 1. 0. ]\n"," [0.5 1. 0. ]\n"," [0.6 1. 0. ]\n"," [0.7 1. 0. ]\n"," [0.8 1. 0. ]\n"," [0.9 1. 0. ]\n"," [1. 0.9 0. ]\n"," [1. 0.8 0. ]\n"," [1. 0.7 0. ]\n"," [1. 0.6 0. ]\n"," [1. 0.5 0. ]\n"," [1. 0.4 0. ]\n"," [1. 0.3 0. ]\n"," [1. 0.2 0. ]\n"," [1. 0.1 0. ]\n"," [0.9 0. 0. ]\n"," [0.8 0. 0. ]\n"," [0.7 0. 0. ]\n"," [0.6 0. 0. ]\n"," [0.5 0. 0. ]\n"," [0.4 0. 0. ]\n"," [0.3 0. 0. ]\n"," [0.2 0. 0. ]\n"," [0.1 0. 0. ]\n"," [0.91339746 0.45 0. ]\n"," [0.46057428 0.09236793 0. ]\n"," [0.08660254 0.55 0. ]\n"," [0.54684029 0.91522172 0. ]\n"," [0.91339746 0.65 0. ]\n"," [0.6509202 0.0888543 0. ]\n"," [0.35 0.91339746 0. ]\n"," [0.08190749 0.34753036 0. ]\n"," [0.75867257 0.91037039 0. ]\n"," [0.91386933 0.2508173 0. ]\n"," [0.07959226 0.7459788 0. ]\n"," [0.25 0.08660254 0. ]\n"," [0.84081744 0.09056972 0. ]\n"," [0.9153228 0.84957626 0. ]\n"," [0.0846772 0.15042374 0. ]\n"," [0.15059323 0.91705026 0. ]\n"," [0.9134761 0.35013622 0. ]\n"," [0.82680803 0.4000227 0. ]\n"," [0.8267971 0.50000378 0. ]\n"," [0.74019493 0.45000441 0. ]\n"," [0.74019317 0.55000137 0. ]\n"," [0.65359039 0.50000096 0. ]\n"," [0.65396241 0.39966603 0. ]\n"," [0.56741324 0.44928903 0. ]\n"," [0.56705838 0.54988166 0. ]\n"," [0.48046759 0.49986178 0. ]\n"," [0.48041041 0.59995724 0. ]\n"," [0.4808333 0.39920299 0. ]\n"," [0.39387078 0.44984413 0. ]\n"," [0.39442612 0.35080141 0. ]\n"," [0.56700342 0.64997315 0. ]\n"," [0.48366093 0.70445422 0. ]\n"," [0.39433252 0.65073524 0. ]\n"," [0.48078198 0.29894171 0. ]\n"," [0.30730176 0.40010759 0. ]\n"," [0.30717968 0.3 0. ]\n"," [0.30721478 0.49999195 0. ]\n"," [0.22057714 0.45 0. ]\n"," [0.57013032 0.75161248 0. ]\n"," [0.65411636 0.70026427 0. ]\n"," [0.39872547 0.75353581 0. ]\n"," [0.30717968 0.7 0. ]\n"," [0.65358984 0.8 0. ]\n"," [0.73860545 0.74714341 0. ]\n"," [0.22057714 0.55 0. ]\n"," [0.30475361 0.81098105 0. ]\n"," [0.22156276 0.74877374 0. ]\n"," [0.82688886 0.3001627 0. ]\n"," [0.82969818 0.19940892 0. ]\n"," [0.74105788 0.2499286 0. ]\n"," [0.74316015 0.14949391 0. ]\n"," [0.65348636 0.19674299 0. ]\n"," [0.55968916 0.14750647 0. ]\n"," [0.56475852 0.24613965 0. ]\n"," [0.47388352 0.20061255 0. ]\n"," [0.38038865 0.16295818 0. ]\n"," [0.56725585 0.34887324 0. ]\n"," [0.82679541 0.60000086 0. ]\n"," [0.65289839 0.8994184 0. ]\n"," [0.08660254 0.65 0. ]\n"," [0.44947338 0.9157741 0. ]\n"," [0.48998173 0.81679561 0. ]\n"," [0.08393457 0.44985 0. ]\n"," [0.91339791 0.55000077 0. ]\n"," [0.0840733 0.24718938 0. ]\n"," [0.17940395 0.18563431 0. ]\n"," [0.25089114 0.91324698 0. ]\n"," [0.65369235 0.60002024 0. ]\n"," [0.91371835 0.74992938 0. ]\n"," [0.22883274 0.3492007 0. ]\n"," [0.39391263 0.55006506 0. ]\n"," [0.74003294 0.64957169 0. ]\n"," [0.82655742 0.69944089 0. ]\n"," [0.30729898 0.60013204 0. ]\n"," [0.81830244 0.81504074 0. ]\n"," [0.22057714 0.65 0. ]\n"," [0.74078296 0.34996408 0. ]\n"," [0.65355067 0.29855243 0. ]\n"," [0.91787246 0.15306788 0. ]\n"," [0.85087185 0.91675371 0. ]\n"," [0.14988755 0.08296629 0. ]\n"," [0.29408424 0.18905757 0. ]\n"," [0.09385434 0.84409339 0. ]\n"," [0.38845736 0.25039524 0. ]\n"," [0.34935128 0.07972804 0. ]\n"," [0.2 0.83805312 0. ]\n"," [0.399279 0.84069289 0. ]\n"," [0.16339993 0.28982612 0. ]\n"," [0.74697956 0.06578359 0. ]\n"," [0.15358984 0.7 0. ]\n"," [0.15358984 0.6 0. ]\n"," [0.15358984 0.5 0. ]\n"," [0.15537362 0.39773453 0. ]\n"," [0.73014428 0.83259619 0. ]\n"," [0.55 0.06525626 0. ]\n"," [0.58268812 0.83660964 0. ]\n"," [0.23598906 0.26138726 0. ]\n"," [0.92679492 0.92679492 0. ]\n"," [0.92679492 0.07320508 0. ]\n"," [0.07320508 0.92679492 0. ]\n"," [0.07320508 0.07320508 0. ]\n"," [0.14971984 0.77537981 0. ]]\n","['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cellFaceID', 'cell_data', 'cell_data_dict', 'cell_data_to_sets', 'cell_sets', 'cell_sets_dict', 'cell_sets_to_data', 'cells', 'cells_dict', 'copy', 'field_data', 'get_cell_data', 'get_cells_type', 'gmsh_periodic', 'info', 'point_data', 'point_data_to_sets', 'point_sets', 'point_sets_to_data', 'points', 'read', 'write']\n","in class\n"]},{"output_type":"stream","name":"stderr","text":["WARNING:matplotlib.animation:MovieWriter imagemagick unavailable; using Pillow instead.\n"]},{"output_type":"stream","name":"stdout","text":["[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -0. 0. 0. 0. 0. -0. 0.\n"," 0. 0. 0. 0. 0. 0. 0. 0.]\n","Animating\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 2 Axes>"],"image/png":"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cmWTlZVljPnfurZ//36n8devX28kmfXr1zvK7rjjDiPJzJ4926nuvHnzjCQzZcoUl37kLOMvv/zSSDKLFi1yen316tW5ll/q0vXMGGMWL15sJJmNGzc6yl5++eVc5ycvWVlZpkWLFiY4ONikpKSY2NhYU6JECfPtt9861evTp4+RdMXh4s/jBx984NK/HN26dTMhISGXnb8tW7YYSebtt992lOW8X1FRUY5la4wxTZs2NTabzTz22GOOsvPnz5uKFSs69Sln/X3ppZec6rVs2TLPz8DFhg8fbjw9Pc2ff/7pKDt79qwJCAgwDz30kEtdDw8Ps3HjRseymDZtmlOdnPnJz5AXd9/zvOT3u6dHjx4mLCzM8Rkyxpjt27e7LL+4uLh8zdfF3y8530UXv+c5hg0bZiQ5feehcBXbPReRkZFOf1eqVEmLFi1yJGN3denSxelX3J9//qkvvvhCY8eOVXp6utMviKioKMXFxenIkSOXnV7JkiUd///rr7+UlZWlli1bavHixY7ynLQ9aNAgp3GffPJJvffee05l0dHRWrx4sTZs2KC7775b0oVdltnZ2YqOjna738uXL1eDBg1y/aVus9nyXlh5WLVqlex2u8u8PPXUU1q2bJk+++wzPfHEE47yyMhIxy93Sapfv778/Py0b98+t6ctXdj71LhxY82bN08rVqzQihUr9PTTT+uuu+7S22+/7XivVq1apcaNG6tFixaOcX19fTVgwAANHz5cO3fudOwFcoe3t7f69evnVLZ8+XKVK1dOAwcOdKmfs4w/+OAD+fv765577lFKSorj9YYNG8rX11fr169Xz54985zuxevZmTNnlJGR4Th5dfv27Y49Tu7y8PDQggUL1KBBA7Vt21bfffednnvuOZdfjv/5z3/04IMPXrG9nF+gkhyHBLy9vV3q+fj4OB0yuHj+zp07p7S0NN18880KCAjQ9u3b1bt3b6fx+/fv77T+NmnSRFu2bFH//v0dZXa7XY0aNdK2bdscZatWrVKJEiX073//26newIED9eWXX15x/qKjozVp0iR9+OGHjml9/vnnOnHihOPzmWP06NH65JNP1KdPH2VkZOiOO+5w+dxERUVp7dq1V5zu9ZCf7x7pwmGtxYsXa/369Y56ixYtUsmSJdWlSxenehd//vJy8Xt/pXUmp05ur+P6K7bhYsaMGapevbpKlCih4OBg1ahRQx4eV38KSZUqVZz+3rNnj4wxev755/X888/nOs6xY8cuGy4++eQTjR8/XgkJCTp79qyj/OIvvoMHD8rDw8NpIytJNWrUcGnv3nvvlb+/v5YuXer44C5dulQRERGqXr262/3eu3ev0wf+Wh08eFBhYWEux3tr1arleP1iFx83zVGmTJl8nWeQGw8PD8XGxio2NlZ//PGHvvrqK82ePVufffaZunfv7thAHDx4UE2aNHEZ/+J+Xk24qFChgstJwHv37lWNGjVUokTeH7XffvtNqampLueF5Dh27Nhlp/vnn39qzJgxWrJkiUvd1NTUfPY+d9WqVXOcr1G3bt1c16natWurdu3abrWbs9G4+HOR48yZMy4blUmTJmn+/Pk6cuSI03kSuc3fpetVzqGY8PBwl/KL17WDBw8qNDRUvr6+TvVy+yzmpkGDBqpZs6aWLl3qCBdLly5VuXLlHOeE5fDy8tK8efN02223ycfHx3G+wsVCQ0MVGhqar2kXtPx890jSPffco9DQUC1atEh33323srOztXjxYnXq1Mnpe6Fq1aqqWrWqW3240jpzcR0UvmIbLho3bpzrsbccNpvN5WQtSXmeLHXpSplzieXTTz+tqKioXMe5+eab85z+l19+qY4dO6pVq1aaOXOmQkND5enpqfnz57vskcgvb29vde7cWStWrNDMmTOVnJysr776ShMnTrSs39dTzrHlS+X2vrkrMDBQHTt2VMeOHdW6dWv997//1cGDBx3nZuRHXntv8rsO5Vd2drbKly+vRYsW5fp6XudF5HjggQe0efNmDRs2TBEREfL19VV2drbuvfdeSy4V/vzzzyVduCz5jz/+UEhIiNPrqampTnsa8uLl5aWyZctKkmOjefToUZd6R48eVVhYmOPvgQMHav78+XryySfVtGlT+fv7y2azqXv37rnOX17rVW7lVqxrF4uOjtaECROUkpKi0qVL6+OPP1aPHj1yDZdr1qyRdGHD+Ntvv7n8wDl9+nS+w+Gl74nV8vPdI11Yxj179tTcuXM1c+ZMffXVV/r9999d9mxlZGTk634mdrvdsf5faZ0pW7Ysey2KkGIbLq6kTJkyue5ev/TXc15yUrWnp6fLIZj8WL58uXx8fLRmzRqnFX7+/PlO9SpVqqTs7GzHL9wcu3fvzrXd6OhoLVy4UPHx8dq1a5eMMU67Jd3pd7Vq1ZyuMMmNO4dHKlWqpHXr1ik9Pd3pV8ovv/zieL0wNGrUSP/973919OhRVapUSZUqVcp1+V7az5zd+JdeLZDfdUi6sIy/+eYbnTt3Ls+TMqtVq6Z169apefPmbgeUv/76S/Hx8RozZoxGjRrlKP/tt99c6l7Noa7Zs2dr7dq1mjBhgiZNmqRHH31UH330kVOdwYMH53qVxKXuuOMOxxU2devWVYkSJfTdd9/pgQcecNTJzMxUQkKCU9myZcvUp08fvfLKK46yM2fOWH4zsEqVKik+Pl4ZGRlOey/y+izmJjo6WmPGjNHy5csVHBystLQ0de/e3aXejz/+qLFjx6pfv35KSEjQww8/rJ9++smxl0W6sGfg0sNsebE6JOXmSt89OWJiYvTKK6/o//7v//TZZ58pKCjI5YfO5MmTNWbMmCtOs1KlSo6rgipUqKCgoCB99913LvW2bt3qch8eFK4bNlxUq1ZNq1at0vHjxx3J94cfftBXX33lsns0N+XLl1fr1q31xhtvaODAgS67Jy9uNzd2u102m83pV+6BAwe0cuVKp3pt27bViBEj9Nprr2nGjBmO8mnTpuXabmRkpMqWLaulS5dq165daty4sdMvHnf63aVLF40dO1YrVqxwOe/CGCObzaabbrpJkusGNjft2rXTnDlzNH36dA0fPtxRPnXqVNlsNrVt2/aKbVytpKQk/fnnny675zMzMxUfHy8PDw/HHpt27dpp2rRp2rJli5o2bSrpwiW0c+bMUeXKlR1t5Byq2rhxo+OLKysry+U+GpfTpUsXffrpp5o+fbqGDBni9FrOMn7ggQc0c+ZMjRs3zuWX4Pnz55WRkZHnTa9yfo1funHJbf1x572ULlzeO2zYMHXp0kUjRoxQYGCgHnvsMb399ttOl6hezTkX/v7+ioyM1Lvvvqvnn3/eEUbfeecdZWRkqFu3bk7zeOn8vf7669d8yealctbfWbNmOS7bzcrK0uuvv57vNmrVqqV69epp6dKlCg4OVmhoqFq1auVU59y5c+rbt6/CwsL06quvav/+/brttts0ZMgQzZs3z1GvKJ1zIV35uydH/fr1Vb9+fb355pv6+uuv1adPH5c9N1dzzoV04fO0cOFCHTp0yPE9Hh8fr19//dXl84VCViinkV6DnDOoLz1j/VI7d+40Hh4e5tZbbzXTp083o0aNMuXLlzf16tXL9WqRl19+2aWNHTt2mDJlypjAwEDz7LPPmjlz5phx48aZdu3amfr16192+vHx8UaSadmypZk1a5YZM2aMKV++vKlfv77L2d09evQwkkyvXr3MjBkzzP333++od/HVIjkefvhh4+vra2w2m3nllVeuut/p6emmdu3axm63m0ceecTMnj3bTJw40dx+++0mISHBGHPhCpeAgABTo0YN8+abb5rFixebffv2GWNcrxbJysoyd955p7HZbGbAgAFmxowZplOnTkaSefLJJ536KMnExsa69L1SpUqmT58+LnVzu/LnYt9++62x2Wzm7rvvNhMnTjTz5s0zL7zwgmnQoIHL9JOSkkxwcLDx9/c3zz//vJk6daqJiIgwNpvN5cqZ22+/3ZQqVcrExcWZV1991TRt2tQ0bNgw16tF6tSp49Kv8+fPm9atWxtJpnv37mbGjBnmpZdeMm3atDErV6501Hv00UeNJNO2bVszdepUM336dDN48GATFhZmPvjgg8vOe6tWrUypUqXMyJEjzcyZM03nzp0d833x+rN161YjybRr1868/fbbZvHixSYjIyPXNrOzs03r1q1NUFCQ01VU99xzjwkICDBHjhy5bJ/yY9u2bcbb29vceuutZtasWWbkyJHGx8fHtGnTxqleTEyMsdvtZvDgweaNN94wffv2NRUrVjSBgYFO60pe3w05VyYcP37cqbxPnz7mpptucvydlZVlmjdvbjw8PMzjjz9upk+fbu666y7HZ/FKV4vkGD9+vPHw8DClSpUyAwcOdHl91KhRxmazmS+++MJpHEnm008/zdc0LufEiRNm3LhxZty4cebee+81ksxTTz1lxo0b53IlVs6VPvm9muRK3z05Jk+e7Lji45tvvrmW2XGSmJhoAgMDTbVq1cxrr71mJk6caMqUKeNydRwK3w0bLowx5t133zVVq1Y1Xl5eJiIiwqxZsybPS1FzCxfGGLN3714TExNjQkJCjKenp6lQoYJp3769WbZs2RWn/9Zbb5lbbrnFeHt7m5o1a5r58+c7vugudvr0aTNo0CATGBhobrrpJtOhQwdz6NChPMPF2rVrjSRjs9nMoUOHrqnff/zxh3niiSdMhQoVjJeXl6lYsaLp06ePSUlJcdT56KOPTO3atU2JEiWcvmQvXZbGXAgsQ4YMMWFhYcbT09Pccsst5uWXX3a6NNCY/IeL9PR0x4b5ctLS0syrr75qoqKiTMWKFY2np6cpXbq0adq0qZk7d67L9Pfu3Wu6du1qAgICjI+Pj2ncuLH55JNPcl2OkZGRxtvb2wQHB5sRI0Y4ln9+woUxFy6lHDlypKlSpYrx9PQ0ISEhpmvXrmbv3r1O9ebMmWMaNmxoSpYsaUqXLm3q1atn/vOf/5jff//9svN++PBh869//csEBAQYf39/061bN/P777/nuv6MGzfOVKhQwXh4eFx2o/Lqq68aSWb58uVO5YmJicbPz8+0a9fusn3Kry+//NI0a9bM+Pj4mKCgIBMbG2vS0tKc6vz111+mX79+ply5csbX19dERUWZX375xWVdudZwYcyFz0Pv3r2Nn5+f8ff3N7179zbff/+9W+Hit99+c2xYN23a5PTatm3bTIkSJVxCx/nz581tt91mwsLCzF9//ZWv6eQl5zstt+HSz2uXLl1MyZIl8z3N/Hz3GHPhMlW73W6qV69+DXOSu59//tm0adPGlCpVygQEBJhevXqZpKQky6eDa2Mz5jocrAOu0qpVq9S+fXv98MMPqlevXmF3B7ihBAcHKyYmRi+//LKl7aakpCg0NFSjRo3K86o13NhumNt/48a0fv16de/enWABWGzHjh06ffr0Nd/KPTcLFixQVlaWyz1I8PfBngsAgCW++OIL7dy5U88//7zuvPNOffjhh4XdJRQSwgUAwBKtW7fW5s2b1bx5c7377rtXfcdkFH+ECwAAYCnOuQAAAJYiXAAAAEsRLlDsvf/++ypbtmy+nlWAyzt37pzCw8M1c+bMwu5KoRs9evRV3TIdAOECBWjnzp0aPXq049kAV7Jq1SqNHj3arWlkZWUpLi5OAwcOdHoexOeff67+/furbt26stvtqly5slvtLl26VA8++KBuueUW2Ww2tW7dOtd6GzZskM1my3X4+uuvXepv3rxZLVq0UKlSpRQSEqJBgwblGorOnj2rZ555RmFhYSpZsqSaNGmS562grWzT09NTQ4cO1YQJExxPmgQAdxEuUGB27typMWPGuBUu8vMwo4v93//9n3bv3q0BAwY4lb/33nt677335O/v7/SEzfyaNWuWPvroI4WHhzs9EyMvgwYN0jvvvOM0XPr02YSEBN199906deqUpkyZoocfflhz5sxxeo5Gjr59+2rKlCnq1auXXn31VdntdrVr106bNm0q8Db79eunlJSUq356LwAUu9t/o/j44IMPXG6TfTmxsbEut0a/ko4dO5oWLVq4lB85csRkZmYaY4y57777XG57fCWJiYkmKyvLGGNMnTp18ny2yfr1642kKz7/wxhj2rZta0JDQ01qaqqjbO7cuUaSWbNmjaPsm2++cbkl/enTp021atVM06ZNC7xNY4xp3769admy5RXn6UaW2636AeQPey7gtoMHD+rxxx9XjRo1VLJkSQUGBqpbt25OeygWLFjg+PV85513Og4V5Dxy+1J9+/Z1PBX24kMLOY4ePapffvlF586dc5SdOXNGq1evzvXR8mFhYXk+4jw/wsPD5eHh3scjPT1d58+fz/W1tLQ0rV27Vg8++KD8/Pwc5TExMfL19dX777/vKFu2bJnsdrvT3hgfHx/1799fW7Zs0aFDhwqszRz33HOPNm3apD///POK8/3666+rTp06KlWqlMqUKaNGjRq57PU4cuSIHnroIQUHB8vb21t16tRxegJojjNnzmj06NGqXr26fHx8FBoaqvvvv1979+511Dl58qSeeuophYeHy9vbWzVq1NDkyZNdnpxqs9n0xBNPaOXKlapbt65juqtXr3aZ7qZNm3TbbbfJx8dH1apV0xtvvJHrvK5du1YtWrRQQECAfH19VaNGDY0YMeKKywj4u7lhH7mOgvPtt99q8+bN6t69uypWrKgDBw5o1qxZat26tXbu3KlSpUqpVatWGjRokF577TWNGDFCtWrVkiTHv5d69NFH9fvvv2vt2rV65513XF4fPny4Fi5cqP379zvOn9i2bZsyMzP1z3/+s8DmNb/69eunjIwM2e12tWzZUi+//LIaNWrkeP2nn37S+fPnncokycvLSxEREfr+++8dZd9//72qV6/uFBgkqXHjxpIuHAoJDw8vkDZzNGzYUMYYbd68We3bt89zvufOnatBgwapa9euGjx4sM6cOaMff/xR33zzjXr27ClJSk5O1u233+7Y2AcFBemzzz5T//79lZaWpieffFLShfNn2rdvr/j4eHXv3l2DBw9Wenq61q5dq59//lnVqlWTMUYdO3bU+vXr1b9/f0VERGjNmjUaNmyYjhw5oqlTpzr1b9OmTfrwww/1+OOPq3Tp0nrttdfUpUsXJSYmKjAw0PHetGnTRkFBQRo9erTOnz+vuLg4BQcHO7W1Y8cOtW/fXvXr19fYsWPl7e2tPXv26Kuvvspz+QB/W4W85wTF0KlTp1zKtmzZYiSZt99+21Fm5WGR3B4N/eabbxpJ5qeffrpsu1dzWORilzss8tVXX5kuXbqYt956y3z00Udm0qRJJjAw0Pj4+Jjt27c76uUsi40bN7q00a1bNxMSEuI0vbvuusul3o4dO4wkM3v27AJrM0fOU1VffPHFXOc7R6dOnfJ8GmyO/v37m9DQUKcn7RpjTPfu3Y2/v79jfZo3b56RZKZMmeLSRs5TbVeuXGkkmfHjxzu93rVrV2Oz2cyePXscZZKMl5eXU9kPP/xgJDk9erxz587Gx8fHHDx40FG2c+dOY7fbndbHqVOn5vp0VQCuOCwCt5UsWdLx/3PnzumPP/7QzTffrICAAG3fvr1AprlgwQIZY5yu+vjjjz8kKV8nXBaUZs2aadmyZXrooYfUsWNHPfvss/r6669ls9k0fPhwR73Tp09Lkry9vV3a8PHxcbyeUzevehe3VRBt5shZpikpKbnNtkNAQIAOHz6sb7/9NtfXjTFavny5OnToIGOMUlJSHENUVJRSU1Md68zy5ctVrlw5DRw40KWdnENkq1atkt1u16BBg5xef+qpp2SM0WeffeZUHhkZqWrVqjn+rl+/vvz8/LRv3z5JF/aWrFmzRp07d9Y//vEPR71atWopKirKZV4l6aOPPlJ2dvZllwvwd0e4gNtOnz6tUaNGOY55lytXTkFBQTpx4oRSU1Ove39MEbuD/c0336xOnTpp/fr1ysrKkvS/QHb27FmX+mfOnHEKbCVLlsyz3sVtFUSbOXKW6ZXu8/DMM8/I19dXjRs31i233KLY2FinwwTHjx/XiRMnNGfOHAUFBTkN/fr1kyQdO3ZMkrR3717VqFFDJUrkfbT24MGDCgsLU+nSpZ3Kcw63HTx40Kn84sCQo0yZMvrrr78c/Tt9+rRuueUWl3o1atRw+js6OlrNmzfXww8/rODgYHXv3l3vv/8+QaOI2bhxozp06KCwsDDZbDatXLmySE3vsccek81m07Rp0wq0X4WNcAG3DRw4UBMmTNADDzyg999/X59//rnWrl2rwMDA6/pFm3PMPGdDUZSEh4crMzNTJ0+elCSFhoZKunBi6qWOHj3qdLlsaGhonvUkOeoWRJs5cpZpuXLl8ppFSRc26rt379aSJUvUokULLV++XC1atFBcXJwkOdaHBx98UGvXrs11aN68+WWncS3sdnuu5VcTSEuWLKmNGzdq3bp16t27t3788UdFR0frnnvucYRIFL6TJ0+qQYMGjhPEi9L0VqxYoa+//vqqLo8vbggXcNuyZcvUp08fvfLKK+ratavuuecetWjRQidOnHCq5+7dDd2tX7NmTUnS/v373Rrveti3b598fHwcN/aqW7euSpQooe+++86pXmZmphISEhQREeEoi4iI0K+//qq0tDSnut98843j9YJqM0fOMs3rBNyL3XTTTYqOjtb8+fOVmJio++67z3ETrqCgIJUuXVpZWVmKjIzMdShfvrwkqVq1atq9e7fTFUGXqlSpkn7//Xelp6c7lf/yyy+O190RFBSkkiVL6rfffnN5bffu3S5lHh4euvvuuzVlyhTt3LlTEyZM0BdffKH169e7NV0UnLZt22r8+PH617/+levrZ8+e1dNPP60KFSropptuUpMmTfK8is2K6eU4cuSIBg4cqEWLFl3TlWzFBeECbrPb7S6//F5//XWXX2833XSTJLmEjrxcrn5ul6I2bNhQXl5eLhtXd5w7d06//PJLrr/q8+P48eMuZT/88IM+/vhjtWnTxnE5q7+/vyIjI/Xuu+86bRjfeecdZWRkON30qmvXrsrKytKcOXMcZWfPntX8+fPVpEkTx1UdBdFmjm3btslms6lp06aXnf+c815yeHl5qXbt2jLG6Ny5c7Lb7erSpYuWL1+un3/++bLLr0uXLkpJSdH06dNd6uWsb+3atVNWVpZLnalTp8pms6lt27aX7e+l7Ha7oqKitHLlSiUmJjrKd+3apTVr1jjVze2y3JxQltshJxRNTzzxhLZs2aIlS5boxx9/VLdu3XTvvffmGjCtkp2drd69e2vYsGGqU6dOgU2nKOFSVLitffv2euedd+Tv76/atWtry5YtWrduneMwRY6IiAjZ7Xa9+OKLSk1Nlbe3t+666y7HL9VLNWzYUNKFu11GRUXJbrere/fuknK/FNXHx0dt2rTRunXrNHbsWKe2fvzxR3388ceSpD179ig1NVXjx4+XJDVo0EAdOnSQdOHXRK1atdSnTx8tWLDAMf7GjRu1ceNGSRc2gCdPnnSM36pVK7Vq1UrShePwJUuWVLNmzVS+fHnt3LlTc+bMUalSpfTCCy849WnChAlq1qyZ7rjjDg0YMECHDx/WK6+8ojZt2ujee+911GvSpIm6deum4cOH69ixY7r55pu1cOFCHThwQG+99VaBtynJcbji0vf0Um3atFFISIiaN2+u4OBg7dq1S9OnT9d9993nOC/ihRde0Pr169WkSRM98sgjql27tv78809t375d69atc2y0Y2Ji9Pbbb2vo0KHaunWrWrZsqZMnT2rdunV6/PHH1alTJ3Xo0EF33nmnRo4cqQMHDqhBgwb6/PPP9dFHH+nJJ590Onkzv8aMGaPVq1erZcuWevzxx3X+/HnHvTt+/PFHR72xY8dq48aNuu+++1SpUiUdO3ZMM2fOVMWKFdWiRQu3p4vrLzEx0bGHLefQxNNPP63Vq1dr/vz5mjhxYoFM98UXX1SJEiVcTkS+oRXWZSoovv766y/Tr18/U65cOePr62uioqLML7/8YipVqmT69OnjVHfu3LmmatWqjsv6LndZ6vnz583AgQNNUFCQsdlsTpcB5nYpqjHGfPjhh8Zms5nExESn8vnz5xtJuQ4X93H//v0uZcb87+6MuQ1xcXGOeq+++qpp3LixKVu2rClRooQJDQ01Dz74oPntt99ynccvv/zSNGvWzPj4+JigoCATGxtr0tLSXOqdPn3aPP300yYkJMR4e3ub2267zaxevfq6tHnixAnj5eVl3nzzzVynd7E33njDtGrVygQGBhpvb29TrVo1M2zYMKc7hhpjTHJysomNjTXh4eHG09PThISEmLvvvtvMmTPHqd6pU6fMyJEjTZUqVRz1unbtavbu3euok56eboYMGWLCwsKMp6enueWWW8zLL7/suFw1hyQTGxvr0ufc1tP//ve/pmHDhsbLy8tUrVrVzJ492+UOnfHx8aZTp04mLCzMeHl5mbCwMNOjRw/z66+/XnE5oXBIMitWrHD8/cknnxhJ5qabbnIaSpQoYR544AFjjDG7du3K87OfMzzzzDP5mp4xxnz33XcmODjYHDlyxFFWqVIlM3XqVKtnt0ixGVPETrUH3JCVlaXatWvrgQce0Lhx4wq7OzeEadOm6aWXXtLevXtdriIBihObzaYVK1aoc+fOki48kLBXr17asWOHy8m+vr6+CgkJUWZmpuNS5bwEBgYqKCjoitOTLnyehg4d6nTH36ysLHl4eCg8PDzfz14qbjgsgmLNbrdr7Nix+ve//+24LBJX79y5c5oyZYqee+45ggVuOLfeequysrJ07NgxtWzZMtc6Xl5ejpPFrdC7d2+XRxRERUWpd+/ejsuxb0SECxR70dHRio6OLuxu3BA8PT2dTmwEipuMjAzt2bPH8ff+/fuVkJCgsmXLqnr16urVq5diYmL0yiuv6NZbb9Xx48cVHx+v+vXr67777rN0ev/4xz8UGBjocu6Sp6enQkJCXO6lciMhXAAAbhjfffed7rzzTsffQ4cOlSTHSdvz58/X+PHj9dRTT+nIkSMqV66cbr/99ss+Q+dapvd3xTkXAAAUExs3btTLL7+sbdu26ejRoy7neFxqw4YNTuEnx9GjRxUSElJg/eQ+FwAAFBNXewfS3bt36+jRo44hr1sCWIXDIgAAFBNt27Z1+2ZxklS+fHnHw/euh2IRLrKzs/X777+rdOnSbt8iGgDw92KMUXp6usLCwpwuAbXSmTNnlJmZaUlbxhiXbZu3t3euTzK+WhERETp79qzq1q2r0aNHF+gzfaRiEi5+//13l9sTAwBwOYcOHVLFihUtb/fMmTOqUqWSkpKOWdKer6+vMjIynMri4uI0evToa247NDRUs2fPVqNGjXT27Fm9+eabat26tb755hv985//vOb281IswkXObYQPHTokPz+/K9bf3fzvce92APg7qfHVjnzVS0tLU3h4uGPbYbXMzEwlJR3Tod9+lJ/ftU0jLS1d4bfUd9m+WbXXokaNGk6XvDZr1kx79+7V1KlT9c4771gyjdwUi3CRs7vIz8/viuFiV0Ql+do5TxUAbjRHWtVTrYSD+a5f0IfR/fxKX3O4+F9bV96+WaVx48batGlTgU7jhtoK74pw73HLAIDihe/5a5eQkKDQ0NACnUax2HNxJaxsAPD3sSuiklt7MG4kV7oj6PDhw3XkyBG9/fbbki4826RKlSqqU6eOzpw5ozfffFNffPGFPv/88wLtZ7EPFwQLAPj7+bsGjCvdEfTo0aNOt/DPzMx03I20VKlSql+/vtatW5frjbWsVCzu0JmWliZ/f3+lpqY6HZMiWADA31tuASOvbYZVHO0n77fkhE7/4CoF1tfCUmzPuSBYAADYFhRNxTJcsDIBAHKwTSh6il24YCUCAFyKbUPRUqzCBTfHAgDkhYBRdBSrcAEAwOUQMIoGwgUA4IbCXu7CR7gAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClripczJgxQ5UrV5aPj4+aNGmirVu3Xrb+tGnTVKNGDZUsWVLh4eEaMmSIzpw5c1UdBgAARZvb4WLp0qUaOnSo4uLitH37djVo0EBRUVE6duxYrvXfe+89Pfvss4qLi9OuXbv01ltvaenSpRoxYsQ1dx4AABQ9boeLKVOm6JFHHlG/fv1Uu3ZtzZ49W6VKldK8efNyrb9582Y1b95cPXv2VOXKldWmTRv16NHjins7AABA8eRWuMjMzNS2bdsUGRn5vwY8PBQZGaktW7bkOk6zZs20bds2R5jYt2+fVq1apXbt2uU5nbNnzyotLc1pAAAAxUMJdyqnpKQoKytLwcHBTuXBwcH65Zdfch2nZ8+eSklJUYsWLWSM0fnz5/XYY49d9rDIpEmTNGbMGHe6BgAAiogCv1pkw4YNmjhxombOnKnt27frww8/1Keffqpx48blOc7w4cOVmprqGA4dOlTQ3QQAABZxa89FuXLlZLfblZyc7FSenJyskJCQXMd5/vnn1bt3bz388MOSpHr16unkyZMaMGCARo4cKQ8P13zj7e0tb29vd7oGAACKCLf2XHh5ealhw4aKj493lGVnZys+Pl5NmzbNdZxTp065BAi73S5JMsa4218AAFDEubXnQpKGDh2qPn36qFGjRmrcuLGmTZumkydPql+/fpKkmJgYVahQQZMmTZIkdejQQVOmTNGtt96qJk2aaM+ePXr++efVoUMHR8gAAAA3DrfDRXR0tI4fP65Ro0YpKSlJERERWr16teMkz8TERKc9Fc8995xsNpuee+45HTlyREFBQerQoYMmTJhg3VwAAIAiw2aKwbGJtLQ0+fv7a2vdivK1c8dyAEDeMrKy1fjnw0pNTZWfn5/l7edsk1KT98vPr/Q1tpUu/+AqBdbXwsKWGgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACx1VeFixowZqly5snx8fNSkSRNt3br1svVPnDih2NhYhYaGytvbW9WrV9eqVauuqsMAAKBoK+HuCEuXLtXQoUM1e/ZsNWnSRNOmTVNUVJR2796t8uXLu9TPzMzUPffco/Lly2vZsmWqUKGCDh48qICAACv6DwAAihi3w8WUKVP0yCOPqF+/fpKk2bNn69NPP9W8efP07LPPutSfN2+e/vzzT23evFmenp6SpMqVK19brwEAQJHl1mGRzMxMbdu2TZGRkf9rwMNDkZGR2rJlS67jfPzxx2ratKliY2MVHBysunXrauLEicrKyspzOmfPnlVaWprTAAAAige3wkVKSoqysrIUHBzsVB4cHKykpKRcx9m3b5+WLVumrKwsrVq1Ss8//7xeeeUVjR8/Ps/pTJo0Sf7+/o4hPDzcnW4CAIBCVOBXi2RnZ6t8+fKaM2eOGjZsqOjoaI0cOVKzZ8/Oc5zhw4crNTXVMRw6dKiguwkAACzi1jkX5cqVk91uV3JyslN5cnKyQkJCch0nNDRUnp6estvtjrJatWopKSlJmZmZ8vLychnH29tb3t7e7nQNAAAUEW7tufDy8lLDhg0VHx/vKMvOzlZ8fLyaNm2a6zjNmzfXnj17lJ2d7Sj79ddfFRoammuwAAAAxZvbh0WGDh2quXPnauHChdq1a5f+/e9/6+TJk46rR2JiYjR8+HBH/X//+9/6888/NXjwYP3666/69NNPNXHiRMXGxlo3FwAAoMhw+1LU6OhoHT9+XKNGjVJSUpIiIiK0evVqx0meiYmJ8vD4X2YJDw/XmjVrNGTIENWvX18VKlTQ4MGD9cwzz1g3FwAAoMiwGWNMYXfiStLS0uTv76+tdSvK184dywEAecvIylbjnw8rNTVVfn5+lrefs01KTd4vP7/S19hWuvyDqxRYXwsLW2oAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAoBiZMWOGKleuLB8fHzVp0kRbt269bP0PPvhANWvWlI+Pj+rVq6dVq1YVeB8JFwAAFBNLly7V0KFDFRcXp+3bt6tBgwaKiorSsWPHcq2/efNm9ejRQ/3799f333+vzp07q3Pnzvr5558LtJ82Y4wp0ClYIC0tTf7+/tpat6J87eQhAEDeMrKy1fjnw0pNTZWfn5/l7edsk1KT98vPr/Q1tpUu/+Aq+e5rkyZNdNttt2n69OmSpOzsbIWHh2vgwIF69tlnXepHR0fr5MmT+uSTTxxlt99+uyIiIjR79uxr6vvlsKUGAKCQpaWlOQ1nz551qZOZmalt27YpMjLSUebh4aHIyEht2bIl13a3bNniVF+SoqKi8qxvFcIFAACFLDw8XP7+/o5h0qRJLnVSUlKUlZWl4OBgp/Lg4GAlJSXl2m5SUpJb9a1SokBbBwAAV3To0CGnwyLe3t6F2JtrR7gAAKCQ+fn5XfGci3Llyslutys5OdmpPDk5WSEhIbmOExIS4lZ9q3BYBACAYsDLy0sNGzZUfHy8oyw7O1vx8fFq2rRpruM0bdrUqb4krV27Ns/6VmHPBQAAxcTQoUPVp08fNWrUSI0bN9a0adN08uRJ9evXT5IUExOjChUqOM7ZGDx4sO644w698soruu+++7RkyRJ99913mjNnToH2k3ABAEAxER0drePHj2vUqFFKSkpSRESEVq9e7ThpMzExUR4e/zso0axZM7333nt67rnnNGLECN1yyy1auXKl6tatW6D95D4XAIAbyo18n4vigi01AACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWuqpwMWPGDFWuXFk+Pj5q0qSJtm7dmq/xlixZIpvNps6dO1/NZAEAQDHgdrhYunSphg4dqri4OG3fvl0NGjRQVFSUjh07dtnxDhw4oKefflotW7a86s4CAICiz+1wMWXKFD3yyCPq16+fateurdmzZ6tUqVKaN29enuNkZWWpV69eGjNmjKpWrXpNHQYAAEWbW+EiMzNT27ZtU2Rk5P8a8PBQZGSktmzZkud4Y8eOVfny5dW/f/98Tefs2bNKS0tzGgAAQPHgVrhISUlRVlaWgoODncqDg4OVlJSU6zibNm3SW2+9pblz5+Z7OpMmTZK/v79jCA8Pd6ebAACgEBXo1SLp6enq3bu35s6dq3LlyuV7vOHDhys1NdUxHDp0qAB7CQAArFTCncrlypWT3W5XcnKyU3lycrJCQkJc6u/du1cHDhxQhw4dHGXZ2dkXJlyihHbv3q1q1aq5jOft7S1vb293ugYAAIoIt/ZceHl5qWHDhoqPj3eUZWdnKz4+Xk2bNnWpX7NmTf30009KSEhwDB07dtSdd96phIQEDncAAHADcmvPhSQNHTpUffr0UaNGjdS4cWNNmzZNJ0+eVL9+/SRJMTExqlChgiZNmiQfHx/VrVvXafyAgABJcikHAAA3BrfDRXR0tI4fP65Ro0YpKSlJERERWr16teMkz8TERHl4cONPAAD+rmzGGFPYnbiStLQ0+fv7a2vdivK1E1wAAHnLyMpW458PKzU1VX5+fpa3n7NNSk3eLz+/0tfYVrr8g6sUWF8LC1tqAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsNRVhYsZM2aocuXK8vHxUZMmTbR169Y8686dO1ctW7ZUmTJlVKZMGUVGRl62PgAAKN7cDhdLly7V0KFDFRcXp+3bt6tBgwaKiorSsWPHcq2/YcMG9ejRQ+vXr9eWLVsUHh6uNm3a6MiRI9fceQAAUPTYjDHGnRGaNGmi2267TdOnT5ckZWdnKzw8XAMHDtSzzz57xfGzsrJUpkwZTZ8+XTExMfmaZlpamvz9/bW1bkX52jmSAwDIW0ZWthr/fFipqany8/OzvP2cbVJq8n75+ZW+xrbS5R9cpcD6Wljc2lJnZmZq27ZtioyM/F8DHh6KjIzUli1b8tXGqVOndO7cOZUtWzbPOmfPnlVaWprTAAAAige3wkVKSoqysrIUHBzsVB4cHKykpKR8tfHMM88oLCzMKaBcatKkSfL393cM4eHh7nQTAAAUout6jOGFF17QkiVLtGLFCvn4+ORZb/jw4UpNTXUMhw4duo69BAAA16KEO5XLlSsnu92u5ORkp/Lk5GSFhIRcdtzJkyfrhRde0Lp161S/fv3L1vX29pa3t7c7XQMAAEWEW3suvLy81LBhQ8XHxzvKsrOzFR8fr6ZNm+Y53ksvvaRx48Zp9erVatSo0dX3FgAAFHlu7bmQpKFDh6pPnz5q1KiRGjdurGnTpunkyZPq16+fJCkmJkYVKlTQpEmTJEkvvviiRo0apffee0+VK1d2nJvh6+srX19fC2cFAAAUBW6Hi+joaB0/flyjRo1SUlKSIiIitHr1asdJnomJifLw+N8OkVmzZikzM1Ndu3Z1aicuLk6jR4++tt4DAIAix+37XBQG7nMBAMgv7nNR+NhSAwAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAACApQgXAADAUoQLAABgKcIFAACwFOECAABYinABAAAsRbgAAACWIlwAAABLES4AAIClCBcAAMBShAsAAGApwgUAALAU4QIAAFiKcAEAACxFuAAAAJYiXAAAAEsRLgAAgKUIFwAAwFKECwAAYCnCBQAAsBThAgAAWIpwAQAALEW4AAAAliJcAAAASxEuAAA3lBpf7SjsLvztES4AADeMWgkHC7sLUDELF6RRAEBeCBZFR7EKFxIrDwDAFduGoqXYhQuJlQgA8D9sE4qeYhkuJFYmAADbgqKq2IYLiZUKAP7O2AYUXcU6XEgXVi5WMAD4e+F7v2gr9uEiBysaAPw98H1f9N0w4UJihQOAGx3f8/k3YcIENWvWTKVKlVJAQEC+xunbt69sNpvTcO+997o97RJuj1HE1Uo4qF0RlQq7GwAACxEq3JeZmalu3bqpadOmeuutt/I93r333qv58+c7/vb29nZ72jdcuJAIGABwIyFYXJ0xY8ZIkhYsWODWeN7e3goJCbmmaReLcGGMkSSlpaXle5wKG3/S7uZ1CqpLAIDroMZXO9z67pf+t63I2XYUlLS0dMvauHQevb29r2qPgRU2bNig8uXLq0yZMrrrrrs0fvx4BQYGutVGsQgX6ekXFn54eHgh9wQAcF35+1/1qOnp6fK/hvHz4uXlpZCQEIXfUt+S9nx9fV22b3FxcRo9erQl7bvj3nvv1f33368qVapo7969GjFihNq2bastW7bIbrfnu51iES7CwsJ06NAhlS5dWjabrbC7UySlpaUpPDxchw4dkp+fX2F3p1hjWVqL5WkdlmX+GGOUnp6usLCwAmnfx8dH+/fvV2ZmpiXtGWNctm157bV49tln9eKLL162vV27dqlmzZpX1Zfu3bs7/l+vXj3Vr19f1apV04YNG3T33Xfn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\n"},"metadata":{}}]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"vN3eEu7xk2QH","executionInfo":{"status":"ok","timestamp":1765308360320,"user_tz":-60,"elapsed":30296,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"9c3c3276-c326-4053-d63d-f7949d2dea4d"},"execution_count":27,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n"]}]},{"cell_type":"code","source":["cd /content/drive/Othercomputers/My Mac\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"RpXlkC4mlxIm","executionInfo":{"status":"ok","timestamp":1765308648652,"user_tz":-60,"elapsed":52,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"21eb72a0-0b0a-4241-9404-1540191fe69c"},"execution_count":30,"outputs":[{"output_type":"stream","name":"stdout","text":["/content/drive/Othercomputers/My Mac\n"]}]},{"cell_type":"code","source":["! git clone https://github.com/numerical-mooc/numerical-mooc.git"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"1nE41XFZmMcg","executionInfo":{"status":"ok","timestamp":1765308750407,"user_tz":-60,"elapsed":8349,"user":{"displayName":"Tongue Kevin","userId":"13768078595560270101"}},"outputId":"41dade05-1594-4bbd-edd8-1b1c62d2a6c5"},"execution_count":33,"outputs":[{"output_type":"stream","name":"stdout","text":["Cloning into 'numerical-mooc'...\n","remote: Enumerating objects: 5666, done.\u001b[K\n","remote: Counting objects: 100% (11/11), done.\u001b[K\n","remote: Compressing objects: 100% (9/9), done.\u001b[K\n","remote: Total 5666 (delta 4), reused 3 (delta 2), pack-reused 5655 (from 1)\u001b[K\n","Receiving objects: 100% (5666/5666), 69.43 MiB | 16.22 MiB/s, done.\n","Resolving deltas: 100% (3596/3596), done.\n","Updating files: 100% (134/134), done.\n"]}]},{"cell_type":"code","source":[],"metadata":{"id":"SxZMgWIfmi5u"},"execution_count":null,"outputs":[]}]}

Xet Storage Details

Size:
52.2 kB
·
Xet hash:
49aab46ffb90e475c682c128131335cb4305a4fef69aad58903f7b347a1329fc

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.