mongodb远程服务器连接

mongo -uroot -p321 master.puppet.org:27017/admin

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABCCAIAAABilny8AAAgAElEQVR4nO1dd1wU1/a/M9hNMYktMU9jT1R6ExDBTrEhVlCjdKXD0nuzoCBNNIGYxBjzIthBOkvvKN0GLNUGbC+zZWZ/f8wu7MIumvbeS36cz/dzc+bOndvmfuece+5igHBCJkSOYEIhho0G+m4Y+yCGCQWoFPg4BEIeH+PyUYTLp9GZFCoNB5lCpdIYPD46XHL4QRTDH8c4HC6dwWKzET4fxRvljyks+ZTMXuHDRMd0Tx74AowvwASoUCDABAKMxxfwBSiPz+cgXAaTxWAyaTQag8nkIFwmm41wuQiXi6IohmEckSAMBoNKpVIoFBabxWAxwX/7RU/I/67IJOG78FD2Wh+zyhGugMni0BlsGp1Fo7NodCaVRh8mIQ4miyNa8WLwBBiXJ0C4fA7CY7ERDsITCLDhdt9CQjkjEg0KFaLvRkIBKuQLhHwByuMJeDw+l8dHuFwWi81gMBAOwuXxmEwWi82m0mhUGo3JYvN4PKFQyONxmUwmh8ulUKkMJoPH43EQhEKhTJBwQuTKW5asHELKe2QUCfmokMdHcToxmGwqjYFjFAkpVBqNzmAw2UwWwmJzWWyEzeEiXD5uIce2Pg55xu/bu5NQIDaDfAHKYnNYbA6bw6HTGRQKlcvjcXk8NpvDYrNZbA6ZQqHSaBwOwucLhEIhbgwZTObg0NDg0CCVRmMwmeOSkEgA4wmB+B9bC39MSKlGRqmkcYsQCbIHRCSMziUSgMzKJBshEiQeIqUaSVYx+nnZnZM/9XJHMrarckqNU2xMZwoJgFA4Zr2SUrcCoxTSeFZR+hFSylZCoSxLKECJnoCQjwp5gkIXGaN1yaDSKBQaJcMFuGQxWRyEy+cLsHxP4FkoRDEhWkDYmkIa1e4fJ+E4GFUhjy/gcBAWm0NnMgeGhobIZCaLSaPTGUwmi8VmMJlUGm1oaIjFYiEIwuVyhUIhn8en0+lUKpVMJrNYLBabzWSxxiXhyPsa9X7e7ZX/hSJ7NUksXqNUkoylLKvTpFQjAAgE2ctzLOlkD11qfkaIN3pZj354FEXHb0MoJBL+IAnx0copONJZIgEQiJgcEhaO+3H2HFOelGK0NYUkWuhySChAiR7AM5uN0EYsYYYzcLlPodIZzOeXt3oWjDCtwBOILgtHSChlbCW6uPVb0ggJx+Xh6E+JiHWYAMUkSYiK6cfl8VlsDpVGo9HpA4M4A1kIglAoFBqNzmSxGUwWm4Ow2WwOB+HyeGwOh8PhsNlsKpXKZrOYTCaHgzAYTCqN9r9IQlKqkfxP/nAH5PdAmjnDXZe14nEGEsdplUgAhNRUo7dYpjHzY5RKGpUp/U0wSiWNsXgStvRtJHyLmyL65Mjvt4xmR3FQKJuEhQSwNZWECbFCwgi1xvFCSalbgcgMYqTUrVtTO8SUKPAc6cLWlFRPQMjjCWjiPSG5KWHTpsTHbI4AHaHUVgJhq8yBSnQSRYUF36Z24rTpTN0KjL7tFDMQldtVmfZcgGICAcrno6gEFcXbQpTLF7A5HAqNRqZSBwYGKRQqg8mkUakUCoVCoVCpNA6C8Hh8DoIgCIJwuUwWi4GbSDYb4XI5CMJgMqg06sDAwP+iO/qHSCj61JPeyhsZXug7NCy7K29b9wSiNLOIBKNUkjRHpR3aP9cSyro5+pM0MqOyX/zWFBKGEQnDjqgsgzjGbJJStg5nklK2it3IERA9AaEAE/L5Ba7ALYNKozQnbhLXtuVyu6ghAlGSJwUEcT0SH4LRdBKxjvTtVuBZIO1VjuHhKIdWkoQ8Ph/h8nh8Pp8vwLeCqIQvymKzaTQalUYbHBp6/ebNwODg0NAQi8nk8Xg8Hg9BuDweH3c4aXQ6jU6nM5gsNhv3Qllszus3r1+/fk0mk0H05e9Kquve9ubGs4QS633EphCI+LscyRnDXrzY8K2Rz/Bopo9pQLxkRspK5I9epzItIV6lHFdQdENUu+x1P6ohGe2OXvmjSEggSHuqfyUJZTw4ioMj8zHsr461hFKXsggw1nEdLkNKMQIE4hhrQ/QEhAJUyGBmOwOXLBabx+PzBahAgGKYKCxUSCAQRK+ZkJIi58tKIMpglMgSEgrG7u7eIbqLokI+vuVjsbhcHsLl8fkCycAPX4DyeHwEQVgsFp3BwHn45s0bFouFoiiXy2VzOCw2m8vjcRCExWKzORw6g0Gj06lUKpvNodMZg0NDb968IZOHQPTl7y6k/vi21yqXhFLWhJSaShSOWeESLt8Y/0+KexK+neSSJqZKLE6pr7UkJUf5d+PtCceYURnhElGJ4XFLW83RD0j2Xub8CceQUNRdyVmSJKEckevejlPwbZ0REY9AEHkQohsiEhLlcOxtlrCQAESOq4RTOpaEeC1bLn/jOba6YatLSt06XNXbMFJ5AQEAo29JY3Z673DEgqIYhgn5AhTfyHG5PARBBAKBQIAKUEwgsTlEuDw6g0GhUshk8tDQEJPJRBCEyWQhCJfFZjOYTDaHg2IYj8fjcrkIwuVwEARBGAzGEJk8RCYPDQ1RqRQQffm74qpa4Vh5F3dUtv8mnTt6yQ9fSxeTiBjI9QpHboyqdFS4YXSY5B2io3KKjK4JiDxOaaszPFUEosxpkzSs0iQZGdEfsoRv36NLzdDYbwjecak6pEgolAZuCVNJ8s4wpBgo4ZRKLHTSt1vFzMWEGEYkAEKh2PPEhnMwUorELnBrCkkG97emkiROU0T1k1K3jmXgOwIV8vgCPl8gEAgQLpfH4/N4fIGALxCgCJcnSUIeT4BwuVQajUyhDA4NkclkOp1Oo9NpNDqdwWAwmXQGg8VmIwgXQbg8Ho/L5XEQLn5E8fL16xcvX75+85o2TmBG/o5F4qXL3ppJvfAxjBrOkGaOXBKO2t3JJaHELotIkG0I5e0j35GEI72Rzht2Lkev9LdZQskmfjMJ8ULiopKPy46AinPlxUeH65MjRuK1Przi8WmTaSQlDNeIUyokeg4HaUYsIW4hiQRAKMBIKVtF1m8kpioUYqTUrXjr2JhYkcQtKRIWEsDW1E6JTHnRlzHbSHw3iPJ4fB6Ph3C5HA7C4/MFAhS3bDwen88X4IFTLpfHYrNpdBqFSh0cGqJSaXgslMFg0Gh0nIQUKpVKo/EFAgRBWGw2m8Oh0elvBgZev3796tWrvv7+V69fjUdCebZFKPnq5VjCkWfHtYRvJ6Hk43ItofhyeDcqv+uy5N1ISCSIl6IUE0mpRkapxLGNvCsJR1qSy9+RKqQcDOlwj9Q45R6kjPmCyO3vcBYmXcPWVJKIIcKRqAkmwR9JkFKMRgiJ00li/yY2d0JMHKHBCgkAEAolY6pjSCjj6yA/yjJOAEYyE8OEKIrx8VgohmFCIYZhbDabTqezWGwuj0dnMIfIZCqNykEQBOHy+QIOwsWP44fI5IGBgTev3wwNDTEYDPwcgsVi4fEYOoNBodEoVCqFSqXR6VQ6bYhMfvPmDY1KpVKpL1+9HBwalEfCUUtX3p6QlGok8VYl9oSjGCKDR/JJKEUxCX2EBZKq9KZTfENudFSOEZC/MocrG/WkuGNEAr6VEpkzuWbkzyXhiNEf6xqLnRQZHcYPRGWOVi4JR2UU4lSUisrgDJSInY7sG0dMn8iEEsV+rFCICUdIKFZES0qqHnxPSEpNKRSFRkffGkO2zhQjSUv49p0kigkEKJfH5/H5AhRFUZTP53M4HDwqw+cL6AzG4NDgEHmIxWYjXC6DyaDR6Sw2G3dEqVQqjUqlUigMOp3DZuOxULFPyqTR6QODg28GBt4MDFBpNBqdRsMpSKFQqRQ6nS6HhKPNx3jRUaloiKiwvE0TGOVnyibhcHmxdRNdpUpbwpHjgLGh2j9jT0gkyD/FHyUyGpFhCUc7d9IVjB2+HJ9Qsr3Rrcgarai60d/FsdGpt5BQ7H6K7OHIhnCYCRKGjpRiNMxA0uioplEKSTYJCwkAAEIh/r0olKgfADBSQFpkxWw6xRZY5qmgLBIKeTw+gnC5PJ5AIEAQLoqifL5AgKL46QSHwyGTyUPkIQaTweVy8ZMJBpPJYDLJFAqNRmOzWAiHw+Fw6HQ6ncHALSTOQCqNymAyKVTK69evyRQyi81iMpkMBoPBYNCoVBpdzp5wzLn2mC/929flf0HedtYlr+eySThsd8YLUcnyBYcrfas7Kmk5x2z3ZI1vbDfHdG7UVnm8d4U/K3VEP+4QxCJmxSgiSBsoybujDjNIqVsJRBEzRRQSDUOiJCllq/jsQWKTKWNP+M6B0/FIiAkFApSHb/gEAoFAwOWKLphMFofD4fF4NBqNQiFzOBz8qJ3JYuEnhAODg2QKBT+FZzKZeAyGyWTRaDQqjTowOEilUskU8qvXrwcGBuh0Op1BZ7FYXC4XQRAalUYmkyd+wD0hv0dElBtOx/21txSE0rpQVs4fJtVvoB+K4btA3CMVX2ICgcgMcrk8Pp/P5XJpNCqLxeTx+RwOwkEQFpszRCYPDA4ODg3hP15jMBg0Op3NZvN4PA6Hw+aw6Qw6lUYjU8g0Go1CoZDJQxwOh8vl4ueHKIpiKMZkMCZIOCG/R0YfWrw7DyVL/ib2/onEk0hx4OcQKIrhZxH4HxlxOBz8eBD/a0AhhgmFQj6fj0c4aTQ6mUIZGBx8/fr1wMAAg8FAEATnGK4wWXh0lEKhUofIQwMDA2w2WyBA2RyERqfj3iyPx0NRdIKEE/KH5DcwUB5p/+MkHAUBinK5XHwHyOPx2RwOj8/nIAiVRqMz6GwOh8ViIwiCe6d4t7k8/Iye+vrNm2E/k8FgcBCEy+Xi7qv4B6JMGp0+ODhIo9H4Aj7uxNIZTAqFivuxCJc3QcIJ+aMi27jJczV/n/38y0wi7n/y+Xwej49iGJfLZbJYLDabLxBQqJQ3AwMMPMQp+sEnm83h4MEb/JCQSqUNDQ2RyWQymUyl0phMJpvD4YkPE/kCPr57pFAobDabgyA0Op1ModDpDPyvnKg0GoYJJ0g4IX+CjEcweeT8i0j4brXh3ENRDOcLvvHDDSCLxWay2Dwen8PhUCjkoaEhFovNQbhsDkKjM2h0OovFwn+GhvuuHARhMJii4wgmk8Vi8fl8FEVRDBMIBFwul8Fg0Ol0BEE4HITBZFKoNDKFQmcw2BwOk8lCuNwJEk7InyZvYdo4bPwzuDe6M+MWRjEhl8tDuFwen89mc3D24EcU+Ak7k8XmcBAOh0OlUqlUKh5ZoVKpZDKFwWRSaaKTQJb475Jw+iEchMfjYRiGoigqEPD5fA7CwUmI/2kFncGk0xk4YylUKoVKGZqIjk7Inytv5+FfQ0IZPXkHS4j/axQ8Hp/FYlFpNIFAwEEQ0U9bqDQ2m01nMCgUChdBxLEW0R8l0Wh0KpWG/2h7CD+sp9HpdAaHg6AoykEQHo+HG1gWm02lUYfIQ/gRIr4nHCKTyRTKwODA0NDQwKD8vyf8yrPgS/fc5U53l1hdW7grzDPm3943SEdTHn+d+uzYd+3HUp8d++751ynPD13qOPbdE23LUFubzebmNtev6y1dlpuS8tDBwUF5k4XPDZL/ra7g290Rd7vOZPVH3yOdz+mPy+1PyO1LzO+/VPgyueD15cL+hPz+xLzepIJXSQV9SYUvL+b1Xsx/EZ0ap2bv7HvjWRLxVdydQotN21UsfgxIuUdIKfBJvH1wi/7agykRmd3nfrlhprnL6+aLCzndCbl9CXk9CQV9F3J6EgpfxOX0JOT2JOR0JeT2xuf2xT/oicvui8/tisnpuXCnbIeNy95zteEJMUu1UyOzuy/k9MXmdMfm9F7I7onJ6o150BX7oDsmq+v8g+7YrK6Y7L6Ye6Rzmd3nbxZvUT5md+Xx2Yzu6Iyu6AfdZ+51nM7oirpLCr7ZHpLe7v9ru9cvz1yvPnb6/rFdaov1N4+PJDcdSGrac+HRjph643N1W8/UbTpVsyGyZkNkjWFEpWFEtWF4tUFEtUFEtX5Y1brQShz6YVXrQqvWhVbqhVbohVbphlTphVTphlTqBlfoBJevDS7XCS7XCS7XDarQCSxfG1SuE1SxNrB8bVC5dlC5VmCZVmCpZkCZVkCZVkCZtn+Ztn+pln+pRkCxZkCxpn+Rln+Jln+ppl+Jhl+Rhl+Rhi9R069Y069I07dI04eo4UvUwFO/QnVforoPUc27QN2nUM27QN2HiCuq3vlq3gWqXvlq3gU4VL3yVb3yVQl56l75aoR8Na98Va88FUKeGiEPz1cl5KkSclUJuaqeeaqeYp2Qq+KZo+KZo+yRo+KZp+KZq+KJ52SreGbjt1Q8s5U9spU9c5Q9c1Q9ctTEUHbPUvbIVvbIUnXPxqHinqXqnq3slqHi9kDZLUvZ7YGK2wNlt0wl1/vKbhk4lFwzlF3vK7vdU3bNUHbNVHLLwKHsel/F5b6K831l5/vKLveVXe4rOd9Tcr4nod9Vcr6n5HwHz1dyvqfodGeN0601TrcUnW6L4HhL0fHWGsdbaxxvKYqh5HhLyfGW4smbeKp4Ml3xZJriyXTFE+mKJ24qnkyTS8JVhIKvPHJXON1dav3zwp1hhNhffdK7vk59itMPT039ftE8EKBzOGT7MZOqKgU2e0Zm5vb4+COXLiV7eHoamBywjcsLutMVeqcr8m7X6Qet7u7nbSN/MvO7GXGvM+KbX/eeDDM/GXHs2/rkwpfJBX2nU5L3OYaaO4Y7XSqPz2xwctjzL731RnahQbeeubp467j8EJgUp2+0d8Mxm2Xzj3v/Wmpu7W6d8Cj6+r93a+z0vv0iMfe5T2iU+YlgsxNJAb8+SczvS8p9Ghx8ee+JEDP/q8E326Ov55jbB5k7xHl+3xp3p3SnrfP+83URCeeXqJ61irpg5hB6KLr8bFb3hexnQefizO1DdjvEuXxTez6n5/TVzGOuIWYnIr4+W+QcFb1ygZbu0VPWF0rcI9K9fmg9e7/z1L2O8LvtIbfag9Pb/X59Trj+1PWnx04/PLb9rtX627bDl5oPJjWZxz/aGVtvEl2/7Uzd5tN1G07VGEZVG0ZUGURUG0TUGETWrI+oXh9epR9epR9WpRdWuU5MQt3QCt3QSp3QCt3QKt3QSt2QKp3gCp3gCt3gSh0xtIMqtIMqtIPKtYLK1waWaweWawWWaQWUaot5qBVQpuFfgpNQw79IK6AUJ6Gmf7Gmf7GmX5EYRE0/oqZPkaYvUcO3SMOvWMO3SN23SN23EKefOC1U8ykYpp8kVL3z1X0K1MUkVCXkqXnlq3kVqHkVSFAxT5Ug1j1xKuaICTkKOaMgSUJVDxE/VT3EJPR4oOqepeKeqeL+QMX9gbJ7popblopblpLrPWXXTBEPXTOUXTOV3US0HE1CFxEDZULJ+f4wA8U8vKvodEfR6c4wD5Ucbys73laW4KTiyVtKYjZKkfBkOn4p3xISCr7yyFvudHeJ9fWFO8MJsb/4pHcc++7p8dSnVlfarb57tjPktoOHv5OT/bVrU6sqpwj40ygU2M19fnDwXg83p8iISFNjI9OT0cF3esLvkqLudZ3JKt82b6nqkYuHz2RHpF7X2eJo7n3xeECYgZ6F8y/t56+cX3fI/mDgJSt3L5UNbp5X6wk+Xy/ebGTuezH8RsUu55Dj31S72GzaF9928W623opTEfnP3a3PWflmn/r5upnGLp/bHaEB9mpWYVYBFw8dP6a+/ZvTOU/cPbw3mnsd9Us+Fn0n/N5DR6eUwwEX91vuVzyUeOZ2+U57J/NzNVGJETOXbN/knfS1O2GV6kHP9OdBp/w1j7of9Uu2sHdRMTgVkF531N1l/deRh30vnkyuIcQkqSwy2Hgy2SkpZ89GR4tT5efvPDrq5qOov0M7uND/ao5R0FW7K21u1544/fDY/rtm65S2o5daDl5sMo9v2Blbb3qu3uhM3eZTdRuiag2janAYRFYbRtYYRFavj6jWj8B5WLk+vHpdWNW6MNwwVumFVOiFVuqFVumFVuuGVOiGVOiElOsGV+kEV+qEVGoHV2gHl2sHl+sEVeoEVeoElq8NLNcKLNUOLNUKLNUKKtUMLNUKKNUMKNYKKNYKKNYOKNHyL9HyL9byL9LyL8ah7Ves5V+s5Vek5TtMy2JNv2INP6KGb5G6L1HDj6jhS9TwLdTwJar7Fmr4FKr7FGr4FuK0VPctUPctUPPJ1/QhangVqnsXqHvnqXnlq3vnq3sVqHsVqnnlj0HeMFQJuWpeeRIszVX1ylUj5OK6GiFHzTNXzTNX3TNX3TNXzTNbzTNLzTNbbYSWWaoeWaoeD1Q9slTcM8X6AxX3TGWPTBX3DFWPTFGOW6aKe6YyTlH3TBW3DBFcM1RdM1RdM1QkoOxyX6zfV3a9q+xyV9nlnrKLSFFyuavkfEfJ+baK811lp7vKzneUnO6oON9Rcbqj4nRbxfmOstNtZafbSo43lZ1uKTneVHa8reR4S8nxppJjugRujmMJiV955Cx3urfM6peFO8O9L/wacKvb+kqbzZWntj+023z/dKvLpTOno7Zvf7F8uUdIkMHAm1mbN89asmS5p4e7j7eXldUx/d123tfawu52R9zvPp3ZdTa7bPdiZavvupIKXgQF6a/0LkgivvymuNfN3WKtT4brvp3bAzK/LXl5Oa/FxXLDjpiyC1cvajg4Bd3tTr5fahIQ4fAz8ajaYa+7fQk/X1++MS46v+3E8QvHQ8tifkkz09rl/0v57jUHnX59cbmgPzmbuGvF2pPfZG48Sjh2qfEysfdi3ouLeW1BSbf3GasvWb5wmkZQxK3i3fYuh2JrTiXELNI4H/qgOyn3kaWJ0qFkosVm2wNnay7m9sQ/qDikqnc4qeaEu+uyJaZHThdGpT2Ju1dqpHrc4Wp7TEbH6V+aojO7Ir/50cLB1T4ha4ex9sJlBjo215x/fOzxyzPnq09O/tBmm/rk68stFheb9ic27op7uCP2kcm5R9vOPNx8qm7LqfqNp2o3RdVtOFW78VTthqjaDVG1hlG1GyJrDaNwZ7XaMKLaIKJ6fUSVfniVQXitflj1+vBq/fBq/bCq9eFV60Ir14VXrQut0Aut0gupWBdaOZzqBVfqhpTphZTphZTrhZTrhpTrhpTpBJXqBJfqBJXqBZbrBJTrBJbqBZXrBJbqBpbpBZbqBBbrBpboBpZpB5ToBJasDShdG1iyNrBEJ6BkbUCxtn+xtn/R2oDitQHFa/2L1/oXawcUa/sXafsXa/kTtfyLtPyIWn5ELb9CbX+iWC/S8ivU8ivU9CvU8iNq+RK1fAs1fQu1ffK1fPI1fQo1fQs0fAo0fPI1fAs0fPK1fAq0vPO1vPM0ffI0ffI0fPK0fES6lk++pneOlneulneupneOpneupleehneOlne+hneOlleeNiFHwytX0ytX0ytH0ytHc0TP1fTKUiNkaRFyNAk5mp45moRsDc9MDc8Hmp7ZGp5ZGh6ZWp4PND0yNT0yNT2GlUwN9wwN9wfi9IGGO56ToeF+T8PtgYb7fXW3++puGepu99Td7mq43VPH4XpPzfW2uttddbe7aq731F1x5Zaay21Vl9tqrnfUXO+qutxWdb2j5nxHxeW2uvNtNefb8i2hV9FXHrkrnO8ttbm+aFe4X/yvobe7HX5qP/FTu+O1jhPX2o3ckk+fjjI0JB09etDe3vLYsRQ/v8CZs+as0DJaqbVNe4d1UDop7E53xJ3usw/6zmf1xuRXmC9Xc/715WXiy4iIncscvo/Lf5la0ulsf8AwOM/bZo+R7dWkopephU12B43ME+vjf0zQOOkafI+UktdyzCXywJlMV+vNek5xjm726sssLEMTt/kn+d3pSrx5a6/2noC06gNa5kcuNV8qfnkp477xSmP3q0QTC+dDseXfFPbF3X8Wed5lkZ6x7+3+6ITwRdtPn75XseeE68HYR+cunl+he+VcYV9yYetxM2WLy6VWu+x2+WbFF7xIzCg0U95qm9oUe6chLqPOYtuu1arxEbdLTVSsnX56Fpf1LPQiMSLteVx2z/kHXdGZpNP3O8Nvk0JvPg+82en77+cePz9xudrq+MMT29TWY9+0HE5u3p/YsCf+kVnso50x9abRD03PPTQ699D43EPj6Hrj6Hqj6Dqjs3XbztZuPVu7+Uz11rO1W8/WbT1Tt+VM7ZbTtZtP12w5U7fldN2W07VbTtdsPlWzKapmc1TtpqiaTadqNkXVbIyq2BRVtSmqalNUzaaomo2RVRsiKzZFVW6MqtoUWb0xompjRMXG8MqN4ZUbwytGEFG+MRxHxcbwig3h5RvCKgzCygzDyg3Dyw3Cyw3DyjeElW0IKzUMLTUMLTMMLTMMKzUUXZYYhBYbhpQYhpQYiFBsGFJkEFZiEFJqEFJqGFK2XpRZvCGkxDCk2CC4WD+kyDC4yCC4yDCoyCCIaBBENAgmGgQX6QcWGgYVrQ8irg/EUbg+qNAgkLg+kGgQWLg+sFA/qNAgoMAgoMAgsHB9QIF+QIF+QMH6gML1AQXrAwoM/PPXBxToB+SvD8jX989ZH5CnH5C3zj9/nX/+uoB8Pb/s9f75+v65UvDLWeeXs843Z51vjp5fjr6vCOt9cvR9c/R9skWpT/Y6aej7Zq/zyVrnnaXnnbXO54Ge94N13tl6Pg/0vDP1vDP1fDL1fDLXeWeu887U887U9c7U9c7Q887Q8crQw+Gdoed9X8/rvq7XPT2vDF1ChlwSfulV9KVn7grn+0ut/714d3hgYtrpzD6PXzs8fyV5pfcRfu3c7fWtl5e3o2Py9V8OOzhkX7tWFRgUtkxjS8Cd3pC7PeEZfVH3+85lvYzJeRGb9yIhrzexoOzgcjWPtFffl75OvZO92VRPd6+LyeHjOy1DwjL7v7n5g6me8YYjrib7HDccPB+d8zL19i39A2aGB5zDsl4nXPpuh6mVqX/yfocAl+Ss0zFJB9zOE662XSl/een2zYNau0Me9F6ID9JU3L/N0mmLyYldLnculZAiz5zbbHzc5IVaWjUAACAASURBVJD7Pvdr4QkRqoaWxhYndmzfOHvD6eiMSvMTLofjH8Zejlmhe+VCSX9qyWPbPYqHrzTHfHthvfq+LYecNm0/senw92ey2kIio832OW4zO2Bk+2vMgwZr0x3a5l5WZ+8f2OxsFVN1Mb8vKb8/Lqc75kHX+Qc9p+93RdzpDL7Z7nfjGeHfTzx+fu589fGJ7x/bfNd67Jvmw5eaLC+2HEpq2pfQsD+hYW9Cw76Ehn3xDfsTmszjG/bGNZrHPdoT98gs7tGeuIY9cQ1mcQ1mcY/M4h7tvlC/J+6RWawIu2Mf4jCLfbQ7tn53bP2u2LrdsQ93x9Tvjn2063z9rpi6nTG1u87X7Dxfu/N8/c5zdTvP1+48V7fzXN3Oc7W7xMqOczU7zlXviK7eca52R3QNju3R1duja3ZEV+84V70jumZHdNWOs5U7zlbujK7cEV2942z19uiq7dFVO89WbT9bueNM5fYzldvPVIhRiRfefqZiB55zunz76Yodp8u3ny7bcbrc9HT59tMVpqcrTE9VmJwqMz1dZnq6zORUmcmp0u1RZaZRZaZR5aanSk1PlZmeKjM9VS5WykyiSkyjSk2jSk2jSkwjS0wii00ji0wjS02jik2jSkyjik0ji00ii4wjiowjikwii00ii0wiikwiik0ii01EmUXGEUUmEUXGEYXGEUTTcKJJRJFJONEknGgcVmgcTjQJJ5qEEU3DiSZhROOwQlH+CAqMw/KNwwqMwwqNQguNQguMwwqNwvKNQvO2heYbheUbheYbheYbheQah+SZhOSZhOQbheZtC8ndGpK3LSR3W0iucUiecXCucXCucUiucXCuUXCOUXCOcXCOXBKuIBBXuOctdbq3xPqXJWYRocnpccQ3QXd7rvmntivpP12j07Twy8effda7cnn3sqUUNRWKmkrHF19UfvBxu6JOh6JOh6JOp6JOl7Jul7Jut4put7JOt4pq8/T3nq7R61fT61dZ+/izD/IByAfg4TK1fjW9fjXtp3Nn5AOQD6Y3LFLuU1vXr6Ra/9H7BRDUtnpdv4p60wfvly5Q7FfT61fT7VNb90JNt19N74WaXu+aNU3vz25X0u1XVX0IQD4A+WDus9Vafap6fUqqDTNmFIBJVZ8s61ZUqZs8OQ+A0mkziLOWdSmqNS74vHmZRteKpRUfftmtqtunqt02573mlVq9quot06blA5APZrUsU+9RWdv+r8/LACiAFBpWaPWqaj+f/2GhwpTqT79s+mhB61K1HmWdHhW9HmXdbmWdLiUdkpIOSVGnY83a52u0n63WfrZK++lXWo+/0nr8pVbbSs2WlZqtK7SaV2jiaMKV5ZrNyzWbpKAhRxFdNi7XaFqmIZE5fKnRtFyjcdkw1GXqTSKoS9ySwFL1hmXqjUtF+ti7Erpa41L1hqVqDUvVmpaqNQ5jmXrjUrWmperDmU0S6fAjDUvVGsVKw1K1xiVqDUtEmaPQtFStcckwVPG0Qaw0LlFrWqrasES1YYmqZ9Aty8Qay/iaw3FVh+MqD8dVHY6rsrwgVuKqDsdVH75QZXmh+vCFassLlYcvVFpcqLQchdhKy9hKywtVFrEVlrGVFrEVFrEVlrFlYpRbxJRZxJRZxpZZxJZZxJRaxJRa4HpsmUVMqWVMGQ781qHzJaL0fKnF+RKL8yWHpCGXhJHXK8N+Kg1IyfW8kH7ILTrm+7s/1VKSiK+LXM8KAOACgEEKKID4APABEACAAiAQKRAKiSHORyExAIQCSFQeAigAKAQEEBBAAIVEJQWiwtDIU2JgQFRMAAAGRJfvBkjUxEhD0KgmRmp7W7WCUQVEI4LwZ0XzAEGikgASVSg9OgEAguEHJSaKLzlX4sFKQnavgIzpGtttuY8Pl5F8Ee9Q/ndA8i1L1i+QU/ItwwEQCoAAhgUA8ACIP53uff2xz/U232stvtdafK61+lxr9fm51edaq+/PIvhca/G+1oKnOLzEOb4/t/r81CwHTT4/NXnj+rUm35+avWXB52oTXhJXvK82ef3U6IWnuHK1yfvHRknIJaF9wHk7v3PHCVEWjgGmlifjf7ib8Zj173pqjc95PoCQadOr9bclQ9AlGCQDEVKnTuvYb9N50LbzoG3nIbsuEWy7LWy7Ley6LWx7Le16Le16D9v1Wtr2HbbtO2zXd9iuz9JOpEjp9qLU0r7P0q7P0r7f0m5EOSy+PGwvqtPSrtfSrm+4/sN2fZZ2vYft8XQ4U7Jwr6Vtr4Vtj6UtrvRa2vVY2PZa2PVY2PZY2PZY2vZY2PUMX0rptt0Wdt2HRIPqPmTbdciGdMim65At6aAt6aBtx0Hb9gM2zw/YPt9v83y/zbN9tk/32Tzea/N4r3XbXuvHe63bzK3b9lq3ipU2c+vWvTat5jZt5tatIti0mlu37rFuNbdp22Pdtse6bY+VRDoarSLYtO6xFj24Z7iqEbTssWrZY926x6p1j1XrHus2MyuRbiaRiu+KU2vpzGFYtZhbt5gPF7NqMbNqNbNqNTsuVkRoMbNqNTveanZcIlNSt5KVf7zVzKrF7FjrnmHdqmX38Raz46LUzKp19/EWiWqfbduP24Prl3Iu5PfF571IyO1NyOlNyB2Lvvjc3vjc3oQckRKfg6MnLrsnPqcH1yUgfZnbE4+fP+f2xOfiB9E9iTm9CSL0jEF3fFZXQnZ3QnZXfHZXXHZ3XHbXKMgl4bNnT9paW+rqa4n5hefjL6b++qDqhSD/Obst9AIfAOaceb9UdfvFfh8YdyUg9kpA7PcBMd+HJl0v6BQUdAoKSAIiCS3pQku6sNJutKxHUNYjKOvhV/Wi1b1oTR9a1YfW9Atq+gU1L9DqPrSmH61+gVa/QKvFynBObZ8UavrQavzxPrRarA+juhet6kOr+9AaaVT3oVW9guo+tKoXreoVVPcKKnsFlb18PK3qQSt70cpetKIHregRlPcIKnoE5b2C8h60vAct6xFUdAsqugUVPYKybkFZj6Csm1/Wg5Z18cu6BWXd/NJufkkXr4TEI5K4RZ0osVOQ38HPe87Pfs578Iyb9ZSf8YR37wnvXhvvdhv3dhv3Viv3VivvZgv3Jp628NJbuTdbeDjSW5D0ZnHazEtv5t1s5t6USmVAVLiJlz6sN3PTm7npzcgopDUjac1IehOS3oTcbELSmziy0cxJb0LSm7jpTdy0JiStiZ3WhKQ1ccSpLDSy3w2ctEaOhM6+0chOa2TfaGDdaGCLwcKR1jg6RwLsXx/RbzSybzSybzRyMrOe4CTM/aX810ZmegM7/SEj/SEj7REOujilpz1ipD3EwUx7RE97yEx7yEx7yEirZ6TV09Me0tPqZeEhLe0hfpchUh7S0+sZ6fX0dFx5SE+vZ6TV09PraWn19PR6eppIoaXV0/A0rZ52o55+o552Q6SLUrkkfPr0SVtrc319XWF+YWxC8tU7WW0U4cM3KOlUPA8A9px5dUPCuiGs9jVaN4DVD2B1b8TpIFY/gD0cxBqGsIYhrIksbBzCGslYIxlrIWMtZKyVjLVSsFYq1krB2qhYK0WEFjLWQhUXGMJahyQUSUjfbcFBFqdy0DwkSofRNCgDjYNYwxDWKFYaBrGGIaxpAGsaEN1tHMQaBrGGAaxhAGsQ648GsYeDWN0AVv8Gq3+N1b7Gql9hlS+xyldY1Uus/CVW/hIre4GVvsBKXmClL7DSfqzkBVbSPwZ974TiPqy4FyvulVKK8HwJpXhsSclLmXdHFFR0S+KySDLz96JIokVcL+pBfxewgh5BUS9G7MOKerGqig4BAHwAajOriT1YaQ9W0oUW4+iWSLvQ4m6suAst7sKKu9GSbvwSKxYXLulGi4fRJaFLZJaIi5V0S5WX/SwJLSahxZ1oMQktESvFnQJJjEPCpy2tLXV1tfl5BXFJyf++n9WFYE9paP/5eD4A7HnzniHCZ0ysnYG1M7BndOwpHXtGQ58z8BR9TkPb6Vg7HXtGx54z0A4G2k4XdDCwTgbWyUA7mdgwSBJ6JxMvIM5kjEYHnskcKdDBHH23g4F10KXBwNoZWAcTa2egHQysg4l2MNB2BvqcgbZLK+3SOc/p2HM69pyGPadhz+jYczr2jIY9paHPRoA9o6FPaegTOvqEhj6loY9p6GMa2kZD22hYK5XfRsNaKGgrFW2lYI0UtIWCNpPRFgrajOtUtHX4S0HBWihYExlroWCNZLSZjDVRsGYK1kT+89FMEeEtJSloEwVr+nP7QHkHXV6OdN8ayfwmCtZIRZso2JOGDh4APACeFlc30ITNVGETGWsko01kYRNF2EQRNpHHgDKiNJIxSf2vAdpIRmXekkvCJ0+eNLc219bVFOTlxyVdTMvM6kMxEg99ExfPB4A7bx5JIOwRCHu5mAgI1sfD+hCsh4vi6OOivVy0l4v2c9E+BO1D0H6uCH3cEX0EPLSfh77goi+42Asuhme+kICMR8Q1vyN6OYI+BO3jCIbRiwh6ESldEj0I2o2gPQiKK7KAdSNYF4J2czASB+3moCQOSuIIOjmCTg7awUE7OVgHG5UBzojezkHbOaIcXGmX1t8KUW3Dl3JaHCkp3fQ7NiGpjK3/3av6kyBo5wg6OdhzLvacg5LaOvA4TVdF9TOusJ0r7ECEHYiwnSNsR4TtuDIKiIQis8DvBoK1I5iMHBFGlx+HhI9bcBLmFyRcvHgzK/sVJuxD0cH4eD4AvHnzBlEhBRPSBEIaKqRjQhoqpGFCukBIw34b6L+x/J8Lqhi4TsGEFAllBOiYHGmQMSEZE1JQIRkVUlAhWTp/GHjOoKxbE/hNGMKEQ5iQggkH8Mv2DhQADAKDVdWD4nfxd5lk+SR8+rSltaW2rjY/ryDhYvLNrOzXmLAfxYbi4/kAIs+YYePhZUcg2Ll72Lt72Lm52zt72Hl62Lm527q527m62+HpWLjJvzWq2DiX71LsbR2wHduZ39Fncb6tWB8ZvvQtezdPO1c3ezcPOzcPOzcPWzdZjb5jB/6kPv+GW39gnn/DI+/YATd3O1d3G1c3W1c3ezdPWw9POzcPXytrfE8YbnHExt3DzoNg7+75P9TncWsbxxI+bWlpqa2vy8/LT7h48WZW1htM+ALDhuLjeQD0AgAWwuBrAB2F4aMK0FEIOgrDByAYguX/84ATMiLQf7sD/wyBAAAQBABYLD5E1YRhPPe/3LPfJOMFZlpa6iRIOCAUvsBQcnw8HyfhbhjchoEDBDnA4ASATsCgBUDQ32rw/wWZmJ8/U8QkhBaLf/CgCSn8c0j45OmTltbm2voRd/SVUNgnQCnx8QIA9QEAzGDgCwEYQBAMAAQBGKqAIfhvNfj/sMAQDCuIfYWJifpDAkEQJJpECABoMQxhEEAlLCEE/j4GYTwStjTX1dUW5OUPk7BXgFLi4/kA9AMAdsOQDwQBaNbcL+bMhBSAAlQOwwDCBcCQpEz5YM7nc99TkM4cLbDCR/P/9fHMcctA0NRZ8z6fM2P8MvCkKZ/MXzDrLaV+j8BSQ4AhWGHO4tVfLvl0xhQwZtCjn/xiral/WPghE70vPpkuWfL9Tz5ZMPfDybC4TgiaNvPTLxVXfvzhXzAA0QhEjU2b84WyirLyl4tmTpsMw6J8WKIYDEHQ9FlfrFilrKT4xbz3Rw1w8pTZKxVXzZv9PgRB0z9aMH/eh7BogmTPxJQP565YpaS05qtPP5oqXQaWP3Xy74gtIQTgxbCCEIaEMNCERCQcf639T8m40dGW5tq62oL8/PiLyekPsl4Khb0oOhQfzwfgBQBg9yRw9pP506evOxq0S3PO6uVLptdNhsZ+4GF4+qfzl2vucTJfM/vzVSsWvS/7YzB79mcz39943GeLyvw1Xy2cPEnWV2zSpJlz565Yd9h199KPFqxesmCm7Krmzv3XrLlGXzvpKy5QWf25PJMzZ/GCFf+aNxmIv6fyXWkIwBCAYAgWfX7xPNz+wwoqe9yDPSy/mgfDAChAsIwZwKfhX2p+IaH29g4h8Vd9TeeMFJs2a8P+gwc2fDUNBvj3G0Bg1mx999BgPd2VQNwzaMR0QpOmTF6trfghfkeUDCvjCQQANHuFvuICAGC8PsWjIRHutuFhtmv/NQeGwIhjA2AYAAAUFAD4QGmTq7unu7O9u9XGWaJlrwABCABo2kwle7+wHaZqAID5KqbHbPbM/wDCpwsAaHhehy3WewuVzS2sQi98Y2M4f+Q2BAEAw5CM/kMQLOqO/BHhNxdDkBACQghoit7A38cMgnEs4ZMnzS3NtbW1eXl5cYnJNzKy+lFhNx8diI/nA0hEwu8NPb0Ck66kpV4+63/Q8JP6KQCMCcxMnrra0jcxIeX6lfiw8CCjL6dDsKzgjeKWQL+Q5B9//Sb5nO8BrZnTJsmY+hkfah31TUz6/pcrscGB3huWTYdkxoHUdpwKibz8w/Xki+d9zRQVJimI15zorQMA5qnuPfXtxSvJ8VGRkX6OR9Z8Bk+aNOmj+Qu+9gkNDQ0JCfx6hcKkj1boOngG71KeNne5ui0h0nW3EgQpKMDwys1HA0PCw/wdrT2stynOe/9faw7a+xG83cPCfB32GsyDYAVZPvm87X6EbbNhAH+8cNWyeVOHJ2rWoi+dvU9qLJoGAIBmzF+/zyEwLMzfjeBhe1hDfxU0efrqXSfDwsLDQoIPGy6ZPHkS9ImKnV/w99d/iImMiIyI3KE8DYYVJs9Xs/IKCA0NifCzW/7FvCmTJ8t52xCkvDfSVg8CIhatOhJ2MTo8MdpFY+HsKTM+UTOxDvDytg0NcDhx9Ngxz8gIu5WQwntrNngFR0RFhHp+vf4D3FJO+0jdxMo/LCzIN8DZ4tDGnVoQgCZ98Pluq5NrVT8FQEHsJYpblegADICBQ7TNhs9gAEMAQABeqbfRPSAkLMzf1kxvroICDE/6fIWJa0R4aJjngQP2Ie7HleR9uP/xJHz67Flra2t9XV1+fkH8xeS0B9l9fCGJiw3EiS3hLgUQOF3lcNAPSV7OXnbaC99XqJA5cOiTL9cGnI70SzrnsHHxNAVY9vxMnqZjE34l2dvV7ajSZzMg0fZ6VE3wPOUN4WfDCIkxVrqfTpVb1fQtLme+uejn7rR/5ZxpMomqMPW9tWZbvjYxWDh79uyPZk1TgMCkGbahoRabVs6dM3exqb2/g8mMaTNW7Q90NJyuMGXax+uORdmsA2DSsnXmET62ixbMX6K2wet8nIPegpkLFE+evuh7QHvhspWHThI2fvmRzFmYNEMr8Nv4EJeDakvmfzRDAYh7tVDpoKvzzs9hCEDTVuh+7WxnuuKzT1ZpHEu6emGD7gowZdrCdZs3rVq1etVqv+jT21ZCkMK0ef/6/ESAg/rs2XPmzP1gKgwUJusdtXXeo7dm1Wp9c/v4WMJH06fg8yU95PfnzJs/T98y8qTx/Lmfzpn14RQFaNaCpau1jTwiYxKTE/2cdq5cpO8b/73bQdXtnpEB+zeuOxLloAVNef/jxcu/1Nvn+/3V5Li4AONFcxcpWrp4HFBaOPuLFWaxVy/tNVUFAALgAx0zJ9fDa9+fDAMA4UYd4H6hxCsEAOjbnbI2nA8AABD0+WoNTx8brVWfz1m4cpeDp5HeqqnvzXYICdmi+smcNdtjvv/RdfvyqZMUZM2ouLp/MAmfP3ve+vhxfX1dYUFhfGJyWmZ2DyJ8zuK/jhVbwl0KkK+CpvmmL6d/rGxovGrlvxQqIGisJQRgzqLP9bTWzJqvZb5XD4LkuX3w2n1blk2brbnZ+ItFc2A5AZ5PVyzWUV7x4QLdPWbaItdNhijo7duyZOb8dcZGn376Ee7ojC20apPW/nUq7wEgYukXu0NPGsJAQQGCp0z/cL+jp/psaKGp74kN0wEEIKV9IV/rADB70+5DK5QXwWASDGAFAENA4f3PV+8/fOCr+RD03mz9/XabFWfL7PnspWs+nTVLbduRgIQfgvcsEuVC0HJT90DH7Z8BCEz9QHOvg6nKJxAA0Ix5RsecdHWWT57+haljUGREUGCAb0zCxV1KMATB095772vPI8shAMEKEADgvZXHA6MjT4cHBgWHhYZEhNmrTJ8mWokS6certnuFBIdfSL19NT44ONzjyOaFH08ysnILPRufcMrN3NhgxVwY/ljVI+jkh58u2HjUzXzdsiV7Qx10oS+UtR19/M8m/xRobaCjuPD9KdDKXW6H9eYBAOApM7XNnbebqOHzq7TNLNBx0+yZEAD4xkxiMUAj/9G3PWOFu6PwFOXNVns2roCgyQoAWqS+8cgOw8+U9/t67wAAQBCkZhHssOlzeR4++MeTsLe3t7Ozs7WttaKi8tK3393IyO5iCZ8yBC9jhgMzk4APPlIFGIYmiQMzctqBYHxjBWRTYqQUjH9CxzlvFFU1foARgiBo3KpWb9L/2ljrg6lTvtDfYaS5fMZ7S918rZa8B0MAmjZjlaXb0fnToYU7fAg7PgPT5649EnDBcT0AM9SMLI/t1Zk+WQGGPlYyNDdWnz3j89XmFvu+nAeDmXP099vKI6GefXSsn6ODg71jWKid5iIYVoAhCEDQEh1rguOOBQCGFGYqG9kc2LpqBgDTZi+2CzhlqLvygyX7vIIs5k2DwEer3SKjd62BIQBPe+89a98Ta2YAaJGu5b7186H311ucPLDlS1gUEoRGzJB4MsT/gSDFPeFWOhIe49Sl6iaWTg7793vaH1VW+ETNPfDkrE8/33DUbY/u4iX7wu218ec+2+vtvX+/lbuT5aLPZy1bb2W1X/09ACbNnHXQ8/ze7TgJp2nttPax1v9kGhDPOfTBHM0DJ49sXLlgqqg5CABg4HDW2nA+ADCAFJbrbD2yV/+jKRAA01bp7jDapv7hgjWugdYLZ0IQDIzdztpvXDDeWwb/aBLu27dv7969u3fvNjYyNt6+65e72Z1M4VO64OV5icCMDwQAUAAQDMOToElQuYK8jxYEgCgCNh5zIBhn4bjHjRAAEKTwx6ua8aUeISIu+XLCqRD7tXNnTYZgpT2+iZcS4+ITEi98c3zrbAiCp646ePHKxYTkpLAziWk/XDy07tPpH8455BkQn5CUkPDNed+jaks/2OgY9/P1a4GHFBeZOFz9JT3Zb/+ns6aObe6D+Us0DI0dPdx2Giz7eJICgGAIwBAEPluh5e13fPUcCACF6Yu17YLPJycmJcXGf//dD4mJXp8uWW0RlJCYmJT4TWLy5X8n+h5YMQeCp763yT32u0sJST9EH/xq4UwInvnJAvuwqITEhISE+MREgtq0KXInZs3u4GNrJXbIk+au3uh+JjEpIdVm18p1FoE/37xxymnHBuf4bwMOGZ44d+Wss85iGICZhs5nkxKTz3sdWDh36tS5qw75RV9KTEy4EP/D5e8vfhu0dOFsMGXuJkvHbRtXT4IUYHH9n634+rvCX7y2qM4EEAAfaWx3OJMQ/1Na5o2rlxIT/TbPmzV19pID7lGJSYlxCUkXQlw0V8xUmDxV93BQ4qXE+Pj4S99est+04P9vYIbBYJDJ5P7+vtaW1u9/vPbr/awuRNjOQEfc0d0KkI8CBCAYKECic8LxifE/J8Mh4mGBYRgPskuWgYfj5xKP4SZbohb8MwPD8t/+tE8WbjLetvQTILWq3p+/45itidYXsFRtorMCIIoQSoSz5XVdop+/fR7EQxZXItnqcCmpwYlLwuIynyzTtDlptWIOwA+NR8yv9J4QEs/eyI5DYsh4xpQZ7y1euWrVqtVmziF7NOeO13Pwjybhq1evevt6nz1/VltT+03qlbTMrF6+sJMjeHMhXiCyhArABwbijRkEYFD+e1bA/xuBJCAlC776Sl918VS50Ye/h8xeoa+luRSIYjJyj2reRT76dOE+WxcnZ8cju3UgaLzfQv7DSfjy5cue3p6nz55WVVVdTrmS/iDrBSbs5qFD8fECAF5CAOyeBB7C4BoE/QyBaxB0DQYdAFL4O439PyyjAvd4HiR19+8u4274f1steD2wrEmTKvlPJmF//4uurq7HTx5XVVZfTk1Nz8p6jQp7BALy8C9m3lMAy2BoCTxpqQK0FIaXKsBfKCiMF1D5fy3DZ9MSqfgWJCPzbyijvy9/rC75we9RbfyDSVhf/7CqpqqomHj/3v1zsbE3s7JeolgXIhiIF7ujkAJQgIaPwSEAg0n/7cH8LQUSb8n+TstGlowM4c8YCQRGx3hlF/onk7CyqqqsrCw/P//WzVtnzp1Pf5DVy8PaWejr2GESTgKw5LxDAAYyzwknRCxj94T4uSks+6c/fzMRh6dEJuxPsIQw/o0fN1T+TyYhm82m0WmvXr953NZ29edf0jKzuhFh26Cw/3S8AMJJKPU79b/TmCfknyLDq24xAEIYCCGgKTKfkJyfU/1PijwS0hn0IfJQX39/a3Prlas/3bif/YSK1XYzO8LOo/gRBQyLf5sr/opDkgHACUzgLwUY+WECgBfj/xg0BDRh/AePfyvPQh4JyRTy6zdvunu6Gx41fvfDj/++l9X8hlf6ZPBZwGkUQP0AAOhjAG0AwASANQDSAEAPQNMBgP7CaZ/ABCQBAAAiv3UxBGEAYBJ/yiS6+7cQeSQcHBh88aK/s6PjYf3DlCs/XL+T1djLIDb2PvWJQCGIBYEUMCsFMkiFjVPh1amwegqsmwpPT4GhFAWQogBSxek7YviR3/TUH0HK7200Zczj/5ne/u5G/8Nd/SON/oY3AksoMPi3AoTBAIOB1t8x1CyPhK9fv+7v6336/GlNdW3SpW9/vp3V0M3Me9jZSggd/j8oYPjnB4IxAGEQEKcTmMB/BBAYXm8oBDBIvCcE4B/ijvb19ZFIpMeP24qIxVa2J67dfPCoi17Y2PMo/gp9/YbWhV9kA5ADgVwY5MEgFwK5EJwLg78L8v6Ckv87+Dv2+bePDsqF8YWHQ3S5EsZ/efSPCMz09PR0dHS0tLSUl1Vc+vbK1fSMh73MoraXxW2vn79iDsXM5AAAAR1JREFUObj5j/xYHwLSP9+fwAT+GxDJ34Z6IyKPhJ2dnc+eP3v46GF5aVlcYvK1m5mNvYyqDkoNid5F5jp5hf63Oz4hE/JPEXkkzHzwID4hvqamOi8vPy4x+Wp6ZutLTkM/t/kV+pKBufiG/7c7PiET8k8ReSS0trG2tbU5c/ZMdlb2uQuJV9My2l5yW94IHpOxNxzMPWCChBMyIX+SyCOhnZ29ja3tkSNHAgODomPif7xx//ErftsA+pyKDXIwj4Cw/3bHJ2RC/ikij4Q2NrZW1lbHvj7288/Xz5yL/eHGvbYXSOsA9pyKDSCYZ+CEJZyQCfmTRB4Jjx8/7uzsnJGRkZGRcepsDE7CljeCJxRsgIO5+09YwgmZkD9H/g9AWbDpl8T2WQAAAABJRU5ErkJggg==" alt="" />

