{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3cd4b70b",
   "metadata": {},
   "source": [
    "# rf104_classfactory\n",
    "Basic functionality: the class factory for functions and pdfs\n",
    "\n",
    "NOTE: This demo uses code that is generated by the macro,\n",
    "     which can be compiled on the fly (set to MyPdfV3 below).\n",
    "     To use MyPdfV1 or MyPdfV2, adjust lines below accordingly.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Clemens Lange, Wouter Verkerke (C++ version)  \n",
    "<i><small>This notebook tutorial was automatically generated with <a href= \"https://github.com/root-project/root/blob/master/documentation/doxygen/converttonotebook.py\">ROOTBOOK-izer</a> from the macro found in the ROOT repository  on Tuesday, May 19, 2026 at 08:28 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "07efa79d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:45.988401Z",
     "iopub.status.busy": "2026-05-19T20:28:45.988282Z",
     "iopub.status.idle": "2026-05-19T20:28:46.944727Z",
     "shell.execute_reply": "2026-05-19T20:28:46.944173Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecf2a7e2",
   "metadata": {},
   "source": [
    "Write class skeleton code\n",
    "--------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3683d6e1",
   "metadata": {},
   "source": [
    "Write skeleton pdf class with variable x,a,b\n",
    "To use this class,\n",
    "   - Edit the file MyPdfV1.cxx and implement the evaluate() method in terms of x,a and b\n",
    "   - Compile and link class with '.x MyPdfV1.cxx+'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "305ef421",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:46.953572Z",
     "iopub.status.busy": "2026-05-19T20:28:46.953431Z",
     "iopub.status.idle": "2026-05-19T20:28:47.094512Z",
     "shell.execute_reply": "2026-05-19T20:28:47.093444Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ROOT.RooClassFactory.makePdf(\"MyPdfV1\", \"x,A,B\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72ae2a9d",
   "metadata": {},
   "source": [
    "With added initial value expression\n",
    "---------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7494f5ff",
   "metadata": {},
   "source": [
    "Write skeleton pdf class with variable x,a,b and given formula expression\n",
    "To use this class,\n",
    "   - Compile and link class with '.x MyPdfV2.cxx+'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "992e99c2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:47.096192Z",
     "iopub.status.busy": "2026-05-19T20:28:47.096068Z",
     "iopub.status.idle": "2026-05-19T20:28:47.201439Z",
     "shell.execute_reply": "2026-05-19T20:28:47.200360Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ROOT.RooClassFactory.makePdf(\"MyPdfV2\", \"x,A,B\", \"\", \"A*fabs(x)+pow(x-B,2)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e3c06be",
   "metadata": {},
   "source": [
    "With added analytical integral expression\n",
    "---------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3bad8338",
   "metadata": {},
   "source": [
    "Write skeleton pdf class with variable x,a,b, given formula expression _and_\n",
    "given expression for analytical integral over x\n",
    "To use this class,\n",
    "   - Compile and link class with '.x MyPdfV3.cxx+'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "852f13f4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:47.203073Z",
     "iopub.status.busy": "2026-05-19T20:28:47.202947Z",
     "iopub.status.idle": "2026-05-19T20:28:47.308032Z",
     "shell.execute_reply": "2026-05-19T20:28:47.306958Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ROOT.RooClassFactory.makePdf(\n",
    "    \"MyPdfV3\",\n",
    "    \"x,A,B\",\n",
    "    \"\",\n",
    "    \"A*fabs(x)+pow(x-B,2)\",\n",
    "    True,\n",
    "    False,\n",
    "    \"x:(A/2)*(pow(x.max(rangeName),2)+pow(x.min(rangeName),2))+(1./3)*(pow(x.max(rangeName)-B,3)-pow(x.min(rangeName)-B,3))\",\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bf4b888",
   "metadata": {},
   "source": [
    "Use instance of created class\n",
    "---------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41b2cdc0",
   "metadata": {},
   "source": [
    "Compile MyPdfV3 class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d206336c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:47.309683Z",
     "iopub.status.busy": "2026-05-19T20:28:47.309539Z",
     "iopub.status.idle": "2026-05-19T20:28:52.665028Z",
     "shell.execute_reply": "2026-05-19T20:28:52.664469Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(MyPdfV3) An instance of MyPdfV3.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "94285276854512"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TUnixSystem::ACLiC>: creating shared library /github/home/master/notebooks/./MyPdfV3_cxx.so\n"
     ]
    }
   ],
   "source": [
    "ROOT.gROOT.ProcessLineSync(\".x MyPdfV3.cxx+\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b928ee31",
   "metadata": {},
   "source": [
    "Creat instance of MyPdfV3 class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "64d62c04",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:52.666954Z",
     "iopub.status.busy": "2026-05-19T20:28:52.666826Z",
     "iopub.status.idle": "2026-05-19T20:28:52.810185Z",
     "shell.execute_reply": "2026-05-19T20:28:52.809651Z"
    }
   },
   "outputs": [],
   "source": [
    "a = ROOT.RooRealVar(\"a\", \"a\", 1)\n",
    "b = ROOT.RooRealVar(\"b\", \"b\", 2, -10, 10)\n",
    "y = ROOT.RooRealVar(\"y\", \"y\", -10, 10)\n",
    "pdf = ROOT.MyPdfV3(\"pdf\", \"pdf\", y, a, b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad5f4728",
   "metadata": {},
   "source": [
    "Generate toy data from pdf and plot data and pdf on frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "486163c7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:52.812101Z",
     "iopub.status.busy": "2026-05-19T20:28:52.811974Z",
     "iopub.status.idle": "2026-05-19T20:28:53.111822Z",
     "shell.execute_reply": "2026-05-19T20:28:53.111312Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(pdf_over_pdf_Int[y]) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- using generic CPU library compiled with no vectorizations\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 680.144 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_pdf_over_pdf_Int[y]_pdfData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x55c080dc5300>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame1 = y.frame(Title=\"Compiled class MyPdfV3\")\n",
    "data = pdf.generate({y}, 1000)\n",
    "pdf.fitTo(data, PrintLevel=-1)\n",
    "data.plotOn(frame1)\n",
    "pdf.plotOn(frame1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c2dcb71",
   "metadata": {},
   "source": [
    "/\n",
    "Compiled version of example rf103#\n",
    "/"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57e7a949",
   "metadata": {},
   "source": [
    "Declare observable x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5ae219d4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:53.113814Z",
     "iopub.status.busy": "2026-05-19T20:28:53.113683Z",
     "iopub.status.idle": "2026-05-19T20:28:53.217008Z",
     "shell.execute_reply": "2026-05-19T20:28:53.216483Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -20, 20)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "317d81b2",
   "metadata": {},
   "source": [
    "The ROOT.RooClassFactory.makePdfInstance() function performs code writing, compiling, linking\n",
    "and object instantiation in one go and can serve as a straight\n",
    "replacement of ROOT.RooGenericPdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9e77dfd6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:53.229459Z",
     "iopub.status.busy": "2026-05-19T20:28:53.229323Z",
     "iopub.status.idle": "2026-05-19T20:28:58.451006Z",
     "shell.execute_reply": "2026-05-19T20:28:58.450553Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TUnixSystem::ACLiC>: creating shared library /github/home/master/notebooks/RooGenPdfPdf_cxx.so\n"
     ]
    }
   ],
   "source": [
    "alpha = ROOT.RooRealVar(\"alpha\", \"alpha\", 5, 0.1, 10)\n",
    "genpdf = ROOT.RooClassFactory.makePdfInstance(\"GenPdf\", \"(1+0.1*fabs(x)+sin(sqrt(fabs(x*alpha+0.1))))\", [x, alpha])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5662580",
   "metadata": {},
   "source": [
    "Generate a toy dataset from the interpreted pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "9330ef0a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:58.452400Z",
     "iopub.status.busy": "2026-05-19T20:28:58.452278Z",
     "iopub.status.idle": "2026-05-19T20:28:58.581469Z",
     "shell.execute_reply": "2026-05-19T20:28:58.581050Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GenPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GenPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n"
     ]
    }
   ],
   "source": [
    "data2 = genpdf.generate({x}, 50000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3bd039bd",
   "metadata": {},
   "source": [
    "Fit the interpreted pdf to the generated data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "55a3ec6f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:58.582892Z",
     "iopub.status.busy": "2026-05-19T20:28:58.582768Z",
     "iopub.status.idle": "2026-05-19T20:28:58.725379Z",
     "shell.execute_reply": "2026-05-19T20:28:58.724925Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(GenPdf_over_GenPdf_Int[x]) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 740.642 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_GenPdf_over_GenPdf_Int[x]_GenPdfData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GenPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooFitResult object at 0x(nil)>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "genpdf.fitTo(data2, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1af57c80",
   "metadata": {},
   "source": [
    "Make a plot of the data and the pdf overlaid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bf6bf2cb",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:58.727277Z",
     "iopub.status.busy": "2026-05-19T20:28:58.727154Z",
     "iopub.status.idle": "2026-05-19T20:28:58.835110Z",
     "shell.execute_reply": "2026-05-19T20:28:58.834618Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GenPdf_Int[x]) using numeric integrator RooIntegrator1D to calculate Int(x)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x55c081715770>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame2 = x.frame(Title=\"Compiled version of pdf of rf103\")\n",
    "data2.plotOn(frame2)\n",
    "genpdf.plotOn(frame2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2d72ece",
   "metadata": {},
   "source": [
    "Draw all frames on a canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "e8feaa88",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:58.836770Z",
     "iopub.status.busy": "2026-05-19T20:28:58.836647Z",
     "iopub.status.idle": "2026-05-19T20:28:59.064222Z",
     "shell.execute_reply": "2026-05-19T20:28:59.063760Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf104_classfactory.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf104_classfactory\", \"rf104_classfactory\", 800, 400)\n",
    "c.Divide(2)\n",
    "c.cd(1)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame1.GetYaxis().SetTitleOffset(1.4)\n",
    "frame1.Draw()\n",
    "c.cd(2)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame2.GetYaxis().SetTitleOffset(1.4)\n",
    "frame2.Draw()\n",
    "\n",
    "c.SaveAs(\"rf104_classfactory.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4cbbfa96",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "eeae6569",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:59.066104Z",
     "iopub.status.busy": "2026-05-19T20:28:59.065974Z",
     "iopub.status.idle": "2026-05-19T20:28:59.252373Z",
     "shell.execute_reply": "2026-05-19T20:28:59.251910Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222539242\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222539242() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(45820,'WkwI6jsA/LIAeAHtvW1zXDeS5/tVFIx5cW8EdC4yASSAOq9k2R73rh8Utrstr2+HgpaKUq0pUkNStjwb/d03folTxSKLkuVu94x7pstmqRLAOXhOAJn5T/yfoydXP79anx2/XB+tjr5+eHz24/HlN+vvvzo7fnX54vzqKByd/PFs82+v13/48GgVw9HJB5ury/Hri+//9/rpFeFHJPvi1dXm/Gwh/ufm7NnRKoWjk92bVv/nrrzelkFKWVPO4ejk083Z+uH56fnF0UoW8qurn0/X1+Q3m2dXLwb58eb0dElMYSG3iWP0x9cnV58dXzzfnB2t4kTIl5vnL24FfXB+dXX+8mayr89f3Qx4fLKhEBqOTr69/vlg/OTFjy+vjq/IpXfS3KAeDIqHP744frm+XW7CblV8l+5mhXZJt8HbV/L4fsvwyg/OL56tL77a/PvSenuBn50/W49+fSzj32+Xfx/raNtvl38fX50/+P7y0ebN+vSH5Ymr87vIo1XtRtVvPJCqN9n1IzcDjlb3R8AfbzxFb/7x+pl9cpvNn248MF7yp+tHbgbsstlW5er88VIbr8ohSU/GKFpMm+RYYyrSwtHeC779YTTU8gJIyrklj1b3eYNaa1I15hQl1sJAOT3/6fMPHy6tvk88/uMrj6BTv937/c0u9JPdrwffX9540YPvL2+868H3l9ePPfj+8vrJP7556dOBJv75+uebl8dvRoX++PPu59cv1lfHR6vkFXuxWX49uHy1fnr15fHV5nzU4vPXL79fX4zfX2+e/vDm+ufP4+en58+XwE/Pn1+H/fuIfXT87NHx5ozpE45OHl6cX16+ON4sL9yRj84XVrQ/rhldg74e0p+dP9ucbNbPjlYnx6eX63B08q8Xm2dvbpI/X5MPvr98eH5+sZf+o2ebq+PvmfBXF695wcebN+tnN+q9ffWji83LzdXmx/XlAc/7dHMJS92y24U8vrg4Wn3353B0/uqKH38JRycfvVk/vTxanb0+PQ1HJ58P/nxxIjE/eXp6fHl5cvz06vziZ9jn15sryvWW2M9fv3x0fLq+utoyURr08/Wbq8PQD//w1aNPH3x7tDr6l+3PcHTy4fnr70/XH7w+Odl26Jfrq+PNGa25tMXjy82/r/94uY3/9ibpsV+uj0+PVkrmHj1ogf5mc/bs/Kevz18xxfbpb/fphZVdJ/hkDeNeBshPWybw8MXRMtMfHl9dHXTAg6urscZRs8cfrK9+Wq/PFiZ+g/JG/fji/OXX56+OVjIxqh4/O76CRzrx7ZZgkXswCPlLOPrhs/Mf11+8Ov6317ux8sOXa1rkZuDJJ5vnLz6lCst65eP2+Orpi22z/vDVi/OfPvpxfXb11dXx1evL3fD84cHrq3MGyC7lZ+uz1x8cXwya4fPgKQNw98TJl+vjZ1+cnf68feLkm83Vi/PXV/tjdTt+Pzm+XEbfNmQ/1Xe3lvHfbLPAWv/WzcI36++dH2zOnr9tx8DIeMjUWCYL6cYWZT/gFYP0KK60lLD8zbKKIYY4q4fyK62ix8Y5e5yWMpfdM3G2JSXhdUnL77ZqPahIaHnu/G45qNgsZJjD8jeLrKRrkKZBqs6iq2rB/58lrSRqWP5mySvRGpa/WcpKSgrL3yy2ktrC8jdLXWnMYfmbpa1Ue1j+ZukrzRqWv1mjJ5bO83FWuUnqSnoK0iWItVnTSpoFaZBp1jzytRKkxFnLSloiJkgps1KqpZA5zlpXUkqQrEFSnLWtJBWvYLNZ+0pqCRqNkswpriRp8KwtzUlWkiolCGJxTrqSFIOUFnhxSiOf1sazNJWOfEqaU1mJ1ODP5zInW0nMlMCLnOpKYg/+QNI5tZVo9nbV2OfUr1u9lDnHldQYvLpd5iwrutjLnMqcdaUqwdsHkqZqo5ApzjmvvInpNc1zLitvU4ohfc624jU9h25zriMbGirXObeV5yhezDn3leQavBKic4leCB9ic5GVZAs+Zuei3g4LkVa9bX/nVc3b32VVZPvbVlq3v+sqbX82Bvbymr6KITOAy2xxFYO18Zup02X81hWV8mk1GzNIUh8xTCJGhz9eIFodhJGHjEzMZ1JacvHcfZLKbGTvhNa5kr8TMc+VAkBIi3OlBE4Um+t2DtO/lRJ4TGxzpQQQrczVC1BKMJnrdianOtdt9pLm2lmnSBTnFlejgPyWVfFq8FtXzZuB30zhwV3i3BiV3gwQY/our2Ka2JZg6u4yYeJ6M/AM09ZbO8S5L4wrNQgZHEkyxGBe0mFfPXmMmEHkQWSFGFyMQRXnPthY9zdXT1WF8Oa/c+V399+aQpwlxpWIhFycKUgUH6FZQ9ZZog6m0OlemSWmVatBfNQQnb0eUiwkyLJSbSHVUPIs0VZSYqhM0D5LhGWYpxXjVUxPDSkFVUiaJBitKrM4by3MIZ1FYGMSkgSFUm9VmJH1WeCt/OZPyywwV3qThue9UkaJx3gWuGuU0HuQGGeRuoLBUR9ps8BdGXfWg8DR+0paJ2OZReNKMjwrBzH4O3xstFuD1JU/FmtofRZNK02eT5wF1toKy0Jgmgu8VVJwVqYkNp/qKm2UGe66twRolFUXpmSXWekSWOL4mzXCm1JY/malT4T6+N+ssQx+C1uflU5pyVlAnDXWFXOzSqi8ua009VEsqbPGvuIpmHWZlS5hFPDwrCKrKmE8PKuo8+Xl6VnpFPLj4Vkl8+R4eFYpPDkenpX+gKNL5elZpY7SbjNtu8p5rt3Lu82W5Q52NAo9q3cJpR350iWjrtLSrN4lXllNeVbNu9p6znTKUlsKrXDx61bVuq3veLjtKszDaTuH4W0xz2k7jRlMrFvM5GUVH/SYzB4fdU7M522803t7AqfHrCZ9kTkxsZfkTrbdDsJJeNvYbhSZc7zeGMU5x7En4HEo3T0Jdb1PgcosJ6woc460xuBe1C/7ZHbe7/XJTGZoVuOS5szQibqrX5Y4aOKjzpnNEkVkBXVayWupXpbkVMxefvFykJTaiC9yPOzUltXHOYuz+lEvgdXzCOEsNDwQ56ysM6NKunTJ2DPOme3QUiWWtMykXarkVWZ8LFUa8XAS9SqPeHYfS5VoAm3bKo3kfVsnT50iJBl44iROjl6bc9ouev5o8lVv9Pecky+8uwd95d09R3N4p82FIbmMEd5Suuy6etDXXU+JSr/u/BGfR31GHefCkBz5eJFLN4o8em0uvW4pf5fXfVRwLt2rDhV1tkgX+Ko4Wxy7dJ6xSJ2902aL1Ng7bbY4duvsGBiFY4Z5EQ32NWbYQjev8tJts7GmED+6bTZnYT4CR5aMwjECvUrG0uIzbLxOkr+OKlJAVhYfhEvi0R7basn+8cGWXTtcjyfH7Fgqx6rCaBzNoT4Q6LXZGJLb+vEcHGupH6PEYFljhi30svAv3W/Os0b9vKl9l+4zbKHH8jYGiGnfVo+82aWP2jk15ueSMl0foiyNRmFHYuzOmWP+ezTH+O1Dg591ywhHsee6MMKl2efKqFuKWGSuDLqF5OGyq69HXnc/1avL9saLMNdlg0NOnnjUbkS2LQ907tDggUu7FplbHJzAO2VuCxN0JtHirs+JWYozeE9bRuNS3rltR6NzmsZYXMae57FrbPaYgyOPLJZBSGISspQubIWUzgmXV14zQmIWdjSq21hHtww56txYR8ew98RtR3keO17EJtcHINlDLKvDaJ25sYRu+TqvhUky2gYzbvDIheThZSe8FGkZjUsrzG0ZjducxlyFokicGZeM2GwvvGsUisG41I1p0TgyLk3EtGhpNNIYN3O7ZpCUOPl6QZlG2oVrLwt1S9vzwUh8zbM9Iz+ibB/N+2eUlp1j8x5/b3aOPSbf3LKflJZxkrcMm3rm6+JQunxdnPGaXXGoWN4VZyTeFocXlW1pnFhaaCzRc+O4uPSLV6TshpG/t1CihTu3cWpcGnRuZZRoafC5FUrksYhCipfomqREC39sfoZc1oNmY0Eb3Ta3cY4cnTY3P0gujLONg+Qo7dxsLO9jKMzN9hZZ8vfj5PVbR/tsa+0nyt2j40i5jauLKGRboLqsftsi1TGwt41Sx8AeHLvVMbC3Fa1jM7RrhcrJZnvCbnUM7G1DcNAckYyoNgb2WP5aG922TdpGr41FozXvs7FKtOZ7oKU4nDh9bI3O5cy58Exvozam/jaPMfV3efjUX7Loy9rjjy2cetsCC6Ne8l82B75MtYVJL8RgitveXHj0rj8XHr19zW4B8gG98Gh/UV9Y9EJcc2jare+xaEZwh0kva3HUuS9seuTSFz691KRv+fTS1X3h06Mx+7Jn2FJjx7D0dF8Y9RK5SNd8TFEojhs0/PibO8yScTz+5q7eg2MN7ZpXJXGslsSjPswzR+M6d7VViX4Czxz66yp3DuqSeWlb5RY4eGabu/ZVtlBikNzmnuIqwz6DFJl7klXOwQuT5550lVNw9lTnntIqa+D4bUgS8irHgMTNdO6prFIPpSMLm3uyVWrBhoiwp7pKNXBEruTQVqkEDsCVHDpiE7Mg1eae4yqlYDVI7XPPskrKaZ6zcc+6Sn7kk1bmntNKe+As3Orcc15pcyFBR6xREFvVgrRw7kjSLNQapJNDRUJQe5BODhxWQ2Mky9xzX6mGNvZ13eVowY9+de4wxx5aQSY1d1hjC82CSpp7QXoQWgsqZe4lr8RCR3rV5l78QIggTGXu8MUSui4UU97FE8o72d8hchmUH5u7DcrYV4VeF4ohEzrnfEQ1yAyQRaj0uVuCEgQXTnphfNQ6WUZsWmJtkENw0a0Okkq2uVujWhKpJSQC2YBowsmK6DMgKlWpc6/iJOIwJxH5BERCg/QWEtGFREockF4gAu9wxhbEZQ2QSBeGvNDJOkjyJZbDfBCkHLQ2nBGSYpS5t+gkkgInZZAUg1hk1y70GGQaJMXIc0cgRyzVh0QgG0SpPqQNkmJA1kFSjDR3GCSJKQZkdzJRjDT3PkqF7El07hyiGtLHhRxthbxJZO5wSaTTFANy9GCiGJCjBxPFQAbnA0oSxYD0EeXSVSd9SElmfPe5c6TPQZBiRWRpCO2gGfANGmEUDGNLI1UPkhFHeHxaCRJoCxor6ZFgIpHe0mXQbUsjlgmSOxJx0lenC8VxmlUFthM0FuJdnCqF8kBLXPVlKXZSnHQ1BrG6Qpg+ZCUSJTlJWTw2O0lRErFlhUiHkjhpkEZBkDgiwEOeuCWbkxTDY/sKaR6tgohRoz/r0kFIISPYWadNVSkk6o9Ok/lW18Wt0mky9rq60NSJ3S4ySLgTxXYh3kJTUN/uDjVHpyyIjCg5/MsLM4a/80iy5wDWUdsEaeSf2LEsNPlzCEO15FoJaCSMQ6bYKE9CFrvQlCdxOBxyUeSTMblGwOWkQ5JbYbyCeLbRGqnBllHcwMElwt7JH5rywODJf/B7ibB48ocmf5g8+bMCkH9OLBZDjkl75MxSMmjKkwsLjcDPK/lnYxmSRpuTf64sUoP2/BtL2NBW0R65s8ANmvYokeXP1W9GeYqwOLpY1Mi/KAvpoMl/2RO7jov+KHlVeJ4FnfzZF9cgjYMD+RdbsUY67fnVlVEe4j2/tmLsOE39S1+h4kLu66Jyi0gQB01+Jitk1sRn8jNXGA6a/CytaBs0dJn8LK9QLTpNflZW5OU0+Zm5oNtp6md15VJ79hGeX1uh/IN2cbz1VUf7B01+NaJVGjTty7IQKTD8jgxZGDjgeAA5+p6ZJnKOSEBesYyMAPJkeWDStO5qQoksEEhZCVDPFcZCtgR4tqgFyJYAzxa9HXM0urJNIguFolokgJ5lqWDoegDZsli4xpEUjC2WCwYjmk/k/JEFg9FICiFblgyG33UAMnm0lqSg/Vk2GGAeQMFYOPJSDrQFkaWDIeYpKBiLB7szD6CBtjI4D6CkLoRb2kMoqctDlvZwTu+LCG2KxoKi+zKytKnzchYSH3mkoKQsJbAlD6CkLCaDz6BqJIANwdK3BLgSyDlBCwKbdTUQU9sD0LpsNUEe4Boa9A7bd6BKYU1xRUQL8FO0QT6aodGtuOqBqrUAQ3WFEA3RKopScYWQK9BrgMGiEZLOeKsBBotOSDrVqgEGi1pI0ONAu5YIMQ4F2tJDUuU0BXY1BFViiwfNyYXymGtsUA2htSQ9DBjdECphpykfyiEfzA0lo6AdQslCfWC4KIjUx3YLjfIhS4Hjo84lf6R7y1CH4bqKCA7fY4DhoiVynTM0+SPdg+N3CZX2Qp7iE0ECDBctkcLhoT1/NIyMaQ0wXEG+B4eHpn0Qqvg0SQGGKywwqLZ6CkORpiv1WZMDDFd8gWHA5wDDFRYYn0Rs+qHLShPjnyMBtK3QYTpN/iwwPqUswHCFBSaTn6GYFUnDdoE+heFKjiv1CVYDDFdQycPBockfnbzPtxZgwMI5wqdbCzBg4SSR/XQQCvlzlvDZ1wMMWDhN+AbFj5ginCdczhBDoT04UTitAYYsnCmcTiGTP6cKp0uAIUvhjMrWwgIMWQpSUt+ABRiyFKS37ER6yJSnoLNl4yiuWpVC+aBTgEELKnunc4BBS6F8xFuAQUuhfNAVZbZIoXzQPSTKY5SP00oM8GsxygetAXYtRvmgc0iUxygfdAkwazHKB11Doj1stB9jCCWlGOWLQdkaUx6jfNAS4NxilA86BfXyUD5o1OaoWikftAXYtiCScZrTEDTlI56dODT92wNjBiYudfQvti5CeWpZ4pmD0LbQ7EigOS/yPLsuaMYfNMpdDIk+eH2CLdm/uKne0cen58dXSY/C0albj5USjn48Wn3XNYeuHP0sdIW3tNC1h55i6Kh4k4aeUugph55K6MlCT/CoFnrqoecYepbQs4aeU+g5h545PGIjAm9roeceeomhFwm9aOglhV5y6OjAi4Ve4Ikt9NJDtxi6SeimoVsK3TA0KaGbhW7w0ha69dBrDL1K6FVDryn0mkOvHEUt9FpDr/DhHnqLoTcJvWnoLYXecuiNQ6qFDi91/t1D7zF0dNBdQ+8pdAxcegm9c4StoXf4vuvVkcPAiaNLQiIaCJeMRnQxsODItiHCfCMGOxG2G+G1EQYb2VdHWGuEn0Y/FcNJI+wzskuOMM7IPiHCIiM74QhzjHDEyPYgwgsjDDDC9SKb2Qi/izC5yN41wt6iGy7ByCI7gggLi/CtyPYzwrEiQy6y24wMtghXigyzOIx3eIJRFRHMRHhOLDzhUjk2lZE1PiJ+iewpIyt8ZDcZWdoj0pbImh6RtEROJJEVPSJciSzlka1kZA2PHBAii3dEhBLZQ0aWbsyO2WDxxRMYEER2kJEtdWSpjmwgI2t0ZOsY2XtGNoyRXWD0pd03DSzLkc1SZEGO7BsjS3HsPMG2MbISRzaMkT5HasGmgS+MHOjzYdVEnyOIYL3nixM/fe4bRaQM4jvEYQ9Bn/v+UOjzYRhAn7u9FKIBVlW+3JCCPOhzzv0sj3yRB33uG8JhkUWf+3ZQ6HMO66xdfPEEfc4hnPUIQQZ50Oe++eNAzcLCF0/Q526w5fs8jscsC3zxBH3uwkChz90+zi1ehD53AzeOsTBqvniCPncLOz+FDssw+ty3b24h5/s2PxT6hm2YkNDnvl3z05nv0/zcJbX9+S9/+Uv4e1lzYtf+VmvOAVV4B7RksdjEgPvijIRbG+cRcm/3glsYCcg9HMRtCMQ1OESAZByiQz47vvhhfbGHNhkBe69cAnYIiq/Xb64enD3HABsDVMgRGadIG3j86eb52RFSkUHvvZ/oj8+xcze3MD5+szm0Gn9wdfWAcAy3n21+3Fxuzs8uj1bFraeJ2Xvhp8ffr7cIGPJzeuSQycHpL05OLtcOTYHPLoG7Yicv9+bpD5+uz54DrIlTxMjZ+2D7qNcFw/Pbj12dbg3Nd0m22WOY/O0/TA29O/+KGv6vf5ga7jroV/bhB8cXe8CiD44vtoPCTbCBajFNTx99NebEhxfHPw1AxqC/eHV1Df4YxIL/GMQCAfni1dWHw95+gMswgmcS+TT64tXVwhKoxBevrj52MNaS9OPNggs4sKAngQc+21yBKNvSX5+fn7oBPQEDvPLw/Ozq/PXF5YJaeHC1FOcWx3xwdcUkdib1Dl6gv5IZMFeo/oAdUUkoEBGTUx+dPfvo4uJ8wXIxs5305GT18euzpwtbIBJyj4tBLl1ILGCYJTH1h1wSM+8h9/r70/Xz9dmzfcQNpRuhexyWF10HbvPegvB4xZYt7BLSfstQDEcnn4CFWF/e4uFL6Fevjp+CBfC8d8i4vTrsYHFLGGXcpbtZml3SbfA26a2sPd3teu8FXsONPtlcMiD3y0MQ71uKY5Fqb9NtMx6ts026DV0S3ioNqT7bnG1evn75v9YX59dQDyJugBWdxQ/Uy6OL9cn64l8/vU49wvcabgTsV5OS7ode13OEfrg++eRoVSKdtgv55mhVb4Y8Phpwn12Sb5eAR8f7g+/R8Y2xRea7oOucPegQpPno+NmNqtN2j46fHYI+Hx0/uwP3+ej4GYP98XXzLCHf3ghhbVywSmS4efrDglR6dPxqoCsfL0xjF/DtEerJo5Ovnl6s12cfO3hrDF7Y2l7zQzIP9oYtQfv9QaUI25s/W/J69hCyHUBjWI00Fy/hokc2ZQfSEOg8owNlhHIWw+F0kN9s8U7EfQIhXo+ri82rD9dPNy+PTy93oCJnyctuR3dbhr3aeYJb1fOw/foxjjxwr4I7erdUjU0KG5ABBt49tWOB/syoTt+lpj7b91OdwXzO/3B2tr74kuqRkqnmr708Wn0HkOjePb5E7wmH/nv5XtvSdi/fE4PSSIK8JLmmPGg/XOPN5Lu4Fpe4Fu/leC/fy57S8/47ff0Z5rI+fra+YLV2zJQ32476eHP18XbQlGXQOBKLXtzF+FjyVnt6fOoP0/v/43xzRuB2I/Dw+NU++fXm5W47WVvr0rJzjD+8PH6+5kU7Bv/w+OzZ6fqbF5vLH9YXXx6fPV/gyyP8g/M3S9jovRHqJdkDcP5pc366OduGLsDFkfTh5uLp6W1uv0SBPKXQewvgY7bcH7159Xh/27MN/HY/8Nu7Um4Db6Qk4WfHbz7cPHd4PYPwi4urF+cPj1+uL44X7nN4XHt0/Ow3w9/RY289sT06fva28xonKVpoj2NBbpnPErvXfrdWxsNT2C12TWPcwaz/CdK/L3mK/pHSei6V85Ucre6XqfYUSy7JoiJEPxogfp3MPzVaRr515Jj+opOkmltNVdQawTch/hrbVIrGGGuXmhkoe4h/jXEqndhu3Ww/9mgleUpae+89WunqWd6E6SeZmqbea+upHLgG0DYhYeu1V7sRebS6b5NSy1QQyjSl9jd9BtSpF7JuqrEhJHyHC4HUdIqNxkylNJLecidgbVKPjy0h0vEEW68HyfJUjKfFTDtF2XoewNHAYexNrwN0ZPFPjfxP9nteCO7q5220Hwis156ySC/WC8LovffjhaDoVLWZlJQsJ1/At04Jfrh7uGyj3WcBoyuWVGNJgoh/32PBFCNN3Huv1XLTQvS134E7o7deDeKU+xi/UTUV8fG7eDnAa8btuOG+IE559EOMOeOFgSVsuE+Y+kHMDa8Id5bmhp+Et6V4e9Y7Twp35b54Vrjvkpo7fCuw/VicK2SbUs45aUtFs0uDfqWvBSbXP30t7HzZ/GpfC7cO9u///Fu9MzyRfdnlofeGEf++Hhp+O1z/svv5D4H1Myrfuq3w0/PbNhZwkt92Y4FnmzEXb/i2YRbi3OaOKbh/LqEmg17OoYf7sb9xM/bxHz9/SGsM70nvbLlP5MO3tVtxLxvLoDzB7c+Tn5+U8jS2+OxpSZFDxdjlH62OHp6/fLU5XT+7515F7n3286NnJ39KpNhr+iGt+Bt3db9etv750/Upp0v0REcnb5GNL4LxtzmpWprhjQtl9+rtnlP+oaXpCCq/36AIQKN2dPLYPfeM4f14+Ovx4JEG9zInH28uLhfJ6KfH21849NLtqfjl+sPN5avT4z1fOBzTdgc9HxioGK5903x2/uzT4+8X+h0i/vfrqJ9vd5Q7QLm89///f/f+n3tx0nv/L0X4/XTcxF7Nj8w7ycSiP3mHImSv63YdN7pw63HpP77X3qK2eL9e+/fbvfb76qT/Il10S9Oyp4aJzgE+Oru62CCz8gpfvn750zKt+bmd4vzeeuPy30vEZ8dvkCXfuQoucmYWz6F++fz84uVWiMnAXXQlw4vVyVcjO2c5N7wConbASeChivP9N1vDEdW1oHPrmMpz+2Bzhpzyo4uLL3ClRdGgv/hxfXFyev4TuhwORxcXMLib5jyGnY+b8/hyg9MnN+q5vSn47ZXmr5gsv7zkf3l+jmifxHctdm6rsvMU9uLJq2dojI5J7uzpaHXE4+fPL45f3js/ubfEP3l1en715Ikvh3srPiPob1jvafh3r/ds7m7r0j9/db45w7vksqC9q4visLi636ce7vep8lX4SnxJuN+IaEQ0IhoRjYhKRCWiElGJqEQYEUaEEWFEGBGFiEJEIaIQUYjIRGQiMhGZiExEIiIRkYhIRCQilAglQolQIpQIIUKIECKECCEiTm05YC8fgipfeRsyPgTpYdD2eL58SogT7OL6IyFO6ZpEhhHiVA5C6kHI9oA+PhIoLwWnBlSFOlE5akl1qTcNQEvQJLQNjURr0Wy0Hw1Ji9K0tDGNTavT/PQDHULP0EX0FZ1G79GN9CcdSw/T1fQ5nc8oYDgwLhggjBSGTJ+6+9r79j0GWlJ81fDtP8ALYQsZQAppcIAQIdgYgWQImCIB8QgYqIEVCZirYeAfMHAPDpkJNVjo/l8OFlqwkEMJFjSkICGHHDTgsikGDRJw2BT93+1v6BHi0Pqg/h9PRn8TT2OLFcqSFRlKpAj+BRzQy4YdJOXEbgobS2+X34Jd73jOzpfhwWKyW3m2q8uNNeMjnFr+cge5L1eMbKKfkz96/GLz/MWvfwzJ1S8/9V2ZTKukkqRKs8hwjKVIVjNpvSTG660UBwF3PBLNouSukkox5gPy1JTNqrodZJlKqsVK0tJiqT5DLNUqmloppVnIk5VcoqZecs7dQpm09ArgABGhMblKLi1a7z1pSvkwlzw1yyaqMbVcMPGdmvbUYuyt1IJN8xSbSkutI3ZksmrU1qqKdMNgM03WrcSYpDXNokzxUlvEvjLH1Jj/lNc0pZhT5ZVJkVWnmq1Q8DueyFLUSu85Raw9D4p1EKBTzykb1ppasHe8nWua1EqpPcfYC9Z/BwXXqTTJNeZi0YzZPqXae5JUu/ZSnaPdzOQg14MAmbrklLo0U1UgpYcvrdZSs1gsm1Y9THHHO6R069gg5mj1jpfKpF2aUBVpbnc5WdIaszXDXrOGODWtSB819mpYot4u6R0BBy+9VTlnUbdTHeR0GMCDt8vz1wQsXPJ93nbYILDX22X/5YCDYh40G6+91U56uwPvyOfWIwfvSBNWuj3n1JNhKXrw0r9qQP/SHLgj21uT4n1SHMzFW2znDpZwi6scMqZbXCVPGSl7RSckMKYD1nWbgw5vvN++33LynU1VSi0poyyDXVR0a6WU2ESaNVaKWykOAu54RCwnzdFgCNpYOsxK61KTKObpxmpjkXWgtmxsk9Si5tSylaI1s38ySWY5ZuyalU0USwQPxWj4YZmsFGnSq0gD0nCQS2E96kmjVSyi2bT10mpqOWlVrNLLpDFV6an11lJj65Z86UqqqY1HWoqpxVoKfrBZoGJL0UqxHMWUHaD1WmpKVS32yLYvpyLdxCQ3QKB3PFJKb9Jjqalj4n1QsDsCMD+PWVI1q74u3so2T1msaCyaxFjj8+2ip6nWqC26M+8c2diWlixLyaW3XBq72tu5/FJAmsS0srNQ6p8PX5qmnotkKdKb0UAH2d7xjtQ0V7Wikg0/hbdLqpOl2ko3TbkUdrITa0UrLWlroNY5XLD+lo6BOsvvQUFvBRy88+ARmSTXVnM2diuALW4HHLzjoBwHAQfvOAg4eOSvCDh46W8R8D7luNktv5zrHS140NUHAb/U1wfZHnRtuj3kDspxxyO3BlCe1KznXg3wT2LYHozjXz0F32fW3sr2jmn8yykOuMcBr7zF+A7Y2h3c9IATlmxFumovjjY54Le3+T7L2ZOfEeu6GP9odaeA/cnuGoAnw/V/zjfXsXD05Oz84uWfjk9xcx6dfLk5Oz79YHO2mPq4m/QnZ19tnr88dmHak/VOPunyyicXxz/tRJb3JRw9Ob/YPOcl37hrd5cS7iPu9kV0i/znv92x/DfXOZ6+t/Tx4euLH9+qrC1a0r7e8dWzkydIib/7+c/7IshHF+dcGrM5P1tkkETuyR3NRYdvlzxiXfRO+7Ffljwi2nyH5NGNpd4lArBF8ihxUlCL/oNvBI+NL+Mr86XhvkshG7JH4yvzpeF+Q+joX8avzJeG+y58bMgdja/Ml4b7hsCx8eW/Mr803HeZY0PmaHxlvjTczwgbG1/Gl5Ma7ruosSFvNL4yXxruU3aChWD0Wfe57eC+ix7dcuv6g4jRLaquPwSla5IPQXIrqEylANcTTaKltvV9seANuPdB7sjG+fpDiJtV7T6EbI18xgdZGCWm6NSBynBe5o9tiwWdWkDaiBiC/RRygIZkbGL/z78ITlpAasMe1vfCgQY3NtKBfqBDbGqBHb0GOqxOFujCFuhQepYublNDnjdpYAgwFhgUDloNjBj/inEI2N4peLRwrYT4LtkkXUyLdhWXyRwElClKaynWqsXgi2lqhtSjxqQlI7ycaorJUmxZtaaQZDLfDnYpGZlMnIogWJJeI0hE7VPOMVvu7AHFgrYpNemSAGYqlxvUKWXNEbPABBpVjR1/T7Fp6eZ3HnAGQxbkVmSISKeUGrjPrKKGM+cp1Vwt1srdOtxYMOUUcxErPYs7bppKLNIUeVM1PBNNpbdecq2Vk1yQPlXQjTWK5gxOtU0tJ5NuvaYCeLJOnX2zNloDOGblWMXWUzAOxDXQlErKGnNJlaJLmYpJTrknDBBxkjTV1nLrrdpAr+YpplxaUUOOgsc2tk6I63ovFTAs5+3Uek3NakKiIlNrFeCoZqkOQp009lRp1OZA2qmUaNZ67q1HBlEHNFuRm1XAuX3SHpH4VasJTH2brLWGjKqUmnEiMQESthxjtt4Kg7VkrZZazyiKONz13lLMmlL1XGzKVVtDdlhL4ZDVzcrylnGUy7WL1Y5dqTYmSgQNjOgsZfoNG0gxbEgtp+wnJkmSeqlaWzScCUzVpXwqPRfQ62lK2rCoNEk9cSvA1EvurRZsV8HOKwwAUWU3ENGkQAgolSq3BE536hmhYE7SM9auMhlmLp3p0hwkO6VagNBa65yK2b5CpWTaYub2g6lVyyX2aL1VPPPEqZbYGlDdVqw4u7LM/qthtWgdF/oTp1hjs5xTS90ZWGtZMrauJYLzj1NOpLfUJefCNQ1Tjg2SoyJbNxQw3Y/yLfWaQdaTpkRlWiI4iP5Uklp70t6xMI1TrhyTjQHdzMipMBVbqjUiBGowTyW+VCSDLfLeql16Vy0Ia6vXvABATpprKniAwPRSpUiruaReADxPUlRaazWbZnDeU0qiZklz7w6Jngoi4qzwHnDhk8txtVQrBtp86k0rp20+eHmbNNXOqOhqlW4uwoE3Jex9cfk+tVhKi7ml2LW41kgqw7eVrFZg6JwZs0pqMQOhTqxXlRM488lg7GLdj6zZYdhY2dbaSFVqwnnH1K2kEhvCXzyalCl16YXXpaTGNGipll577JayIGpJUbUpqG+h2W2qzWK0aj02XAzUCVl4pf1Uc2PFaD50syIUL0zPhLIg5VRSqYkVpINA761LygUvEpjGajLsngURu8QptobAomQxdzIw1eidaPAa0OFTyoLYB+EuMH+ZOoVuXUtxXwo6WY25+oSrsMA0JUuWK2Jj2gN+VksrteaeDHh5nlpEfcCi3QC7s5LXxAgxw+garqlWUzQ6292MTSz0UXNjuXfGq1ok1556dh9e07sDfjfKp5sHpbv2rgcHpYN1+eZB6Tffvj94/Ievvnrw2Udv38X/y8X65Ggl/TfP+vtTrK7fy3bh60fHPzrui+R3WS/8hiASTgBu6Nmm2krsqjnGBpsd6IjcWLNxp5GL4kdhgCPqlIvU0mqrJeEcZQFHyNRybewBKm5TePdibC7Y2veYmVxu8/XtNqYrC6VqjFUsusG8Lg+1iHoG7VzHEwuZbG3X+9C5ZzQ/jnXYNz6lVn84A9fM+eWrF8fPzn/aQ9w8PL8AwHb8bMM9YSTeKVF33bSYQl5hmUY/gOC623XBNnL4LVBsZm6D9nZ+C669Ciz4sU/Pz56vMS70567vzByeBjZnv/JavNtW2cdX6zdvG0UUfKmlV9Br+i4b1/dtgm2L7EMZdy1A5AIHXXCgewfadxvS0LKfclvgMKYaVk2ccb9wScjOpLAUFB3WrBctXf6yuyuQ+wHx4/HnA08e/4SGXQ89OuEAF/xf+v7W+9oWaFiS2rpjnxwaJhKnnGvLqTbDH9zgflqm5J8syqZs4X69c8BB56Q5WXX2dwO+ZdH+WmgYxy+XHJSkHQXUwUWxfz00LE4pxVgpc+Fwy8tvYsNyLPvosBHvqKfl1tbtZbNH/8nQsJYHaK8m7ZL9vtgt9gvs1h39vI12sHbqpRkAO0ndPWdcI8/8utoYC9ZfFZ0VUoMd8MyRYXeMlj1kWJqidsP0w8Q4S9wAhpWt5ZkDw2Bq7w0LO4R+/X1hYYdF/Y8Ahbm49BAUtg3GFLw1FHVqLWcO9uwXfiUozNfuf17Ae+vG3VvkOy7gvb39eO8LfJd9yB2gL1wI7Gxy3xb/T1DY3QeFvxMozCfdPihsBOidU3B/X84C+g8KCnszQGGCPUq9GxT24/oCZ2OLroZ/GK//DeBhfsT4/aCMtgxjdyD4VRgjV4ot8DAf1wMeNn7+l4KH5X/Cw8bp/zcH9f0THubShD2XRFvwJbteh166HOA/EcH3HwMPu2NLemDR/98IHna7OX57A42/DzzsX9dnj34BIXadZAGJ+aL43rItJsbfaKrxW4HExA0zxI0yBJyVG2OIG2KIm2GIm2AI8Cs3vRA3uxA3uhAsAu4LqCw3tBA3shA3sRA3rxDAWm5WIW5SgY438M1zgLui21ag/t/aiGAesjMKwfCDJ4YdyM76AwsPgj1/t/VwMw9MOQgelh07e45rO46MBcZNA4y3mW7cttO4yyTjtgEG5haYWoAwwMjC3LgC5S4GryjVzE0pMKPAVhkDCnPDCfTQW3MJBz65iQTmEcMwAnfGqK1cd9XQnXN5NcEJXRVXoBFMJt4VjqcimIy8y7z3UJfRlN613sve4cCwyJHR4Cqmd5pfLAZmpUow1VCKhtJbsJyCJQmWY7Deg9UajGsYhFvLuDI6h9o0VLTwkesaFrr0UE1DE65YKMFaC2YaDKwQyvRsARuMEmtASYYGIAHi4FIxd7Xv16z5/eOuVYu4gsfR97iE2++z4uYpCSlLSJYC+ugiKaTKrQM15FICHtZS05Aid0mhvaPhaF16oQRUtwTz5xci+JXrAbc+SbgsIIccW8iWAmCiklsorQbDKL0uLZJpjRJq0lCzhGopVOPfGGrixrYaUD5WVKXSQtUUMIyvsQfrtGYKlrlYIvu7cQpVag4m9XejGHx/VJqGvwqVdvOx90SlaZpaaybNoQ3cYZinnpIiOcTkUjG1ya2WqtbAkXHDAdJgxSakoV8OCIJLbCCELOJRXMuEbtgsoynm4roCHsYAqbWC43a1KSfVnlIzq00IiC5G7kUV3T5oBMm9KNp87nSwyTAsR4luOJlXQBC5pJhbrsZNFQcBOPMCD6KZggqmSLElVGwpJy5L0TYpyv8OGM5vgmiTVI1NUkyd61gO34FZTGq9xKwYIpCidMyMGnXjdok25dYBcGDyUr3oXbCSr1g+MEFtUk2ptd7wPQ8udKqqrUpJUcuwgJIOYg8TqeoGUPhgR+CKgVZ2A6jSczeU6BztVKauOXZMfqLf1KbIKDWnUmvFlb7KBNIDUx333QZT04pVSXXAoHO5jH1Lzz1JRrdfpzhsAXqJ3AQB10yK5U5nAHD509RKbqpWscp3BtxzK9WwXuEiCkwKwKBUPPH7dQqCwUDOBcBY83sYplRNOj66zBRjJcPgALQHEBG3ZNDakzXMHTDoESz6cEhvtRS/A0EmMfyNpdSbOVJ2KoJrLIzBO/cCHAS0KZcqCTMrzbjO7xPAwh65R8CvROgTI6tKVcwS3MrMsEDrmFg0v00G63LMTzDBAdUrU7KOFUzCt90IUAXbosJdFtKn3sVyLQ6NAOk7lQRer2FtM6zOSo45VgHKybUGearSS41aa/GLIUAH3mhjnSrPJKxcWB5Epuol4GIFv31h0hQxQOuWKtdsYGuuysh1I4w7WvSgiXXSmoFyZOzG3HANCzKszLIWRy/fHgwAVqVXzNY8AXOlJjW4A7eWYHIXgX/2mDERw0pPesRYpHTtfuEkw9iqWi8AlmhhkK4CCjQal06mKUfFskiKGddO5gk20WFOVjFBLFMsCQOgmjt3gGiZWq3Y3kQs2Soz8hY/uoNj1QSgyrEurLDMjT48FebCJK6Tm0BpAumE1WKdwNNxmQUmhd1ZRYuYoeUMUMcDDAMdbHjqeASUTgeO6fc3wF2i43ebKbcwYD1pUi2nzp5CbWqWkPVHzNS8JrVhTFC0SBpsEUBtiTl3TGl5RLS2xnDKjTsdgYLF2lJPCf5BQAIPSHPlMrhzklYKd44lR/qUCd9+LAtZ/fZOA4WDYz8FnCN3dEKaOmZ/6O7MuDsUbJ4krVhDppx5pCWtplaaFvmVMDoWrtiLlZzxX+mLTmcaqkYDd837Mc/DmCylZZ3KVq1imgkWzCteY+mtJtYYX6cE6znpGEv2YavKNR4moNi4bNONQDAYKdh7+DCISWMmY8YBKbQRGzM2mL5iGCxZlatfhkUsY8u4eMVAvGm9HdAmWA5dnFNlwPaJe22kxc6QYtM3oRK1hNEV17aQovWWFRMyDLUO39EmRh/GYgoUnRQMWCaWFLiEdkYfXZ9ix6CT5RCGB2CxgQSncllzxdRW/Npzm2rWxIArhetKWOwwsE0RT4VYZ5ZJEkajlStdGLJ5Si06RiljeKqwN8PgM7LY+RakJMmVAZy5HocUURIWrhjA4oNgwvq3V2zGMtjnOOUCAJ09h99n06ZYm9ZWGi4T2RmDWXfoYWncTVPYCRVuz2nsNDg49FYd81nwRUpAxCpVkxU2y6KT0HwtZeaOm9NlzTBELI39EiJsJ6s1Bezot7O48WpKjnTnfhu3Fcq9ikrqbKV1Uu9XMWNdduu53JrvpiSxXJbpVkCfcsta3A7VV/o4xRqjuQFtoZfiVHssHbVrpoXTZJY1RXy+jhuwphxrV0xvNWNgrVPqSUxzrWzJPIDtXM2JonLL7ORlBJwP/I9MimHxqZg+chpgfDUmRceOn+PBVEsqBvdqGDrf0cJYq2LtmZJh2KwTFqs5JtZMv1GHnQDQWEw2/SKmKRsmnViRZr/NB+ur/RY9CEhTEsrB1qlybVKeeH1pPXWWtzvGQmXnKLkls8q1WpwOMV50Jlm4t6jDvEyaWPXLl1RYDgrWnOwW8ZAxYbaAtwKtGEYQ4NXtKcNcmQhZ2THHhHFoZapollZiai36HcI2Rey3W8aybNjON9ZXwNvKaeyQH9l0wLFqYT/RMBJm4WoT4H8FHwwCmABNqRjwWKrkjAEj007JE7dNNza9CaN9Ws3pFoUlqeK/gQCxGFOUkjkB8oCWWuAbglbaYQExFqmJVdo5CetUjSw5ijVvxY4UI2QBS+C8J3KHVW+NlYoA1pwkBeA6C1mdDOOFWGDe8MA6ZcFpQsGcgeuM65Rwh5HMcy5jqYvaWTJzG8xZzCQDpe0Z5nzQB5yQcICQNTemPQHwCXxmYA7t24uiQB6axlrzLwHohgriwC60ZfY+1+z3ll3o3QC6TPBdADq3FAy/CYLunwIO8CO/GwHHb26l+3fC9w3h8ID4vXkHxG+kw+JhT3D8n47yK5jFvAvlRwJudLzP3oMbCf0H3wE5Mkg5R/dx5nF5MpJefoEK4xtpLHgxvokj1NF74sg9jtouTyaOP8fqgR5ySTJxjtAT6IHMG6i86HHRn3PEoYMNARQSMfCFCJIdVQhykOABJNxJk/9OGMIb8ME7BdB3eTK7KadGco1ror0PQXeADu/wfoZN9d6HB++AJqbDVHe4TQPYsvfhXbdl5QQdptpavY1P8yfjjWQOjwE+puzXjNPRGvUCN8btcI64YQNOdOirTW4mulNkrwdpDj28pYM0h9jLfJDmRsBb8JmHnuJuIzbjoe+4BcOJ77O/HbsJVhNkTlvQmvhWGwjNtmAz3Q2azyOfUj67fKLhpo2pJ6BGfUL63GQjCVbUJ67PYZ/OOE4jK5/rPu2dA7B1JT9nD84pnGloHP+DSx185Rf1EDCinS/K70pNU+wc2EpnuxoOA1pG6NK4kjRz6Xbpxla1OYTTUg0W+4T/KpzgxNZyMM2T4DammhYzCZYQniGRdMlhC1bypK005ZjIVt6sT2wPFdxdK4Kwnk7OHFMSygXrQJgAhsZauVSiosABoaqIqQT5v+EtpvWeEbVklANTqSlX7YYEMtRcJ0F8G9USZ8dacA6D0FBL5lbLWjoyp4pEqqCMqKYubO1qHONd8zAVjsGqWhovLXWyopwqes5oZ0qclLM3nsJAeVaqjzCtNISQEqrmCVRVAuDEhrjGMsWo0ZuLS72tycSBvSiISBFvsa5dFfAIYisamT11BL2FmLi0joA2VsSHJUsoRfz0UwSfamahSJz8dotumrmBNFud8PpScnNQb8gIio2THcd6nKbVMuECR2ByxXJIilAzgtzkoMvePeFBxMRa4wJXzYB+wcFQzsj9ySAWmynyJL9Zl5sxKtC0XmLipGeFAPwoZbbmQXKfDIkoA844g6UyuWxXrFoCoU3t2fArpwi/5zUjllKOJAi7UGRNIGAA1NTiN/2SLXBUwzsMlwhPlNg4ZSE1lxgnMKKRAzXSRYlpGtg+aWZ+vsRJZjEDAMxdxYJoQTRWBV1KOX1MIggAuVe8JhUsbi7ICfCN2Ce8vyVFH4DwtevE1IkuHChI4tsEkjRyVG6CeN+QVbVc6Rg8xlUQR87Z0VdwxTZn1Fpi8voVFH0TUkNFZuz6NZSgFS1ELZHjd6abHFXogjkUejp1wM8VqQ/XjIM8brUj4rfEPeSRo03B+jor+rpapogIJjuMsoRc82SxOKYXlGvIVSehMXuPNZPC6tRrjrEYt5vUkE3o6WKWW0WBRzGsZvhIStxOnrmeo4NLdUFyyN7ztXFIl1pSyFGQ1QzErxmaTqCsvSOABfQdEmJ1sWbAhkFqp4jfPrMqipw3hUQxesP6HNFxCanjXtElW5ziNGTpE26bwP1W9Lc5GayjWQZEnjRkH7TcIAPsNaEe7aytmkpCIO8KzqnXZNa41ySKN6k7C8T3Fndn5+r45VSSZa2VNs5sTEpi/KHypUnRW0nvXMOWvUnJsoMz9fveS5sK1xRHy630HnKuXGxTE7KmXHPIKcOgaukgvsFZRwLYE7WG1iikVCdRtF7KOZ2jMdsoQL+GGziOtXGKKPR8x4LgGElKB2hdu+t+mk2u6AG/zBQ2YPoCTjVFkLGSAQp0OhHfX6ySndboGqVK9vucnT1VMaMUKHbq1FtGUwEIhRkKJLVbiy1WXGr1PkXcRiINRLREANoAK1JgpuMJLZaRpI97tOsEnrkAskb8JSzGgJcdH4U6CXm2Gc7R0NuxiPu6oui9CleaS5HJDNA9d445R6tTzlmsJfDANWhMgGmzpJyLOJtMgHjxDSDawS+3OjlrVxaWLiGlxAVCLbYKq0nVGQfw5JIanjnVhyguu1JRYWjEyVwy6jpQ19VPqEejC5qkh1IYTULJ0WLVUDpXNSHbKYDJUzAEQigdokZhqlixqXVGWqsdNmAgCJACVpVSM2uX4WbJymh0X9xqxRkA/jlr9eXPxYnAwxGJsECKX9A0MNy+hGqF56JHjKy6cWqZIdrwDFHQ90+C0zuc0SFIrwVFKkIjLynLcJpE0HImS4ntAOOrIq3J3FMUaipTQbpf0IFG9gvZFZiGFLfVjsnFhPgyAuEvLLqdaRC1obMBmd10SgwjQ2OM8QYLqJVcs5lgKmHAO6XSJVJzCQaXQASaE94kejCVqbaaSsTzRtFgEUUQQPtqCZVx6XlC0prx+KbRrTmAahetilw2lEox3W9FajXaLwf8bswc3oV/3h3sD0RdB3uw3wkEOutvLlzZYWt/2X37fwoEGuWBf5TNu2FPB8ihI7zvbKJr0+j3gT3Wo5UgUPUPvpz83j0QEL01dG2CQ7MYgVFfQ6Adwfw+sOf/2lBnB85d401/B1DndyA3/mFAzyKtVIBvBf85d4GeudTmq6cXm1c4i3PM9yeb5y9ON89fXD08PztbP726vrj3482b9bMBoDg5Pr1c/+X/Auq4FXE=').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222539242', obj, '');\n",
       "});\n",
       "\n",
       "      }\n",
       "      const servers = ['/static/', 'https://root.cern/js/7.11.0/', 'https://jsroot.gsi.de/7.11.0/'],\n",
       "            path = 'build/jsroot';\n",
       "      if (typeof JSROOT !== 'undefined')\n",
       "         execCode(JSROOT);\n",
       "      else if (typeof requirejs !== 'undefined') {\n",
       "         servers.forEach((s,i) => { servers[i] = s + path; });\n",
       "         requirejs.config({ paths: { 'jsroot' : servers } })(['jsroot'],  execCode);\n",
       "      } else {\n",
       "         const config = document.getElementById('jupyter-config-data');\n",
       "         if (config)\n",
       "            servers[0] = (JSON.parse(config.innerHTML || '{}')?.baseUrl || '/') + 'static/';\n",
       "         else\n",
       "            servers.shift();\n",
       "         function loadJsroot() {\n",
       "            return !servers.length ? 0 : import(servers.shift() + path + '.js').catch(loadJsroot).then(() => execCode(JSROOT));\n",
       "         }\n",
       "         loadJsroot();\n",
       "      }\n",
       "   }\n",
       "   process_root_plot_1779222539242();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ROOT import gROOT \n",
    "gROOT.GetListOfCanvases().Draw()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