基于libvcirt的虚拟化guest domain overview:

A guest domain may be transient, or persistent. A transient guest domain can only be managed while
it is running on the host and, when powered off, all trace of it will disappear. A persistent guest domain
has its configuration maintained in a data store on the host by the hypervisor, in an implementation
defined format. Thus when a persistent guest is powered off, it is still possible to manage its inactive
config. A transient guest can be turned into a persistent guest on the fly by defining a configuration for
it.

virDomainLookupByID,virDomainLookupByName,virDomainLokkupByUUID

Example:Fetching a domain object from ID

int domainID = 6;

virDomainPtr dom;

dom = virDomainLookupByID(conn,domainID);

example:fetching a domain object from Name

int domainName = "byRuiy";

virDomainPtr dom;

dom = virDomainLookupByName(conn,domainName);

example:fetching a domain object from an UUID

char *domainUUID = "byrui-1990-04-03-15055198367-5160-59158"

virDomainPtr dom

dom = virDomainLookupByUUIDString(conn,domainUUID);

virConnectListDomains

virConnectNumOfDomains

int i;

int numDomains;

int *activeDomains;

numDomains = virConnectNumOfDomains(conn);

activeDomains = virConnectListDomains(conn,activeDomains,numDomains);

printf("Active domain IDs:\n");

for(i = 0;i < numDomains;i++)

{

printf("%d \n",activeDomains[i]);

}

free(activeDomains);

Exampe:Listing active domais

there may be some persistent inactive domain configurations stored on the host.

virConnectListDefinedDomains

virConnectNumOfDefinedDomains

int i;

int numDomains;

char **inactiveDomains;

numDomains = virConnectNumOfDefinedDomains(conn);

inactiveDomains = malloc(sizeof(char *) * numDomains);

numDomains = virConnectListDomains(conn,inactiveDomains,numDomains);

printf("Inactive domain names:\n");

for (i = 0;i < numDomains;i++)

{

printf("%s \n",inactiveDomains[i]);

free(inactiveDomains[i]);

}

free(inactiveDomains);

the APIs for listing domains do not directly return the full virDomainPtr objects,since this may incur

virDomainPtr *allDomains;

int numDomains;

int numActiveDomains,numInactiveDomains;

char *inactiveDomains;

int *activeDomains;

numActiveDomains = virConnectNumOfDomains(conn);

numInactiveDomains = virConnectNumOfDefinedDomains(conn);

allDomains = malloc(sizeof(virDomainPtr) * numActiveDomains + numInactiveDomains);

inactiveDomains = malloc(sizeof(char *) * numDomains);

activeDomains = malloc(sizeof(int) * numDomains);

numActiveDomains = virConnectListDomains(conn,activeDomains,numActiveDomains);

numInactiveDomains = virConnectListDomains(conn,activeDomains,numActiveDomains);

numInactiveDomains = virConnectListDomains(conn,inactiveDomains,NumInactiveDomains);

for (i = 0;i < numActiveDomains;i++)

{

allDomains[numDomains] = virDomainLoopupByID(aciveDomains[i]);

numDomains++

}

基于libvirt虚拟化 Guest domains lifecycle c ontrol API overview;

libvirt can control the entire lifecycle of guest domains,guest domains can transition through several states throughout their

virDomainCreateXML create and immediately boot a new transient guest domain,when this guest domain shuts down,all trace of it will disappear

virDomainDefineXML store the configuration for a persisent guest domain

virDomainCreate boot a previously defined guest domain from its persistent configuration,

virDomainDefineXML command can be used to turn a previously booted transient guest domain into a persistent domain

booting a transient guest domain

to boot a transient guest domain,simply requires a connection to libvirt and a string containing the XML document describing the required

configuration,the following example assumes that conn is

virDomainPtr dom;

const char *xmlconfig = "<domain>...</domain>";

dom = virConnectCreateXML(conn,xmlconfig,0);

if (!dom) {

fprintf(stderr,"Domain creation failed");

return;

}

fprintf(stderr,"Guest %s has booted",virDomainName(dom));

virDomainFree(dom);

Defining and booting a persistent guest domain

virDomainPtr dom;

const char *xmlconfig  = "<domain>..</domain>";

dom = virConnectDefineXML(conn,xmlconfig,0);

if (!dom)

{

fprintf(stderr,"Domain definition failed");

return;

}

if (virDomainCreate(dom) < 0)

{

virDomainFree(dom);

fprintf(stderr,"Cannot boot guest");

New guest provisioning techniques

<domain type='kvm'>

<name>demo</name>

<graphics type='vnc' port='-1' listen='localhost'>

}

CMROM/ISO image provisioning

<os>

<type arch='x86_64' machine='pc'>hvm</type>

<boot dev='hd'/>

<boot dev='cdrom'/>

</os>

<disk type='file' device='cdrom'>

<source file='/var/lib/libvirt/images/rhel5-x86_64-dvd.iso'/>

<target dev='hdc' bus='ide'>

</disk>

const char *xml = "<domain>...</domain>";

virDomainPtr dom;

dom = virDomainDefineXML(conn,xml);

if (!dom)

{

fprintf(stderr,"Unable to define persistent guest configuration");

return;

}

if (virDomainCreate(dom) < 0)

{

fprintf(stderr,"Unable to boot guest configuration");

}

Paravirtualized (full virtualization)准虚拟化 technologies

Paravirtualization ()半虚拟化

<os>

<type arch='x86_64' machine='pc'>hvm</type>

<kernel>/var/lib/libvirt/boot/f11-x86_64-vmlinuz</kernel>

<initrd>/var/lib/libvirt/boot/f11-x86_64-initrd.img</initrd>

<cmdline>method=http://download.fedoraproject.org/pub/fedora/linux/releases/11/x86_64/osconsole=ttySo console=tty<cmdline>

</os>

host side bootloader xen paravirtualized

<bootloader>/usr/bin/pygrub</bootloader>

<os>

<type arch='x86_64' machine='pc'>xen</type>

</os>

BIOS boot setup fully virtualized guest

const char *xml = "<domain>...</domain>"
virDomainPtr dom;
dom = virDomainCreateXML(conn,xml);
if (!dom)
{
fprintf(stderr,"Unable to define persistent guest configuration \n");
return;
}
if (virDomainCreate(dom) < ) {
fprintf("stderr,"Unable to boot persistent guest \n"");
return;
}
fprintf(stderr,"Guest provisoning complete,OS is running \n");

stopping

a guest can be stopped by two methods

shutdown and destroy

virDomainPtr dom;
virDomainInfoPtr info;
const char *filename = "/var/lib/libvirt/save/demo-guest.img";
dom = virDomainLookupByName(conn,"demo-guest");
//id,uuid,name/第二个参数;
//virDomainPtr,virDomainLokkupByID,virDomainByName,virDomainByUUID
if (!dom)
{
fprintf(stderr,"Cannot find guest to be saved");
return;
}
if (virDomainGetInfo(dom,&info) < )
{
fprintf(stderr,"Cannot check guest state");
return;
}
if (info.state == VIR_DOMAIN_SHUTOFF)
{
fprintf(stderr,"Not saving guest that isn't running");
}
if (virDomainSave(dom,filename) < )
{
fprintf(stderr,"Unable to save guest to %s ",filename);
}
fprintf(stderr,"Guest state saved to %s",filename);

virDomainPtr dom;

int id;

const char *filename = "/var/lib/libvirt/save/demo-guest.img";

if ((id = virDomainRestore(conn,filename)) < 0)

{

fprintf(stderr,"Unable to restore guest from %s",filename);

}

dom = virDomainLookupByID(conn,id);

if (!dom) {

fprintf(stderr,"Cannot find guest that was restored");

return;

}

virDomainMigrate established hypervisor connection

domains are defined in libvirt using XML  Everything related only to the domain

monitoring performance

statistical metrics are available for monitoring the utilization rates of domains,

vCPUS,Vmemory,block devices ,netWork interfaces;

virNodeDevicePtr de= get virNodeDevicePtr for the PCI device
if (virNodeDeviceDettach(dev) < )
{
fprintf(stderr,"Device cannot be dettached from the host OS drivers \n");
return;
}
if (virNodeDeviceReset(dev) < )
{
fprintf(stderr,"Device cannot be safely reset without affecting other devices \n");
}

virInterfaceDefineXML virInterfaceGetXMLDesc

xml definition of an ethernet interface using DHCP

<interface type='ethernet' name='eth0'>

<start mode='onboot'/>

<mac address=''/>

<protocol family='ipv4'>

xml definition of an ethernet interface with static ip

<interface type='ethernet' name='eth0'>

<start mode='onboot'/>

<mac address=''>

<protocol family=''>

<ip address="" prefix="24"/>

<route gateway="">

</protocol>

</interface>

xml definition of a bridge device with eth0 and eth1 attached

<interface type="bridge" name="br0">

<start mode="onboot"/>

<mtu size="1500"/>

<protocol family="ipv4">

<dhcp/>

</protocol>

<bridge stp="off" delay="0.01">

<interface type="ethernet" name="eth0">

<mac address=""/>

</interface>

<interface type="ethernet" name="eth1"/>

</bridge>

</interface>

xml definition of a vlan interface associated with eth0

<interface type="value" name="eth0.042">

<start mode="onboot"/>

<protocol family="ipv4">

<dhcp peerdns="no"/>

</protocol>

<vlan tag="42">

<interface name="eth0"/>

</vlan>

</interface>

retrieving information about interfaces

enumerating interfaces

have a connection to a host,respresented by a virConnectPtr,determine the number of interface on the host with virConnectNumOfInterfaces

and virConnectNumOfDefinedInterfaces

a list of those interfaces names can be obtained with virConnectListInterfaces and virConnectListDefinedInterfaces

("defined"  interfaces are those that have been defined,but are currently inactive)

getting a list of active("up" interfaces on a host)

int numIfaces,i
char *ifaceNames;
numIfaces = virConnectNumOfInterfaces(conn);
ifaceNames = malloc(numIfaces * sizeof(char *));
numIfaces = virConnectListInterfaces(conn,names,ct);
printf("Active host interfaces:\n");
for(i = ;i < numIfaces;i++)
{
printf("%s \n",ifaceNames[i]);
free(ifaceNames[i]);
}
free(ifaceNames);

getting a list of inactive ("down") interfaces on a host

int numIfaces,i;
char *ifaceNames;
numIfaces = virConnectNumOfDefinedInterfaces(conn);
ifaceNames = malloc(numIfaces * sizeof(char *));//分配内存空间
numIfaces = virConnectListDefinedInterfaces(conn,names,ct);
printf("Inactive host interfaces:\n");
for (i = ;i < numIfaces;i++)
{
prientf("%s \n",ifaceNames[i]);
free(ifaceNames[i]);
}
free(faceNames);

altrnative method of enumerating interfaces

virNodeDevice

virNodeListDevices virNodeDeviceLookupByName virNodeDeviceGetXMLDesc

obtaining a virInterfacePtr for an interface

many operations require that you have a virInterfacePtr,but you may only have the name or MAC address of the interface

use virInterfaceLookupByName and virInterfaceLookupByMACString to get the virInterfacePtr

virInterfacePtr iface;

const char *name = "eth0";

iface = virInterfaceLookupByName(name);

if (iface)

{

/*  use the virInterfacePtr*/

virInterfaceFree(iface);

}

else

{

printf("Interface '%s' not found. \n",name);

}

virInterfacePtr iface;

const char *mac ="";

iface = virInterfaceLookupByMACString(mac);

if (iface) {

//use the virInterfacePtr;

virInterfaceFree(iface);

}

else

{

printf("No interface found with MAC address '%s'.\n",mac);

}

virInterfaceGetName virInterfaceMACString virInterfaxceGetXMLDesc

const char *name;

const char *mac;

name = virInterfaceGetName(iface);

mac = virInterfaceGetMACString(iface);

printf("Interface %s has MAC address %s",name,mac);

virInterfaceGetXMLDesc

const char *xml;

name = virInterfaceGetXMLDesc(iface,0);

printf("Interface configuration:\n%s \n",xml);

free(xml);

//xml is a char * containing the description

virInterfacePtr iface;

iface = virInterfaceDefineXML(xml,0);

if (!iface)

{

fprintf(stderr,"Failed to define interface. \n");

//other error handling

goto cleanup;

virInterfaceFree(iface);

cleanup;

}

virInterfacePtr iface;

char *xml = NULL;

iface = virInterfaceLookupByName("br0");

if (!iface)

{

printf("Interface br0 not found. \n");

}

else

{

xml = virInterfaceGetXMLDesc(iface,0);

virInterfaceUndefine(iface);

virInterfaceFree(iface);

}

//you must also free the buffer at xml when you're finished with it

activating/deactivating an interface

temporarily bring down eth2,then bring it back up

virInterfaqcePtr iface;
iface = virInterfaceLookupByName("eth2");
if (!iface){
printf("Interface eth2 not found. \n");
}
else{
if (virInterfaceDestroy(iface) != )
{
fprintf(stderr,"failed to destroy (deactive) interface eth2. \n");
}
else{
//
if (virInterfaceCreate(iface) != ){
fprintf(stderr,"failed to create (active) interface eth2. \n");
}
}
free(iface);
}

libvirtsAPI的更多相关文章

随机推荐

  1. Spring事务管理使用

    发现问题 最近,碰到一个问题,再用spring实现事务管理的时候,发现不起作用,在出异常时,并不会回滚数据库操作. 我想实现的功能如下: @Transactional(isolation=Isolat ...

  2. [置顶] hdu 1890 伸展树区间翻转

    题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转. 思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组 ...

  3. 总结了关于PHP xss 和 SQL 注入的问题(转)

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...

  4. Java基础知识强化73:正则表达式之分割功能

    1. 分割功能: 使用String的split方法,split方法:根据给定正则表达式的匹配拆分字符串.如下: public String[] split(String regex): 2.  案例: ...

  5. codevs 1027 姓名与ID

    /* 二分图匹配 建图稍麻烦点 不过 有STL大法带我上天 说正经的 先假设都有关系 然后把确定的没有关系的删掉 这样跑出来的一定是完美匹配 至于确定的匹配嘛 删掉这一条 不再是完美匹配 然后记下排序 ...

  6. Linux服务的管理

    1.Linux服务的介绍 系统服务 --某些服务的服务的对象是Linux系统本身,或者Linux系统系统用户,这类服务我们称为系统服务(System Service) 网络服务 --提供给网络中的其他 ...

  7. javascript基础之for循环

    1.数组定义声名 var arry = [1,2,3,4,5]   //相当与var arry = Array(1,2,3,4,5) 2.数据的增删改查 var arry = [1,2,3,4,5] ...

  8. linux执行文件命令

    1.如果path中有你的程序所在的目录,那么直接执行filename即可 2.如果path中没有程序所在目录,那么进入目录./filename或者path/filename 比如 wj@ubuntu: ...

  9. C#中如何获取系统环境变量等

    C#中获取系统环境变量需要用到Environment 类. 其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承 以下代码得到%systemdrive%的值,即“C:” string ...

  10. WinAPI——谐振动的合成

    #include<Windows.h> #include<math.h> #define NUM 1000 #define PI 3.14159 LRESULT CALLBAC ...