From af508e883121fb0544bbb08d42919f5a8247c13e Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Wed, 25 Sep 2024 20:15:47 -0400 Subject: [PATCH 1/9] fix redirector for get siblings --- DBTools/python/getSiblings.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/DBTools/python/getSiblings.py b/DBTools/python/getSiblings.py index 68262f18..ae26220d 100644 --- a/DBTools/python/getSiblings.py +++ b/DBTools/python/getSiblings.py @@ -47,6 +47,7 @@ def __init__(self, inputJSON, secondaryJSON, label): self.nJobs = -1 self.jobNumber = -1 self.eventsPerJob = -1 + self.redirector = None self.local=False @@ -59,6 +60,7 @@ def getSiblings(self): self.getFilesFromList(args.jobNumber, args.totalJobs) self.findMatches() else: + print("Running default option...") self.getFilesFromList(args.jobNumber, args.totalJobs) self.findMatches() @@ -126,19 +128,27 @@ def findMatches(self, jsonName='default.json'): secondary_dict = json.load(secondary_fin) for inputFile in self.inputFiles: - if inputFile not in primary_dict.keys(): - continue p_file = inputFile + if 'root://' in inputFile: + self.redirector = 'root://'+inputFile.split('://')[1] + p_file = '/'+inputFile.split('://')[-1] + print("saving redirector as", self.redirector) + #print("looking for file", p_file) + if p_file not in primary_dict.keys(): + continue + #print("found file ", p_file) primary_info = primary_dict[p_file] - if p_file not in self.inputFiles: continue + if p_file not in self.inputFiles and inputFile not in self.inputFiles: continue sibs = [] + #print("looking for siblings") for s_file, secondary_info in secondary_dict.items(): if len(np.intersect1d(primary_info['runs'], secondary_info['runs'])) == 0: continue if len(np.intersect1d(primary_info['lumis'], secondary_info['lumis'])) != 0: sibs.append(s_file) - + + #print("There are {} siblings".format(len(sibs))) siblings[p_file] = sibs - self.getEventList(p_file, sibs) + self.getEventList(inputFile, sibs) if self.eventsPerJob != -1 and len(self.sharedEvents) > self.eventsPerJob: break @@ -160,12 +170,14 @@ def getEventList(self, primaryFile, siblings): return if not primaryFile.startswith("root://") and not self.local: primaryFile = 'root://cms-xrd-global.cern.ch:/' + primaryFile + print("getting primary file events") events = r.getEventsInFile(primaryFile) tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) primaryEvents = np.concatenate((primaryEvents, tmpEvents)) secondaryEvents = np.array([]) - for filename in siblings: + for ifile, filename in enumerate(siblings): + print("getting secondary file events", filename) if not filename.startswith("root://") and not self.local: filename = 'root://cms-xrd-global.cern.ch:/' + filename events = r.getEventsInFile(filename) @@ -180,6 +192,7 @@ def getEventList(self, primaryFile, siblings): def getFilesFromList(self, jobNumber, nJobs): + print("getting files from list") sys.path.append(os.getcwd()) self.jobNumber = jobNumber @@ -191,6 +204,7 @@ def getFilesFromList(self, jobNumber, nJobs): #If no job number or number of jobs is passed use the full file list if jobNumber == -1 or nJobs == -1: self.inputFiles = datasetInfo.listOfFiles + print("Using full file list") return filesPerJob = int (math.floor (len (datasetInfo.listOfFiles) / nJobs)) @@ -204,7 +218,7 @@ def getFilesFromList(self, jobNumber, nJobs): if runList[0].startswith('file:'): runList = [x.split('file:')[1] for x in runList] - #print("This is the run list:\n",runList) + print("This is the run list:\n",runList) self.inputFiles = runList From 99b32728bcb3d5e9857fe3fdf289087a28b54048 Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Fri, 27 Sep 2024 17:22:37 -0400 Subject: [PATCH 2/9] updates to get event lists and run crab jobs --- DBTools/python/createEventLists.py | 54 +++++++++++++++++++ DBTools/python/getSiblings.py | 25 ++++++--- DBTools/scripts/eventListWrapper.sh | 8 +++ DBTools/scripts/submitCreateEventLists.py | 64 +++++++++++++++++++++++ 4 files changed, 144 insertions(+), 7 deletions(-) create mode 100755 DBTools/python/createEventLists.py create mode 100755 DBTools/scripts/eventListWrapper.sh create mode 100644 DBTools/scripts/submitCreateEventLists.py diff --git a/DBTools/python/createEventLists.py b/DBTools/python/createEventLists.py new file mode 100755 index 00000000..680563d6 --- /dev/null +++ b/DBTools/python/createEventLists.py @@ -0,0 +1,54 @@ +#!/usr/bin/python3 + +import json +import ROOT as r +import numpy as np +import sys +import os + +r.gInterpreter.Declare( + ''' + #include "OSUT3Analysis/DBTools/interface/getEvents.h" + + void dummyWrapper(){ + getEvents(); + } + ''' +) +r.gSystem.Load('libOSUT3AnalysisDBTools.so') + +if __name__ == "__main__": + + + if not len(sys.argv) >= 3: + print("Error: Need to provide the input json file") + sys.exit(1) + + outputDir = '/data/users/mcarrigan/condor/EventLists/' + if len(sys.argv) >= 4: + outputDir = sys.argv[3] + + f_json = sys.argv[1] + + job = int(sys.argv[2]) + + dataset = f_json.split('/')[-1].split('-')[0] + + outputPath = outputDir + dataset + '/' + + if not os.path.exists(outputPath): + os.mkdir(outputPath) + + with open(f_json) as secondary_fin: + secondary_dict = json.load(secondary_fin) + filename = list(secondary_dict.keys())[job] + + #for filename in secondary_dict.keys(): + if not filename.startswith('root://'): filename = 'root://cmsxrootd.fnal.gov:/' + filename + events = r.getEventsInFile(filename) + tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) + print(tmpEvents, len(tmpEvents)) + fileStr = filename.split('/')[-1] + outputFile = outputPath + fileStr + np.savez(outputFile, eventList=tmpEvents) + #break \ No newline at end of file diff --git a/DBTools/python/getSiblings.py b/DBTools/python/getSiblings.py index ae26220d..eb2c0073 100644 --- a/DBTools/python/getSiblings.py +++ b/DBTools/python/getSiblings.py @@ -127,6 +127,9 @@ def findMatches(self, jsonName='default.json'): with open(self.secondaryJSON) as secondary_fin: secondary_dict = json.load(secondary_fin) + secondary_dataset = self.secondaryJSON.split('/')[-1].split('-')[0] + eventsDir = '/data/users/mcarrigan/condor/EventLists/' + secondary_dataset + for inputFile in self.inputFiles: p_file = inputFile if 'root://' in inputFile: @@ -148,7 +151,8 @@ def findMatches(self, jsonName='default.json'): #print("There are {} siblings".format(len(sibs))) siblings[p_file] = sibs - self.getEventList(inputFile, sibs) + + self.getEventList(inputFile, sibs, eventsDir) if self.eventsPerJob != -1 and len(self.sharedEvents) > self.eventsPerJob: break @@ -162,7 +166,7 @@ def findMatches(self, jsonName='default.json'): self.siblingDict = siblings - def getEventList(self, primaryFile, siblings): + def getEventList(self, primaryFile, siblings, eventsDir): primaryEvents = np.array([]) if not primaryFile in self.inputFiles: @@ -177,11 +181,18 @@ def getEventList(self, primaryFile, siblings): secondaryEvents = np.array([]) for ifile, filename in enumerate(siblings): - print("getting secondary file events", filename) - if not filename.startswith("root://") and not self.local: - filename = 'root://cms-xrd-global.cern.ch:/' + filename - events = r.getEventsInFile(filename) - tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) + fileStr = filename.split('/')[-1] + filePath = '/'.join([eventsDir,fileStr+'.npz']) + print("Looking for event list for file", filePath, filename) + if os.path.exists(filePath): + print("found event list!") + tmpEvents = np.load(filePath)['eventList'] + else: + print("getting secondary file events", filename) + if not filename.startswith("root://") and not self.local: + filename = 'root://cms-xrd-global.cern.ch:/' + filename + events = r.getEventsInFile(filename) + tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) secondaryEvents = np.concatenate((secondaryEvents, tmpEvents)) this_sharedEvents = np.intersect1d(primaryEvents, secondaryEvents) diff --git a/DBTools/scripts/eventListWrapper.sh b/DBTools/scripts/eventListWrapper.sh new file mode 100755 index 00000000..6e1642f6 --- /dev/null +++ b/DBTools/scripts/eventListWrapper.sh @@ -0,0 +1,8 @@ +#!/usr/bin/bash + +export CMSSW_VERSION_LOCAL=$1 +source /cvmfs/cms.cern.ch/cmsset_default.sh +export SCRAM_ARCH=slc7_amd64_gcc820 +eval `scramv1 runtime -sh` + +python3 createEventLists.py $2 $3 \ No newline at end of file diff --git a/DBTools/scripts/submitCreateEventLists.py b/DBTools/scripts/submitCreateEventLists.py new file mode 100644 index 00000000..6bfaa47b --- /dev/null +++ b/DBTools/scripts/submitCreateEventLists.py @@ -0,0 +1,64 @@ +import os +import argparse +import json +import shutil + +def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): + f = open('run.sub', 'w') + submitLines = """ + Universe = vanilla + Rank = TARGET.IsLocalSlot + request_disk = {6} + request_memory = {5} + request_cpus = {4} + executable = {7} + arguments = {8} {2} $(PROCESS) + log = {3}/log_$(PROCESS).log + output = {3}/out_$(PROCESS).out + error = {3}/error_$(PROCESS).err + should_transfer_files = Yes + when_to_transfer_output = ON_EXIT + transfer_input_files = {1}, {2}, {7} + transfer_output_files = "" + getenv = true + x509userproxy = /tmp/x509up_u1009 + queue {0} + """.format(nJobs,exe,jsonFile,outDir,requirements[0],requirements[1],requirements[2],wrapper, cmssw) + + f.write(submitLines) + f.close() + + +if __name__ == "__main__": + + + parser = argparse.ArgumentParser() + parser.add_argument("-j", "--json", type=str, help="Input json of dataset to get events from") + args = parser.parse_args() + + jsonFile = '/home/mcarrigan/scratch0/disTracksML/CMSSW_13_0_13/src/DisappTrks/BackgroundEstimation/test/debugMuonSkim/Muon_Run2022E-EXODisappTrk-27Jun2023-v1_AOD.json' + wrapper = os.environ['CMSSW_BASE'] + '/src/OSUT3Analysis/DBTools/scripts/eventListWrapper.sh' + script = os.environ['CMSSW_BASE'] + '/src/OSUT3Analysis/DBTools/python/createEventLists.py' + requirements = ['2', '2000MB', '3000MB'] #CPU, Memory, Disk + cmssw = os.environ['CMSSW_VERSION'] + + if args.json: + jsonFile = args.json + + outputDir = '/abyss/users/mcarrigan/log/DisappTrks/EventLists_{}'.format(jsonFile.split('/')[-1].split('.')[0]) + + nJobs = 0 + with open(jsonFile) as fin: + f_json = json.load(fin) + nJobs = len(f_json.keys()) + + if not os.path.exists(outputDir): + os.mkdir(outputDir) + + writeCondorSub(script, nJobs, outputDir, jsonFile, requirements, wrapper, cmssw) + + shutil.copy(script, outputDir) + shutil.copy('run.sub', outputDir) + shutil.copy(jsonFile, outputDir) + + os.system('condor_submit run.sub') From 6560be46057e3047443a87dc223b801356cbc081 Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Fri, 27 Sep 2024 17:39:55 -0400 Subject: [PATCH 3/9] add option to create json file at time of running --- DBTools/scripts/createEventLists.py | 51 +++++++++++++++++++++++ DBTools/scripts/submitCreateEventLists.py | 8 ++++ 2 files changed, 59 insertions(+) create mode 100755 DBTools/scripts/createEventLists.py diff --git a/DBTools/scripts/createEventLists.py b/DBTools/scripts/createEventLists.py new file mode 100755 index 00000000..528ffd12 --- /dev/null +++ b/DBTools/scripts/createEventLists.py @@ -0,0 +1,51 @@ +#!/usr/bin/python3 + +import json +import ROOT as r +import numpy as np +import sys +import os + +r.gInterpreter.Declare( + ''' + #include "OSUT3Analysis/DBTools/interface/getEvents.h" + + void dummyWrapper(){ + getEvents(); + } + ''' +) +r.gSystem.Load('libOSUT3AnalysisDBTools.so') + +if __name__ == "__main__": + + + if not len(sys.argv) >= 3: + print("Error: Need to provide the input json file") + sys.exit(1) + + outputDir = '/data/users/mcarrigan/condor/EventLists/' + if len(sys.argv) >= 4: + outputDir = sys.argv[3] + + f_json = sys.argv[1] + + job = int(sys.argv[2]) + + dataset = f_json.split('/')[-1].split('-')[0] + + outputPath = outputDir + dataset + '/' + + if not os.path.exists(outputPath): + os.mkdir(outputPath) + + with open(f_json) as secondary_fin: + secondary_dict = json.load(secondary_fin) + filename = list(secondary_dict.keys())[job] + + if not filename.startswith('root://'): filename = 'root://cmsxrootd.fnal.gov:/' + filename + events = r.getEventsInFile(filename) + tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) + fileStr = filename.split('/')[-1] + outputFile = outputPath + fileStr + np.savez(outputFile, eventList=tmpEvents) diff --git a/DBTools/scripts/submitCreateEventLists.py b/DBTools/scripts/submitCreateEventLists.py index 6bfaa47b..f1862f9a 100644 --- a/DBTools/scripts/submitCreateEventLists.py +++ b/DBTools/scripts/submitCreateEventLists.py @@ -2,6 +2,8 @@ import argparse import json import shutil +from OSUT3Analysis.DBTools.getSiblings import * +import sys def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): f = open('run.sub', 'w') @@ -34,6 +36,7 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): parser = argparse.ArgumentParser() parser.add_argument("-j", "--json", type=str, help="Input json of dataset to get events from") + parser.add_argument('-d', '--dataset', type=str, help="Dataset to get json from") args = parser.parse_args() jsonFile = '/home/mcarrigan/scratch0/disTracksML/CMSSW_13_0_13/src/DisappTrks/BackgroundEstimation/test/debugMuonSkim/Muon_Run2022E-EXODisappTrk-27Jun2023-v1_AOD.json' @@ -45,6 +48,11 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): if args.json: jsonFile = args.json + if args.dataset: + jsonFile = args.dataset.replace('/', '_')[1:] + getSiblings.getDASInfo(args.dataset, jsonName = '{}.json'.format(jsonFile)) + jsonFile = '{}.json'.format(args.dataset) + outputDir = '/abyss/users/mcarrigan/log/DisappTrks/EventLists_{}'.format(jsonFile.split('/')[-1].split('.')[0]) nJobs = 0 From 9a9f2e6a757e3caef269ef0d479bb9671f5b7a35 Mon Sep 17 00:00:00 2001 From: carriganm95 Date: Fri, 27 Sep 2024 19:44:02 -0500 Subject: [PATCH 4/9] Delete DBTools/scripts/createEventLists.py --- DBTools/scripts/createEventLists.py | 51 ----------------------------- 1 file changed, 51 deletions(-) delete mode 100755 DBTools/scripts/createEventLists.py diff --git a/DBTools/scripts/createEventLists.py b/DBTools/scripts/createEventLists.py deleted file mode 100755 index 528ffd12..00000000 --- a/DBTools/scripts/createEventLists.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/python3 - -import json -import ROOT as r -import numpy as np -import sys -import os - -r.gInterpreter.Declare( - ''' - #include "OSUT3Analysis/DBTools/interface/getEvents.h" - - void dummyWrapper(){ - getEvents(); - } - ''' -) -r.gSystem.Load('libOSUT3AnalysisDBTools.so') - -if __name__ == "__main__": - - - if not len(sys.argv) >= 3: - print("Error: Need to provide the input json file") - sys.exit(1) - - outputDir = '/data/users/mcarrigan/condor/EventLists/' - if len(sys.argv) >= 4: - outputDir = sys.argv[3] - - f_json = sys.argv[1] - - job = int(sys.argv[2]) - - dataset = f_json.split('/')[-1].split('-')[0] - - outputPath = outputDir + dataset + '/' - - if not os.path.exists(outputPath): - os.mkdir(outputPath) - - with open(f_json) as secondary_fin: - secondary_dict = json.load(secondary_fin) - filename = list(secondary_dict.keys())[job] - - if not filename.startswith('root://'): filename = 'root://cmsxrootd.fnal.gov:/' + filename - events = r.getEventsInFile(filename) - tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) - fileStr = filename.split('/')[-1] - outputFile = outputPath + fileStr - np.savez(outputFile, eventList=tmpEvents) From 9fc85eec6ed0b7f3b7ddb5ae4836616deda447a5 Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Mon, 30 Sep 2024 15:15:10 -0400 Subject: [PATCH 5/9] bug fix on json name --- DBTools/scripts/submitCreateEventLists.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DBTools/scripts/submitCreateEventLists.py b/DBTools/scripts/submitCreateEventLists.py index f1862f9a..350b5478 100644 --- a/DBTools/scripts/submitCreateEventLists.py +++ b/DBTools/scripts/submitCreateEventLists.py @@ -51,7 +51,7 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): if args.dataset: jsonFile = args.dataset.replace('/', '_')[1:] getSiblings.getDASInfo(args.dataset, jsonName = '{}.json'.format(jsonFile)) - jsonFile = '{}.json'.format(args.dataset) + jsonFile = '{}.json'.format(jsonFile) outputDir = '/abyss/users/mcarrigan/log/DisappTrks/EventLists_{}'.format(jsonFile.split('/')[-1].split('.')[0]) From ad6b89d10f39148bf69afae6eb6aaf947b2e67ca Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Wed, 2 Oct 2024 10:55:24 -0400 Subject: [PATCH 6/9] add in user proxy --- DBTools/scripts/submitCreateEventLists.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DBTools/scripts/submitCreateEventLists.py b/DBTools/scripts/submitCreateEventLists.py index 350b5478..ea6c45b3 100644 --- a/DBTools/scripts/submitCreateEventLists.py +++ b/DBTools/scripts/submitCreateEventLists.py @@ -7,6 +7,7 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): f = open('run.sub', 'w') + uid = os.getuid() submitLines = """ Universe = vanilla Rank = TARGET.IsLocalSlot @@ -23,9 +24,9 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): transfer_input_files = {1}, {2}, {7} transfer_output_files = "" getenv = true - x509userproxy = /tmp/x509up_u1009 + x509userproxy = /tmp/x509up_u{9} queue {0} - """.format(nJobs,exe,jsonFile,outDir,requirements[0],requirements[1],requirements[2],wrapper, cmssw) + """.format(nJobs,exe,jsonFile,outDir,requirements[0],requirements[1],requirements[2],wrapper, cmssw, uid) f.write(submitLines) f.close() From 83883bd5bb8ff54abda7fca57cbed814e3fa282c Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Fri, 4 Oct 2024 14:17:02 -0400 Subject: [PATCH 7/9] bug fixes --- Configuration/python/configurationOptions.py | 2 +- Configuration/python/histogramUtilities.py | 2 +- DBTools/python/condorSubArgumentsSet.py | 4 +- DBTools/python/createEventLists.py | 3 + DBTools/python/getSiblings.py | 4 +- DBTools/python/osusub_cfg.py | 2 +- DBTools/scripts/eventListWrapper.sh | 9 +- DBTools/scripts/submitCreateEventLists.py | 98 ++++++++++++++++++-- 8 files changed, 110 insertions(+), 14 deletions(-) diff --git a/Configuration/python/configurationOptions.py b/Configuration/python/configurationOptions.py index 4ed0d282..3d9f7331 100644 --- a/Configuration/python/configurationOptions.py +++ b/Configuration/python/configurationOptions.py @@ -1811,7 +1811,7 @@ 'EGamma_2022A' : 6, 'EGamma_2022B' : 112, - 'EGamma_2022C' : 200, + 'EGamma_2022C' : 3354, 'EGamma_2022D' : 33, 'EGamma_2022E' : 800, 'EGamma_2022F' : 1000, diff --git a/Configuration/python/histogramUtilities.py b/Configuration/python/histogramUtilities.py index fcea205a..a7f34347 100644 --- a/Configuration/python/histogramUtilities.py +++ b/Configuration/python/histogramUtilities.py @@ -102,7 +102,7 @@ def getHistIntegral(sample,condor_dir,channel,hist,xlo,xhi): # print "xhi is outside the range of the histogram, will include all the overflow instead" xhiBin = histogram.GetXaxis().FindBin(float(xhi)) #intError = Double (0.0) - intError = 0.0 + intError = c_double(0.0) integral = histogram.IntegralAndError(xloBin, xhiBin, intError) inputFile.Close() diff --git a/DBTools/python/condorSubArgumentsSet.py b/DBTools/python/condorSubArgumentsSet.py index f10a25a4..17cc380d 100644 --- a/DBTools/python/condorSubArgumentsSet.py +++ b/DBTools/python/condorSubArgumentsSet.py @@ -10,7 +10,7 @@ CondorSubArgumentsSet = { 1 : {'Executable' : ''}, 2 : {'Universe' : 'vanilla'}, - 3 : {'request_memory ' : '2048MB'}, + 3 : {'request_memory ' : '4092MB'}, 4 : {'Arguments' : ''}, 5 : {'Output' : 'condor_$(Process).out'}, 6 : {'Error' : 'condor_$(Process).err'}, @@ -23,7 +23,7 @@ 1 : {'Executable' : ''}, 2 : {'Universe' : 'vanilla'}, 3 : {'Getenv' : 'True'}, - 4 : {'request_memory ' : '2048MB'}, + 4 : {'request_memory ' : '4092MB'}, 5 : {'Arguments' : ''}, 6 : {'Output' : 'condor_$(Process).out'}, 7 : {'Error' : 'condor_$(Process).err'}, diff --git a/DBTools/python/createEventLists.py b/DBTools/python/createEventLists.py index 680563d6..22048fac 100755 --- a/DBTools/python/createEventLists.py +++ b/DBTools/python/createEventLists.py @@ -45,10 +45,13 @@ #for filename in secondary_dict.keys(): if not filename.startswith('root://'): filename = 'root://cmsxrootd.fnal.gov:/' + filename + print("Getting events for", filename) events = r.getEventsInFile(filename) + events = sorted(events, key=lambda x: (x.runNum, x.lumiBlock, x.event)) tmpEvents = np.array([str(x.runNum)+':'+str(x.lumiBlock)+':'+str(x.event) for x in events]) print(tmpEvents, len(tmpEvents)) fileStr = filename.split('/')[-1] outputFile = outputPath + fileStr np.savez(outputFile, eventList=tmpEvents) + print("saved file {} with {} events".format(outputFile, len(tmpEvents))) #break \ No newline at end of file diff --git a/DBTools/python/getSiblings.py b/DBTools/python/getSiblings.py index eb2c0073..00f7543b 100644 --- a/DBTools/python/getSiblings.py +++ b/DBTools/python/getSiblings.py @@ -74,12 +74,14 @@ def getDASInfo(dataset, jsonName=None): test = ast.literal_eval(miniaod) files = [x['file'][0]['name'] for x in test] + events = [len(x['events'][0]['number']) if 'events' in list(x.keys()) else 0 for x in test] lumis = [[x['lumi'][0]['number']] if isinstance(x['lumi'][0]['number'], int) else x['lumi'][0]['number'] for x in test] runs = [[x['run'][0]['run_number']] if isinstance(x['run'][0]['run_number'], int) else x['run'][0]['run_number'] for x in test] miniDict = {} - for f, l, r in zip(files, lumis, runs): + for f, l, r, e in zip(files, lumis, runs, events): + if e == 0: continue miniDict[f] = {'lumis': l, 'runs': r} if jsonName: diff --git a/DBTools/python/osusub_cfg.py b/DBTools/python/osusub_cfg.py index 071e6e70..9cccac8f 100644 --- a/DBTools/python/osusub_cfg.py +++ b/DBTools/python/osusub_cfg.py @@ -198,7 +198,7 @@ def skimListExists(dataset): def getSiblingList(sibList, runList, siblingDataset): - print("Trying to get sibling list") + print("Trying to get sibling list from", sibList) siblings = [] fin = open(sibList, 'r') diff --git a/DBTools/scripts/eventListWrapper.sh b/DBTools/scripts/eventListWrapper.sh index 6e1642f6..8c3c2c07 100755 --- a/DBTools/scripts/eventListWrapper.sh +++ b/DBTools/scripts/eventListWrapper.sh @@ -1,8 +1,13 @@ #!/usr/bin/bash +(>&2 echo "Starting job on " `date`) # Date/time of start of job +(>&2 echo "Running on: `uname -a`") # Condor job is running on this node +(>&2 echo "System software: `cat /etc/redhat-release`") # Operating System on that node +(>&2 echo "Arguments passed to this script are: $@") #print all arguments + export CMSSW_VERSION_LOCAL=$1 source /cvmfs/cms.cern.ch/cmsset_default.sh export SCRAM_ARCH=slc7_amd64_gcc820 -eval `scramv1 runtime -sh` +#eval `scramv1 runtime -sh` -python3 createEventLists.py $2 $3 \ No newline at end of file +python3 createEventLists.py $2 $3 diff --git a/DBTools/scripts/submitCreateEventLists.py b/DBTools/scripts/submitCreateEventLists.py index ea6c45b3..84b14ae2 100644 --- a/DBTools/scripts/submitCreateEventLists.py +++ b/DBTools/scripts/submitCreateEventLists.py @@ -6,6 +6,9 @@ import sys def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): + exe = exe.split('/')[-1] + jsonFile = jsonFile.split('/')[-1] + wrapper = wrapper.split('/')[-1] f = open('run.sub', 'w') uid = os.getuid() submitLines = """ @@ -21,7 +24,7 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): error = {3}/error_$(PROCESS).err should_transfer_files = Yes when_to_transfer_output = ON_EXIT - transfer_input_files = {1}, {2}, {7} + transfer_input_files = {3}/{1}, {3}/{2}, {3}/{7} transfer_output_files = "" getenv = true x509userproxy = /tmp/x509up_u{9} @@ -31,6 +34,78 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): f.write(submitLines) f.close() +def checkEmpty(filename): + data = np.load(filename) + return len(data[data.files[0]]) == 0 + +def checkFailures(jsonFile, logDir): + resubmitJobs = [] + outputDir = jsonFile.split('/')[-1].split('-')[0] + + print("Checking for failures") + print(jsonFile, logDir, outputDir) + + #open json file to check file names against job numbers + f_json = open('/'.join([logDir, jsonFile]), 'r') + a_json = json.load(f_json) + files = [x.split('/')[-1] for x in list(a_json.keys())] + + #loop over output files to check for issues + for filename in os.listdir(logDir): + needsResubmit = False + if not filename.endswith('.out'): continue + + #get run number + runNum = filename.split('_')[-1].split('.')[0] + + #check if the output exists + thisFileName = files[int(runNum)] + eventListDir = '/data/users/mcarrigan/condor/EventLists/{}/{}.npz'.format(outputDir, thisFileName) + if not os.path.exists(eventListDir): + needsResubmit = True + print("Output file {} does not exist".format(eventListDir), runNum) + + if checkEmpty(eventListDir): + needsResubmit = True + print("Output file {} is empty".format(eventListDir), runNum) + + + #check if there are any file open failures + with open('/'.join([logDir, filename]), 'r') as fin: + for line in fin: + if 'Failed to open file after 5 attempts' in line: + needsResubmit = True + print("File {} had trouble opening root files".format(filename), runNum) + break + + if needsResubmit: + resubmitJobs.append(runNum) + + + resubmitScript = logDir + '/resubmit.sub' + shutil.copy(logDir + '/run.sub', resubmitScript) + + with open(resubmitScript, 'r') as file: + lines = file.readlines() + + # Modify the last line + for i, line in enumerate(lines): + if line.strip().startswith('queue'): + # Change the line to the new queue value + lines[i] = ' queue Process in {}\n'.format(' '.join(map(str, resubmitJobs))) + break + + # Write the modified lines back to the file + with open(resubmitScript, 'w') as file: + file.writelines(lines) + + cmd = 'condor_submit {}'.format(resubmitScript) + os.system(cmd) + print(cmd) + + print("Jobs that need reprocessing", resubmitJobs) + + if __name__ == "__main__": @@ -38,6 +113,7 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): parser = argparse.ArgumentParser() parser.add_argument("-j", "--json", type=str, help="Input json of dataset to get events from") parser.add_argument('-d', '--dataset', type=str, help="Dataset to get json from") + parser.add_argument('-r', '--resubmit', action='store_true', help='Option to check for failed jobs and resubmit') args = parser.parse_args() jsonFile = '/home/mcarrigan/scratch0/disTracksML/CMSSW_13_0_13/src/DisappTrks/BackgroundEstimation/test/debugMuonSkim/Muon_Run2022E-EXODisappTrk-27Jun2023-v1_AOD.json' @@ -51,11 +127,16 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): if args.dataset: jsonFile = args.dataset.replace('/', '_')[1:] - getSiblings.getDASInfo(args.dataset, jsonName = '{}.json'.format(jsonFile)) + if not args.resubmit: + getSiblings.getDASInfo(args.dataset, jsonName = '{}.json'.format(jsonFile)) jsonFile = '{}.json'.format(jsonFile) outputDir = '/abyss/users/mcarrigan/log/DisappTrks/EventLists_{}'.format(jsonFile.split('/')[-1].split('.')[0]) + if args.resubmit: + checkFailures(jsonFile, outputDir) + sys.exit(0) + nJobs = 0 with open(jsonFile) as fin: f_json = json.load(fin) @@ -66,8 +147,13 @@ def writeCondorSub(exe, nJobs, outDir, jsonFile, requirements, wrapper, cmssw): writeCondorSub(script, nJobs, outputDir, jsonFile, requirements, wrapper, cmssw) - shutil.copy(script, outputDir) - shutil.copy('run.sub', outputDir) - shutil.copy(jsonFile, outputDir) + '''if not args.resubmit: + shutil.copy(script, outputDir) + shutil.copy('run.sub', outputDir) + shutil.copy(jsonFile, outputDir) + shutil.copy('eventListWrapper.sh', outputDir)''' + + #os.system('condor_submit run.sub') + + - os.system('condor_submit run.sub') From 0e14b0d0fb75f5680b661476b0083c9692c955cd Mon Sep 17 00:00:00 2001 From: Michael Carrigan Date: Wed, 16 Oct 2024 15:07:22 -0400 Subject: [PATCH 8/9] updates to fiducial maps, also updates to create event lists for AOD/miniAOD merge --- .../data/electronFiducialMap_2022F_data.root | Bin 29626 -> 24610 bytes .../data/muonFiducialMap_2022F_data.root | Bin 23459 -> 23471 bytes DBTools/scripts/osusub.py | 4 ++++ DBTools/scripts/submitCreateEventLists.py | 6 +++--- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Configuration/data/electronFiducialMap_2022F_data.root b/Configuration/data/electronFiducialMap_2022F_data.root index d05658762473530deca93b3247d74a26c17bf889..113539ff165ca53187b5aff25efd85a4e69efab2 100644 GIT binary patch literal 24610 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�UM zg;DP!DG^WkBnO2taS2)TGZ{N z0&BOu6PVFQ^G!K^4%1E1hqirdZweg?3M$ABr`_GkKIRDUwasfFoyNKOJ00q!xcnvH z#7()CLo~qoQjk6-e^OkrPHDCbIVznQQg&SzA5&>bE&V#P*gEwwi_1RSay-Plvef7C z4+$G93bFs%XGaZ{y^KSWbJtEZYSUR8-dZGor3I+6!yOsgNzk139ENO3%Nk=HcBK}) zxR)fX(MBy5MQj(LN{4Mu2SNb-ahWEQgO3ryHXOyN-~7^aE8ZXOuZaUf_>H}iUXuoT z@`HYN{9DT|J}90NH>GMzP8`&%7YA>QR3>QdbHp(++O~M^1AM)wB%f?{kEcZ%^w5av zl1pabqYmN#mcl%kAgK#!hvF$8lEQs5DDg~wAUviERwc!LL~9F6Y-2Ip^pmHcCP8MO z2FzyP(}WLfGfG}NMuq}Cgr88xmJ#$woZ?k%PMc(id&yGuH^e`vpEZs)x9hx5e(~ zQhH>3*(BcALQAC;SrvIgn-qIInOmz_yG?5hw6!8eb~3pkul9OP#9FgEyemvV=pe@g zpgd))&Jv`198JQ={Q3UA`#kp{8b9}xqJS4bb1ISV8#~AxHLBk)>66a`X|R$$id0q( z)7gpYCg~K3X>Q;}8mTE@k8K4>*qR8kSvqLgS6SRkObvR1w^#o<`bA5|VM*Ysh0OcH z&zrFCD=>-9YAGR@rG#8LN2!+DAJ>_aEP*_se?9VafUFg=aKHZhp*6A-?id}^KpK18ldyJP$3^}#@(%V;{TKe>2w&!mtsqk2IufGr?R>8nCs`dQCbQ)s-f(P z#U0qpU4*%uGJVuWp~PBkwg<76C707G8KJvqKEa|UG1(cbrbDKJeq%FaLF)yk2P>J} z=atC@D`GxMShoIL$e03FY$-UJ{+*#I{4!;h-V{0HCEmAqf!o=Mn|$+~!PEWuD}Bxg zT-*cD7$6QDiBQl&zx?n?jb$?Yz3bQJ!*hRwu?216 z!~u=7IVBGGHrN&xEEe1ENETja&gqW-obR8G=a`Aq%_d0k?pS?qA>jR(_5V?nODQm~<&NPGY)PptwfCWyMPd{a< zCH%3ReX#(_^v88B`!triwMB54;7&CAlhWXQ#iGhZG6gx0d0SYFd%*sZDS(=3+!K2Q zXFv^G!RoxqqS$gmtxayqtG%zyxjc$QTK%E#v)U!fpu`25>EA20qA2qN+XrNziA}Vk zet;%R=PjoPrE&LSyKoZm;HwVepeA#`eM4%#@ljvB)CNdF!c&voCt$Q-ECXGnn)LIP#ngQ@QbSjPc5LwVH!~#Hf8O*n~3^!co z?|BVL{l40h3RrU*cPASRzU|YkpLb17ZC*L_(_>Eetmfk5^ONrw5xkH`+wc?j+@%G} z>Cr?p?UTDwblJscpDME{G3^!udK*HWutZuanB9Y4Jc(IvBomC1rTz3lK37SzmFR%P zb+RRP0+;mfMR@aCM`}!VVWUK@{K6wGvvEY1DoQ9ykYdBj+zZ{y0sXdzLnfNt3Eibs z&2E~lnhO7QEE02_${eclx)WN8;8~LpL5`}D1z8OGrtk|-b^(=eZh&^14m(v5oBL|m z(SH_z)goKI?>Y)ZqBS5QC?n{2 zEvAfZKDjXr{B)Q6!fY1zB6OS!3X2M5gFhyn)#%fuLA<1F1mdM19x~?V&zksmq}XP6 zDbVfP;<+m}@aim0*3+Uh#6adoVt%>ngY6hDxX!h(ycKx!mPP%aWwHy8@O>pDP8%7> zfKTkn53MVE84w6^qy`VQev;s$OFEUxd~Ru?O*`Z@a7IJr*1-AHWXb`_<}g%i?zjlB zi40dur3em6jFweE-uE`W5f~`)lADQTfXEL*(s)F+|opk##+UG(D1UqJqw}- z2qNAwoB>WK2XT5rb1+%zt+0`0no&LSIX(faLf$d#I7{dfX|T|sfO+5~_E6n$ZC_~+ zw^Wq9tg{4PVFvByHQ=U^b%v%@;k6tvXPUMhG!7+|nIX-F&_I{gR&m|pHm_Zomh1hG z^OUBm{{Z7@1k?|Fofn$R1T;+NR%+IQV06KSWGHOvDI}fp!CY`oI_w@2gXpqd^#9Jb_?;tYT)xf?wkF|ZO`KNT`6pI`bthN6Hd8>m@Sgt_PKwrF)Hck ziU4T~G8keg9mHj>xHhs`A#E<+N^LK79s3SqmpWUMaa@}zm{f|$UZZUBHX>6uO!-=p z&s(S?u!%Aykj;J0;=URhAAMbu<}Z|^cc)RDuxv~C=C1oUUI1@fawzEo=Z_K~<$y=u z!TF1J5o<_+BJWa=foo!{$ub`W`u0 z*PTSKJK#wi^k;kuX(386>h&IwW7KMcE+-2&(<1^%oJ~d(9RgboNPJ=-F3jox&~HX+ ze!`CNmKbb9?LcWCXy-#lu&EJH$PhgUy#201j%o){tg$qE6VeU~vtd}IF&HibP2u!u zY^n|7(7>L8P%BIk$Jb%&8U?>I8NsEHvsxvq$U^Z9Kw9hVY(FCW5~XL#AdBiXqf(iQ zxc&{a(RfN4^Miir(Z{k2=kG@)Gnaf$HVl=^$ZE z{Y;0;%~^}6Ge6oE=OP!oTNbBNUdK-L|4f=~SeUek;#kam+Q$9=Lc;G{%o_{U=y|Zp|7%sxb;>{!uRxVe-D8ptA}-jc_TES?3qos^_eq`C z5>(kOq(KLQ1t9nH)sV6Xv$zZ`vkZUO-JKde>0Ez8RUo+WqlD(^BlA>8D!5N#j}Anx zc%YE0v<4CiF2EkzLfu;%B?kg)bwg2s1LLoaO1xid#i?r(MHTQxz5ln`Z2_xd_duH2 zQ$o9ihoEZS79tmfik5HzsN(EvZ(~~^Xnu=>-&`GUHDL?5*bD=J#d4J&$b70nPjd$? zse3ukGFUlv|9^`7&luJ=FGda@N7<#Z?H=AwJ&;|yG0rOXu``DDEs&JVKvV?qdlJWA z+p}J1Uh5)>*4(|?*6S|sO!LMCc>+X)hd={^HJzc|&4IZJFan|-+28|8)kOBasUUnZm{KkHt}`%|vffHS0XGrG zR~Kysn?wpyj*ezHj@IZFhdsbdF`U6Z@l*+XGCZEk!7sN_8e)wvfsv52i(V)MDXv)B zm#>qI{pjtaA>b1FYmDiF^@WOD2H}=h0nZvx#ZthK?JM*WuXp0y)t3yJCUGi^f^7in z80@At8A!9+Awq-L))NOY`F>mjfbBb~XZb3}AzC4dptIaCh}rjHA1qC7_^5=eholX7 zT8n+2Idt$fSmhXvT0O{z$WfM@-q#x!t}|6}d@^K(ATm>Leg<;^0V!Bw9Ux4Go5z>q zQ0bD*_+WRXYAf*2f>RLcV>UJl&3N#M%W#05D`7guwMzePO6RW?-Ubs(aTEl?c;FyY zy`A9z`8=R6$c=jf)}!hiv~eGU;QxRnJOv;7Kp<_b6YM(=+@TES&M3#m>mTngmR z+RBEs%VXoA%@A#|EKMH2^&I;jCIP2bf#(-(1HbM+tzV$1qf37Ie>4fW!#lPI{2}}V zg%2tS)%-qCkWfOf5y4J^mt)ENa}YH8Xhn6%_vKVv=?6iIpV-Ur02Vd-vn*F0s_`ns zL9m&w9$$V(rF}OUCH9YPyKb?7Uy+QJg1Bk*NnpF$`=g*uSVf zf_s`#4M$h`yzY&gGg`S}{rf)5>G)Q?zFVMGedD>Wwz7Y|F83b$*3=AFg(1wg z{7%D_MBo*c$GPdF7Md^&8z$AIf#X0K5m?s_$8Z13k$^#VNyAMDCam#&*+>5Tvsi8OTuY?~L(TyTNwuFCHHyU9%1=dS|<{#poBccC%C0gU|ice4o`P$InQ zt1FbdLJ|vk|8HtXX788j1-{-y7})QaE~r>ad|8%!4qv2>mCwJ5-m3x;S=hh3b*1;*5)1t49E5;inW4JN|0Sik&w)!Hb5I6FZX7AY4+kdA(< z;Ecw3u+=b0i$k-u&w1}_+<;Hf7%~!@KBZmV^QfAXrG#nFOO=(XcXBEq;qhr6#bvRT#_gJ6nd$#@Rl2dohC(Es;Y!Ix7MJ1mY?h_CmS zj1>$o+JO1yD!b}6kTufOV_|C#VhQWc z@{aqh%DvBnpc@S#P?f#xn61ay;(Ds2n?(B0oMCnpGvuJ_Pm( zx}cBRl# z#3F_*(7W;VJ0SAu5gjJzV7N*)yxku|$>t`~AbPEJ;&3*+N(9tb4ulv3;v3J^LRJ&`#Z_BPrsNLJYq1UVBuc<-n%SR8D>$%+98+Fa> z7s;5H=?=tn;-M!Wo^N}PFZ)IBPR3`VFU}Jyj%8`boj!VCe+0hob;$XP=JDnxCLs}b zxp{?c7uDEjQ@AZeKdr*r!;(X)?DlIEAGfW4a%s#>1PB~o)~fd1|I0@btjk(<4kT{g z0eTJhcnM)xsShmshcIl?SaOnouz3X`LIsHjf-FHF{O3uZXjrv~t`Qt zuO9Osufnjq*M2;2JI5!|8}dL6SgfZ-K#E}m9SvGe%VE%F3WgDPS74KY!rHRrkai%TTxN;p zm=rtQhU$fzw1XI`;hS8}21)C*hGrZ+x1B0*xxJuNdWTkFNljo5U!Xv$fui7CCD>&M zWk3lW(@Tk@_1FFu6%NhRX@NKI{!Mt~nW=X{s3oLa&r#^zdx5fnU5hfU06gTOb6$By zpyDfKgIjba;ZT$syU3bB^sD-9EHLXGwGp~g0(YvN?qj@dps zS_NYVsyq5d1#Iz%-cXB?jBtj)=46n~7rzTf?J%v?G%dT2ywik9@9-Ubq&aqK!0^FM zQY#JK+NSzH*6KebWpoNvZv2qQ(UY{$p+)$o)x>iHZA=Py3~Q6a_z71GPC~gzT4>X{ z<0<=6)f#;&(hF4C9J;XfMFMCB54?G_qe<%N+C6ZT46fbp<*lNGB{QF&yBe@+FBR7C zou;rB22E~T^LRy?W{1~0BzMQVPAFg==mbpw-jS$+?qTxC=HkF{VyzYoz^go3TnM@K z_BWLlzr*l9#1sp7JQ$m;cd)rL5XPiCU=Mn&KK&hy3qa{TM;yu>6$&L0{JR%qm1D|o z)ef8dM7HuJc2GXnn+w^T?xMk;>)0}B-1ZcYx<#KHA7yNE3$9`8V6$-`WXby^tzo8&SKABE zHiw^akc%LzxML?bgzkr95-4FRD1TjJ)QW^bf;9G=$o7U)MhqAIbbdcdyDgscLI#71 z29@CmrmcVhXCnhs0f`b|vk7!{IPnC*_<1Ho$vQB{07Z}seVRe5s^BX&DBPs!iidrKJ#$qql z|5rL}+?)ee3a+})QZRmvTVKQpA&00w{(>}*+{vNlT@OI2g@E&z!2Vmg!UCNO7? zr}F*XCS#gT5^9M5*#85Pa5Oc@Xod_K&b+N425$9Oc)~_-0JD}ZS=w;UMi8FLtt?B1 zVT?Z8q%iklcYGNDVH&UxBnS-Ayc%chGN%Z$oDxkKJeP(hf*HyU>`8?aLU+*c$ML|k zJ8)|_moV{BfyexPbgsW`{t^>L6ka7uL5;Mv;?y^IH1{7%i=@B+Lz?YKgsh{#fVYca zv7y*y)k{MD$ME^ zF&bGm)c2a83I7I)#e*T(3+k{Yt?aJzf_5L9%*-P_voQgh?AX zr3sk-^tUX1Nhe*uhVs|Z{|pLy}xds~{r4yBE420+=#=_H9{!tkpsnvk?%( zKeD(U8p3iw;0~C2%o#cA_`w3hj8?LsPJu_YF&UK$cExUa4Q!z|+hHss`$ zR3Qj{AUpAndRI0Wbd-irHR$JZx>M|0;Td$?HAh~Fpnj$Z9N`%|?7148F2T_ObL}yf z8hf6|R)%Sxh6-TWRqg={N+aEMr8JwYVKyqK)=66-Bh97(LkhI%HTb^upe{-)(j)Qa zhw8a2fa*n3tegLn@{N0zVb>=1Gr1 z1|FCI9w2I`NihV}+vJ16@?`eO09!&lVeTwE8{;gQTfa7n0ZhvQ9`})r@$hK&VRe<# zj-q)DxUm#;c%_5N*c;ZkiawVHgrd?xC9%u6d}^tz+O4l~Q^}N%a;@iRuq`w&Nk9{a zH@$)VT^Ko1yI5_lev>T*rqIXz*sk2E#OPPn#M%4|eVjsJb~`3mo++hKM6h=7Ama2Ts< zq-p4>tH7FC2q$Q3_1)u~0;BeDGT7nH;VRK@;bRU+f}A}}m|O@~ zgDziPG`P(uCc;s04>lLJ&qvbYPKSl1jrd#aAtuo4JSZC!V*I| z1bt4^#=7k0c-KBXm^HPckfBS{>;Vm~?WQ4=r*Fg01g*T-a7+)l86epF9GqbS+J;%8 zaF;L)VTn2!3>_4kgi)XN*{$_^IO#NFDRxkG%PZZ5bf$y;gwrX2+7=?9b&XNq{6jeT zc*rQ&R$z)o4yN?Uc7REtcu+N*KOkpuLl*0oE)MB(Efme_G{wZ!)BlIRTCxTG)sjsC z|Mgc(aDK4e9bK6d}O#qozHT)G9m$)PWQX}2+*+pq9J z&&*)tc%6LPiY-f9Hfs}BJ@&u2PuZ;{M>2ZJoy1V`qdU)b1${E2evaG2{HEJgvANw| zk~L|nm6W||m2vs+x22rhd?(L!dPnBUYn2E0CqKR69#YRs5u^()PV!FjBw}yL3g!E_ z%Rk?ejpeiYe}1uUm~OL}|I!)rT|Z{3Id*7U18-QXc~OwciHMmqjwMOf^XNW9D?)yW zO$uo=Ud;Wxz5dzizAux@Y8Nvu^bc--ra$$Eu~`2v_46#Jm|0G4Eq{12>igY()0iP+ z^ZDJB=Bm$ceRzKu*Uo>i_&LRo5iB(K&p-1K3T3AF?1af!;o&~6lHgg}QWwhA&k<*x zxGlBp6^+JmA&Y%l7V|u(zPTR}=0Dp*R2!zc8-5;rrrLkOIJRkZA9u!m@k?9(9D7bZ zmM;;@o3i*tfPS4}Tr2*g!e@4@qRo76EM?j*H+tspfZTaQeOaMIpS&}-X_Y^IOkZ}sRmVUvqQpSf9FRHD}H#&GP#X@$&z zs92?S$454LcoC%|Pg<-tY#CT1Ub^O{_v6vhQV;3;Nc(4n$NcjA{iN)pNgkO>_RCy+ zkEF+I8?=|7>o@=X#LzS?Fi+cH1u4nqqgU+HR_RJ#&!;nBx`7nhiy40nI1>1nva{%DJIded$r@q9%Wiknh?oWGx^fnf_){PK?5L4Q$k#p9z@md~R+&|MVrMka?tK`_*`|uZMl5uSX^$ zS;?NCxw7Y%;>^Ay1LY+9H}40V4GY_xPqg_r8I_Ujm&sR@_pCbeDWx7E+^UJpj+wK4SJx* z!H-#0{^bUtIp^3?G%pN1itSNWXP^S-yn5w7at}JY0ZPNatsgIP7Ry zQT6u1(YXiT7K-{BQk>f494fa5z_!EYp`9%5UWl|;KP6x3d#=%lv0j=54*(0P;R%oL z@oabdbOEQ{$q4Eosr+e(I)4G~OR~RPTI-XdOZJ7^E-~I|ZLeh?;dLFh#`hZh1UpMO zsFW|>a%9cT<>~Q>9!hA-ewa^xuW+ujS6b((RGO#Aio11NoF(T%NrO!gZU4HPdEJ$7 zGX8Ems(Euj*pP8}KI#poaPVVo?6zbQNxHit(8J3LiY>AGwq`zObi#dpqueI({BKVK zrR?jjq>rDS{&7MQ5xfqQYowBh$Z3(b$8oNQT^|5@j9 zwS{!c$SlhlUZyvBsr=Bx3^|84YNNXFbm@;3pV-7{KfT?zM`>Nj-Nx`2;cX7@E)OqZ zVHtV8*P1+_FG6#c=eLiJ%mmzhGJd%}Yh~v0R1&GMg%IYW)^S3#Biiy4TMgRZUnQ;c6n$xZjqP?ZkkgZP`C)jubuRPq=K7-@XPz$4UuL|s zzd0NWX9z9TbCvaAPs$DG-pcThu($TRS#EDl`#W7_9ojpgO-yy4Oc#gb!tcHu(79~x zqh-&BZaF`!#=@*TGNC}-0;a!n9zdO6`!F3H^|V#qBkO+SZn$P6nQ8`lPz3(jA>Ex#XJL)>GBY2x1pXLW@8NYXPJ4E0b-O|)G)a2X+QLzS zmz9LQZvK6K><4SOp`7ShmF(lRpVUITgeUkL%IPK9xOF~;Cp46E0C4iiTnYsX4-_`> zW5PMw%+o-%8fWVF^m+I|o~S05wO~f)4)-Ppn*Qj16f*}+2TiM)A74=pPx8-arAR@C zdt#+DW;1L7K3JE@z2C9jz&G&7qP;})vih;F6zo=jKkxpf{AKy_#yjJN)kG+A zG^S*3%5|~)(o$3`fl_e$_szGvR`#{UZk#O4BkP*YPj8iO!Cs6$sJbIzuN8b@0?3FU z!mZ?Eq0UNA_-GSP#%oR2JsOUX$W55%Vdj49C!Y+* zOt;_*$?&eBH=eE#hxbE!htT@TA1C*R&ktvQn0ueGGb;nZcl}~ft7z-UzJx;)I4EEF z{PgYDRiW05p49pRV~ev6*~@h6@Al!@ zNTaUO-)(fVX0zxjt%O61m{s0zd55oM}tS3(W3iDfUF=wXX59L?b*CsDzEnxwULJ!p+ z4pkM0TH(yhMq0*^eLW4u^S!_Fs#k1yjlHlxyeCdOGq9-=Z4v7Nx%+t9v`Us#S*iK1R+dT{4u?I%;`&Z#^`)#XW5G-N&5Ce6D1&}SurCOzqvn-x#Tv+ugu z%VbW#6Z_3dvOc>4_RLRxSBrJ*OU=!I?VTMe)_xN8;sr_C#lSf{S{+?1-F#?xfkaA5 z%!Gncg@;Q+?W6ANiP|8J9Ns!IE@eM&BI^J+brd8(xxos1sEmgxyW;!}fegUSI&kORJd220pF_W*5E+aB?JaTnjqTGg7D z$IT`38()kD`kMMl1z&Ij#Ra_eY&Vb~>1JMAZ!^i>==9no8>J_mRtOcB0qBXKBsqoS z-JkB01r&(^GyoP%mE-J`c5FQ$GR8b%PH3;t@g1>f!-o+B< zWk5a;r`)5X&NWDt0Dd>Y$^x4pgd8vhdOiwQu!~dzntDM>DhzD;p@GPC8A~<2$qJaI z9ev|vJsJ2A6nYP>eC~013^LipPv6KgsbBL!WTZq2ZX*@xZVKt@-fg{l|}Wfph2Yd?MKFs z`FYqYWahOHG6NAhgtv;sPTz1y--D`5bCDKn8QDT_nFCN^4~tqEYfIRFS^WMdxLcfd?s-inXpCL$KBTwodg zdEGbKzp!aUkMWiQB%d(Uo1edNd11z`y?l0V6F+p(+<`tG8{hkXMWre@OD1(6CVi=M5gO*F3+H z=;HgyvHgzv#eW>cV6#m(3(6Km+U8FFX(UMGo80<80<9EtlgSoNGKerfj>n{ADwX7c zdbaTY16pCf2>a?IH)qx*!`&|EoQfj40;_JdWEl-s~Qx~&m9O= z1?>R@8QsTnMvCcath!H+H7t@L>tk`F!r?9`x06G(`KS%G=7Q?)Od~p9epGvy}s%Rfb=LC0q$8|5+!GY~ZYZarwHNZm`8mkcOGO3)^jUI!ZmzDlf6v+Rwvp0==&0G#S3&kQrAMwoQa>{g zS``udgrO>6xnW(?3x5x!rBjZ&<=*YeX@TcM@G`v1<>e>y7#{Is;#Ru}!dpLI-+n4YOw z*>jy_uM5jt{&b$~<_mRw&@H3s?58v1qmg}lzN>}06%>wv9>`zMkHRO%vr9w9+t!JL zDv11dee-~Ky1_=aw#^0tVi=j&#r-R-SoN*YaLZWVvH%J`gt#Mbk_4Oy^5hhF-yi46 zY#pQvM~c3U699RTDB4^Va5`FDu{Za_9G^G5H81fAm|s8!&=)I8@=kZh_V<6dD^m@u zx7`=XIkbC!4MMG=%lPJfn`MReYk?DOvhwJyN{NJA1n{Qay|1)64VvTV?D<<@DCP5O zhC}2dmDCo`8Q#2L14wELbOP(FgfPwVcM0Uaq&_&v)3 zoqQr1Mlup-$D#Trsk!{pi{i+TzQSIdg|z@wU|j&dzO?QWt5&bUgbXBYdV1keiU;7J zxV!V4dDx%M++@gdM$RZ?nmE;62|O}$(8o}OXJrmj_U+=+TTn&)yG2N$DAg;7r~X57 zQ($?#-K#8CKR)UHV=%lCF_p*RkC}7jjLWm3cb4UELrT>gt30J>)nI1G`WA)+$k7(0 zAwbomN2~qO85!W0r=58T*%zy!=r^AT{f6XihnFEMFnJUn*em8vN?YOL$8h*CdZ!m> zNBogggSxC}<)2oBfM6QY=;f2qqupBVm5Sw0^vfdb|9AS?AN{lIfgwF%p+wJgnLKBg z_+CzA*%F~3Kx3ysNqIsj(qh{Gq_l8xOKkvx328*EP!h_h(jd3;-UCAH)yUK3?(Iv! zwG7XLY3qL;{-P2XStPOa^zF+HdV%i|zJE9kk{!ADMv;yMltLL2$hQOPDNstm7aRdG zvf-xxI&HK$nm1R@KY7$2Qw}_nH++fA2B48fsfvgmKYetEG!GE&$Chja7^+Yfat?Pb zBHUtsr5~A_)JJJfzW-cLG>F^_iAPF;L^A0!2`KdRwj+R?2rR19tt0+lcDIcAt&=(L zE{Iwik@)`=&>20M;*XMG-Qa)Sv*08_rJruB^nE(C?%NVp0?1Ve=7QlfEuhYT1Ww07 zEC-}oHy-*1dDn0L(>y3n|LnFy-5*i|O^*;DBYCgy4EA8u`}=~hYklVWnY0`$me-z2 z)E3<%IaM1y>_rj-eEknmQUn29tpUV9sz}+%WF|ueAiqBAuY*#HBY7aQFM@~BD@=i0 z1Y`iTeEMngr1TFNy`|4}QNV}r93aOu6s2DIima!D@rl4lDA<6M!x|CLmft~P1xmHP z9?bXGcM6#3yz- zhwPHcbnN-1_vq8-DAPl91u4miNn}$#NjZ%~y0Ru$n#;^h%A?gnnl8}uDI{W_X85~7 zdRb>G1z#}7c8i#Dv=xY;tQ2f+_a7%e@yDa5Muy0fqb|8A2*~gB1M-79MTswbsf>yl zw_B`i*pU5i+Iw_h_7L2ltQi>k#ER~F0Lg}h{D=A%O~B`Y7FqPj23!BH2$u(* z*Fp}vU_5#&sCZFURh;_g9Ct9{!p)K2a}63h-3gr+4jou zkD$mv90Z-1msU>9SAGg~1jLXB9E;HJ5_FEg=aW$tXjh!+Nq%J4gatK?)cShl=*%=k zmZ&@PEr`6cU5mB5l~Bmp^mq3TlwoCy;96=!hw48#1Jr4MQGYEE)_9~6O1VU8f^;(W z_uV3gE7GEHIVeb;DWVN{O4TP8xu-;}yAqyPBvzjmOF$yU`V4^>XeR~eb$D}#2EJM} z5N|#ewt`(cgmRs~dM7VyGeBS4RRxWQ2%RC>yKm79t;50!FWq?3>(PDM9mTvN)_&{J zJJSjwl!Sdm&o9{q(KIr0H)zq(`k}Dc+WrkJjJ#DR-x=1KJRFuY(T38u8vuxM5LH#< z&Ncp6B8t9Ha$VF{()d1QSvw%0(Gx6HTf_z)nX@K{50Iq)K_|bdX4P1$Rt=p=8BP`j z#jJ00v1IUDPj?;dt^y0+{$38a7M`MIq&5XC)QI530ThbmQ?G5y>zW7yWUftK4y!A& zmf%Wt2qL$Yr#;&f{YGTrfaf9)8=;~oBem{_y@HFFOiZ8r*<^!45L z5IP`l$oo6Y=dmm*bmJG{6f_7ZfIpyVMYQ$V#(d$ z*e%EXJnAX~+M)R006n|es~<6?$b*XU^YB{hiGmNf7V?TBhTgt?wIYmvMBPt<)yjl^ zQL+y)+)j}XPZ&Ngs(`v|k+&~g{eHX+;)2n?uStvam#~AuPXx^a(n5W1c`4FDaHsGT zP;-pS&^i}wP^#ZDGCFn?3;}kp&k+?k1O`RW8DR0PkVf-=JDR=lm3}U1cp1u^%8KAG zq1K|7N0uAnDKzf^n+A{t;ZyJ~qjvD7FHVA`goqw$82lc}XVB!MRSH!!R18R>b(bet z7ySLe=cdN{^WwijvWoi`A_EEYwF=NAy+=_#3JU@ZmksJu`!cC+=pthnV>&TP5baX>=0$#IQAyH29+owu zPHh-ST`BT~X{2=?bq>%n5`c*)xC9vw5l1DdByU^+Xi22a;c9QISuJ-1VL>z@egtu0 z`W?K82>P(K=$7j|4T}%A-kjrCPX3ee!qYWoJtGBH>_~p`A*jhR7-W2Eb?1V=dD^Vd^UDhRyCLo^Gt0jA z8^ZJSGX62PO75?YeD5%aa0-TfH(?lKFg{noxV$|7bC8ckoc{bT3l_5u%tX<@X$k)@ z<+=&cKNz_KP36(QbSZXB{D3_3chV?+0qqS^h=h> z`&(Ol95&TNHrMmUu5915x|^(V_xn3r#s0K?R=EOc>fNPr0+P&cybH2>CDo`qEcXu5 zmG9jSo5<$9foa!MJ-qw(iLtTP`QE8*Lph~E(oPG@hzer9(sg28es{Qib&>puw1B)F zpH8pJno?0$lInkcM*2UycUtTti5(u4K6CgZw^Kc8p+ZbbNvf1r!Ad)Hbf<6WyRfQ# z@154lT8WjN-?Q>~&q`u%w78WtgI27>U5hsm>m3|^t>-~s&K%$8+9b_l`Lm}~#W;b4 zek!-Xx}xeya?0DRCHu<;#aSVePss^ zM|KQL?_EXHNci#CVtM`1I|lEHh#%9%Yp-f1RqL0M${u;8Klj_3e1C`7lWiGhkGuXH zTBl}^XCw&AdFmwAb@}ujpXbsainM|(&t4UOfAqwS3b9v=QiF+Sq~KSp+?^Q(d286~ zhd=KA&)?3P3U)F3mX$60CiW+3V7tS*`nF>ec7I)NocZptE$h~PKU#mx&z?51cgsQo zO+%}0v|jibC%??1>ip^xU;WeBiQ(R2_cy++4#GkX^eD1*LcBlH>iIj!dpRlQGb)7;*?9$7EYLIonQEV#mj8Grle@k zYrb06)ua`}uJ;dz-hYtKZ|V||EB~_?>Qt9omwjm|elTLsb)Sm$GWW}@jGnK#F{F9* zVO6cpJ1uwp_`|rnjU{{XjwI|qaQOe|xiuty^ZlCVsy=TAewf0*3fBn|l z`_lqf`I?p8J)#BDP0Lnvh_5+8ge{*e?pcqlJx^>;YpaPxHRkUTW4UQR8w;XGU94T< z%b#)l)^KXpWIgn4#bq&L0)UjelkS+la>kB1sINfa4IgTf5fWddnmdhvE~{0*k(G}f3ZR)+aj->Hsd+K zR$bcq{=z!CbKGLU6lOU7T`&6YhM zWglGhiF1YTfC+c9sPVexrZ9v(zR>;ymiRr|w_NYFgV6pDRhDA*IJ@rPI%BJUT{_rA zc<=5~ep9;?%PKEAJ9Tna-?kOHtm}ATg*N7c)i`>k--NH=`FW%$tY8~X*8V7#?pwiS@Onl}Tag_p5GM&b%{>$oJMlFL9CCp=LIH1=V^$~lGd^TrW2*)U-?6z|cD$bl zL|NYXS>QQ+l(Ynm@u-APHj9+Z6lKimb#?SMXJ+YEczg*TY5@TWw4Q`!Lh}` zaP+8m7^kk8ObU48Vz`;Z4Ff4t)WbhiSE7a>o%<4V2XWNXgE_n_QcuFtZwU8TP>XM5 z<8m-at>_q-pe04^%@n)ZbfJ#$liFJkP$xfD>O06+a=k3&-Y`{p%eR&`V~4UU{m9UV zSDPwaN>=MjXf4_+rO_2?)vdaYPrSK-wz87P{AldBEgvyIPwwd& z%lfoAIv?t_v89APpJ{sftfzpdB#buc75?uy}_od&jp)UTqd- z_a=a*z#4N+d9d-3zRq(NARdUn#xdb~layhQYr1(Dh7?~31g9@cVvpn&czi)U-oCAA zwZN4TUVpv?;1)T+B;s^8subXJ!|yia)$1k50Oy7bw^b1@x^nM0u^TyZ%*A&FwS%O} zfua^;@>@`82jDUfy|uP17Wu^9amv<3eIq<{QD4dc`WtUVv})?7YQrc+j?S7#xk;U^ zc6O#XEuqrk@GAJ5g8J<*UF|Pm@lCuyBWXx-Tjn#<*^D^G(arXtk8s641UfALvBJ9W zTcc}LA=WXOp;@@*X6!T10;x71lAy%EUjC_VBZ`VKmODid^R(iayw>L6^0&O$wLa^_ z_eU?Boe;+0EY$|l{9d_=PH5e!jgF8bldafQIC zrmpQBKZD}RZ5me|IlB{~nTZhN!ILGg*yj3$4&cp6?&{^)>F8)+v)WEl4bt}M5qg-t zh7(V&Z*}$2OSzf!At!`dqQsN&y$jc2Qh3W8hc2Cb|A=z~Ag7Ai0bj`)V%Q-+B1V}o z4N6dj3s8Al)sGyT*82>+{w+_0A{fjJ@l>wufrWVYswpzQF&i_ya_4JS6TqGtGfO#j znbr;Fdd~C?f0{pvE&(bNyV3J}!=xQ2o?d);_c$qWI%UjhIbLj3dc$V{_%O`-+gi1MSn*F zOk8b?ESs6K3tOGrx?UjLrBk2b+n$xpjsqrzjjBf_iMyh_t2$F5vtjY;?O!sSYAt%w z88ZVc_F(NG8v;@9A~k$&hbIJ_o0Cvai{EhDmD>z+nzgV4CJ<8-80C4h!6ldn&KI-#z{>}xW3 zI*DvWYtc*gm?;Pe)SM`a1mUHP*z+mw>iF~*;bfJFcf+&cjGd;1=3lx^p;xd0#$&CQ*I>U(ZbhxKN6wT#|Um-9pr8`fF{ClN)z%F*m+0vbMuTu=z}|5G1(xWS%^?S! zWkmq90&^4!E;Tl8GUB~2V+iHu(S*PlKbu|~qbfyN66@h)z7dkdSG=S(SME0bw-3?8 z@F-&V^R?s%4Ivrxt-Jk^Ojvn^qPf^?>!-t8-R~W2>3Omb&|OmsbxI-v3B(eavrNfZ zZ)?V~&!zav%zY>O+bR0oOH1-Z%;eWC!HaM!89z;;G`aYEaq7Fl(let8 z2=pI3-{ik$a3x-+mHLdm>hH+^O9h)W6c9P7-BSS9=#a9-ruG&kIYM$J{@lzZTF;V` zA3vs=QSxB>Y$%+f{nH<;FPa*e_eNqrfg_Xjn^JaNMgvNFxjMMoyQ(AlB61}2F?7l! zE63Gpx$`|BnD>MX{od0LV5@Ys_N&*m&QsvEHuq<1V%0g44*mG4J!OO`gK!PBoi%GT zL9|;MIx~0CD8WHjHqlJvB2))ApKt-HbJ+Jawe5U>CK`})0T^R)oPRjD5!YGi%N%#? zD1Tr~5SbhqFFHdJn~dz~?$#!ROo(G?{ia+;_nOqOwyn`zRx@vhnj%JRXhj!Yvq#wk zYw>UyVZUH|TnW+~|NX!ba0PVdRwwCp`Jz>*0;y4=gZ&yuM2Qaxk{-ZXiu67I=IkFL zxtMTx@$adrZyw0_Yr3P5^Uvz+u9G3S0N|d6iZv}=vvZTNW_o3MW86z#(YIRux^&FF zHlNl}FZnkooq-rX{acSP!bKWij=`HecbL;xd+)fSE60AP*V9NkXg}%gPmuH5ok0K4 z1JdLYwXnuJv=E5Ys?>1XK_Oj3S^3h>D!yLyV<`TBz4}P;EzI?9DYUc=iQIqM!7nEA znQoH8eV{Y~*3mxUfVyAW`ru!5@Jm~NqLBYZ2miaa{$!pV0Qg5@`G0mae6kSpD>nCk X#r}`e{{(9OkJu+D>oOSMV_I}Qfc9JF(iHf&}hc5_p`V9mEeE@-c zny$s|TGzQ2l54Rizkbv#$bnOt zgAx*`KJ7tXF(SmT{zwCNul^wV(!z<~#m`BXvCD(R<$B<(1VLnqLJ%f^0(QlQ2)c*{E(8&*kUvQ18T^>ShWd(9C1MG08V)~^Y+H^qBs=f9?qgPAyNrf( zuq}HG@m}I8t}dq#IGhJ@*AyV~DguQ64M&c|g`BSv*XY`o(OtxSfQUO1hvGCfiCDyW zg&sp9a5Sj0O4ml2SdJhEh0uU9t-}G|K22g8;^M@HxQRj#B#B!pgl{%G^FbSaA5PM~M|a~=11fetcReXU|KI{~F##uD$WX&h@Ry&1 z38bLq(_l~o!2p-Ngjc~-5I5kYTQq05u=LfVH%?-n0P-^;a~GOrTR%(CMw|mREBpBXpn<63`X{XiEyT z1>6QX@`7p@Km$v2WFR+^P#8!R8VV!vJb@m7RFlH;?Q&3{94n9`{N&nN2_#f;zyMn3 zm|y`pP7#xN{fWp>?~sE~Z!4E61XxC-z7CS99RTq;*yB4~Lp+rPJ*5EowJUK}3n_4H z2`IniUN`eUS3xpahVrrv8-;27iRe;lIQ_mAVYk zWSx=(ff7hmgSh*;FM~;v(N`Q0>-gOGPf@Bf0JzS~j|zEVb`MPJhxYTRh_?5^x4Nx`Jws2EDjQRQJX0%7A1Cu*=dmJ7|_9 zN9kM|{$ly$y`%o-D80$%+&su}%?y?H;aqv_dfMz)ayDxxIYW`&N@(#vLZ-PbNns>1 zClem;328j-h}s()G-ytcz7d0!K~gR47jPcE}KN3lc1+O;P0OF#%jqY z2Vy;(85>Qr6(h?=u8a(hN;-&{PIFM5saN*qDWL*2bu-=5VR*a!QfbJ*6lO}dG&w5V z<~}&vivDB)sb$~+TJNp?&Q+VyJjvo=7hrTm`>2+}OVHD42nx`K;*Dg#ncgG6pNd~s z@SEd80Mby3C%*7Tjm=sI3CPiznRloIHN$+~xFiF5O0q;HA4dp&tACaRVJraUXtpcm z6~t@wfj;B8l;a$+U$7@5Z9BIhz<&I1qI;9_1S*G5e>LN>m0f=_Sh-#qROq1(^MMjU zitY#WD&qL4q%P@XT=i9sd6qO^uM;mMbO5+Z6149^+g35`d?`n&rI@;=aDTNc_IZ|^ zw9wJBa^f&(#2iw|Av*t&ah3u}#X5Bk$+}Z{ROJTFg74w?EcdIt6UE>~8-Ww1%0rIN zcHw0A7>AF(n|I^*yO4u?=Pj}zGk>$c)27ASyJji0vPYQ zG`JgXq#NXTWEhQN=U^8>sFYr>`6ZjE?iTLQCHQ+Yw8(&6ny?>An|(=a2&p0(`d6jx zC}baU0zb?Y70ZZ#S8&f~CMl626*Tp4zGHB)o{+h0$-dz=);-{zOCV0)Q-+gGsI3YN>FH>mNk6uhqbwbJYTLARNd7s`B8tJPh}wn2%ZIEMDTS=mDA~$d(GUL!Tt5 zAOw0Bhvmh4S*u?uz@hj?y10ge9gYUc^~PFhWjdlPre z1)p8EFx=u2Kvt{$30L)r_)08A4N|GbHs2)5l7x0Y_x`f=y`QN-H67qh$F`h4Zhb`p zNVv5q#3{Zdr+~Y9b#anX?T}IM_P12>AGgPx%0qNUqz0u_8}p6DBR!q0zNxAAD4y<~xW#t|Qb4}@s3yE9CCLNr|G^8I z?dWi5rVqgS6Z^&;Yh4Liw$%GQJ6Y6IKukKx{g}d^pE2(cqC9yK#`KFNKBuP zAJ;1rr{cdoEkjL_RFX)Fjpa_TMMX_1uufI!vgOax4Fq0q{e_d&Pb=G{#OV8;RCt06 z9RNxSV(HNvBTd!5XD$AI34K#O_khB{03NJ-v0rk!ni(-j49?u1Rq|URjz`RK#rIy5@x+KhCZC`J9f=vT3Wg?Yhrw1 zGqC+wBaCC8>r0(@qDc8j7)!|h49g@org;fBoP-~3o7pj;ySF44w$aoB9xps zHF!;`P?5V!lzWZb8)4C*Y1z98fXtPp%Y%l-LHZj4CYf5QnSX802OU9fpUAYx=5pPY8lW4!^Oi;w?a~mQkWt&G(Np*bg;Gb9is? z6OvC<^EjA7_#u}cv?qG!{uD^?W=?>Y1@zBmEc<-Oa#r|Fy&)zVU2FM3E=6JpBWOT= z`^mE8a2luFRfdUWOIMgeYj`*U^$`iNWYH5J5jLP|cr0|8;kWpVD*3>{O7j_H(rnq4 zOo%;mGVp0hDaVNW#@MUFO3RQF+1gz`PQjPfrw*6J-BN6z&qxPuhnLgOlh%eOs{8Yp zKsg&5?BWNc`PN?{aDGLg)&$9*%wA1ZAvdtN{y&28T4q{-E zFNeU$a@O6`7i9bAtB^&$>tSz6dT82%XLmHz}#Stq- z-^`OZIFp;+ZvZ`x@0FeWUK|>f)Ay-(+q6~2d<$qt7Z`S-XAh{`%Wr1XM6mJJKCVb~ zbT#mpp-4pwD9A27_vtzcmF&WavIuo+*eUtHe^T)RbGgGwan}XX45LVLqD~GefLSn? z$#xq#e%Uj)zn}L~NfUh5{3R)Sty|BE1}PG?>7_Gs;tuSWFFZ&nkbN+@&^^ZP`|gXW zUg?O66K-t&hr2gPTRA@Jpu&N5&HG)TGL&@C>&J(VwDgtk|FSu)(*k!k>ebB-P3M3D z)^lvP&^yC8?T30=A#ox0%iD_bw9ucrhsX)mNJfoS5P1DvNN9KBEpZ0vkw7UFxws4c zmv`Wd?e73Gn=YzhABjORz>3?o!O!>_=&!h^CWp73dK|>)2b9yjmKs<5zLZajTtuxo zk$FO=r#)dEaFIY|1@2^9*M60XL{dem#HX{J*6)iDtDL;}gRSsXH;VJ-D@?#4QFMgwy-L z`Pz-s`=>m}dhKB=m}zfX#?%Etxzf@G@$}6wZ!hafnIvddv9+*a=?MsuToI^xxL-gC zL^@!YVWOQJ}PIfJptrb*@Y#o$* zd4(Dbj|ny)3WPRy=g1)nY#wA3-5s^l{BY~#<1?w+@1|s=M8*501oQvKggd^ql50WX zkcM;$qWyb;keuu_2Xb9cdoNggd(aTTFC;U0IL$WyAY1&&NUh%CbOB|)?qTyyc#`Px z23=0~-&*(OOgy({LtQb?^)?x3+KbSL2#@{%@zq)vX*Fj9ZeJQQgmngMb6qduTXkUq zR~d^p6eH;(Iyr|!&TBo08$v>ZnW=yt&DHFD&LM*&RFNEHrxZdDO2F!)D*-Tf45Vuf z4sNJ7aQOk<*!Y`pbL)W(s$;Dv?(Hjd#Pfwp2W)RT_*P%Ce7N3YX+>pt*a_YtYAV0i zxZ(*J?b6+&1dm%@X9DM7MM*`NGG%HgINQh)LMyA%aXEvw+cM|+NMW8eU%lL_8}=J6 zs8?i)E4C$5Wp|(#^3^(?2cqNw>y_UcN-NflF-Bg~jVtm|)yr0LxE(%bbCa%nr)8uz z)|Q%z^D=#cTJ(E#g^zyZr+oz$1<%!3xNIk5mOXe$DX_yKA@;YPn%SXur4 zS-lme8Xx7*yPOC0V+H>C&NltUC`5+S*JFZT>@G=m1?|VVRCwFb82lDMJPaAmVZBiO0qMIttjv!8JfhtFy?A#GcsGL=S0@V(K z6T;@^M{ga`W3zZP8{u@%Y5@=xK@93e7TeU~Fe@51pjC z%F~X)?@f2lB{g!gc!8kdpXGa{tA%VYNMg*Df;D)WpfyF4D^d|(LB*?oa+ObB>$_%Q zzgSK!J+1o=_id{IuTvaBEIg-|YPqIJI z6;$gpI2fiaT~rIx;baW3FV`I5iL};_nzi}UXR!3+N{S*0DGrDpldY(f&3k|;^Oe7~ z;IOJI3i)FD?8z6vWQfeh8?Xu55w)rMMT~kiGB0G%w86JZCM`RS_y-{kar`KDU;tS{4>xSAgFybHgp0j*L5CuG)*3Sq_sCwH$l-40ZTSr5UUb!}FXRxh_FJA`xz`0d^Dh*t`_ zv*pz7!*SDZp~_&j6YlGEMO~fOqd*6JqjX9!d@?$8c;acYR!!0%hN1>>Ah0<*^owdU z4=olNs$&KN+Px;oguJX4Uk}b1dDRW8CmmC!1_{mrCFi*Lme3-;T#rB-T%}T%pPoh> z_&Q%90h@GDSscxo+$)GenIf|{13CXIV|h&_MTD`J%LFqSy}J9EglByOUAiM&AJ%zN zg7*7HYpLfo6aT_EErb?SHeAcu5X;zcQtM_Z_|po~u_a)AFrsY|$O!KIBxIdL!v$p< zSRDYG>K9l2jymNYG1VMR_mQ_L-1n>*4zI6_qoU6+f$hXBBbfMxF|u!^Do1k9&=*jW zM@MdxB3%RLhx0-~AC4uYH>%((g>62a!q;%uncH^xv3hEebM20O+|%)k_*$^r>@vJTQRucA;@ij(gX zkcGd0u^y?B=PI;!B9X{t-W|=R+QIo-Ogj4BvU|%Zs-tV6rhURV`=rr;R_RZ5;Fh+f zTt&r0-V!Ek5&tPU)updJv&!E`$5~AJ57`HBK7M;7m2C#gC^|XG|Kt`;rwjsGB!mET z-l|{6FS6FeS0-Hp+PKM2^sz(ee#q{PENt?T+EO^sL{@Gw6W00db+4^Bb(@BRzVG&* z3a&R*+&Mk`ye~^Rm}J)a+Zti=y3x^@p)U3-sH(>x3B;evGkZG?Ig7bQ`4WVTz~P#9 zc*WD|lB|M)?RXZuMd`PmM) zwdRCChlqSd(1if#gLP@W7vq0wOQQ`J5Z@Qfr7~Q8t_C(i^kSEmOZ~!nBpmKQeqq`p z*P!4gg~lV6e%?GpAL=}BWq`LGL-{-S&D03Q-FhX87EH1~cOoz0zh??7E(YA!KQ0UV zs*bJ+4Ex(}tm*G;Fog=JJXCsEs^N&6V>Dn|I+h3!_QOZG_!ZNIQ$g(oTyr+kW5*a6 zLVMwce-HYirqH*({g?I;N-P=q#`1W!?8d8t+gO|a+fU>jZg088c-%wW2DP0SVJvX> zyOuUFo$4xensSrU(6eoak&DYN5ETUi&p^0q z(6b7d1DR0lr^&!Cf07;r>#%31Vr^C^AMC85Oo|B5rqMNVg7XzE3Shmw40$_d&nSdh zvW*K2j-r~+Fw0t#^dv0Z)+L`TJ-*Gl$zsKJd#dsNVY-OgpCswSML+6W*-pI_{8?#6 z4KFwBEtJzCnN}eE-gkys-v!fsI+Jl1ndWJG)JmN(BPl!}ih~L)yEC@)l?``KZ}l5X zDn?m}{WX;ZjfD3nJHW$$^R>3wKtO+7C2_@C>CmUXK#he?d6{0X^yx>^yAQGGC%Ga` zAXM$EoLh>sS4skb1GYJbLk|(6{uCp&X=!-{S1yhwA)Je(RTP2hzfMoSn;ou3v9{f- zpl;LQ?W2*MV2Yx z1NP+9T9x@l{l$9A=F13Gbt&mfMXo#LU9%5X4}5YCUyW(%Z1zWriSD3&3)E2DtZ?%R zgvXrNi9GViHsUSdOD2WJp><=M&hLIW=P-qJwOgM5940;3jzD*!STE}t=c$%yBKI4b z3e!@}PlTJA5`iYmzf}Apr{k4Bqd5U!yG(i8#?QSf$%f)PjnNrtft4+re@7=wY_;!oav^>$dKp$(Wob)km>RFIwbS7_jNruuj0Y1l0r(i>ojYwL1B&JHJ?Fk@Fd1Eenm+6d@yGav zSb3{SuAAkQ>0?y>JNK!X-ewPjB#t*>nFhy}ziNkPm~jguT(VQtg6dB0RUW!7g!hb* zZ+u1e7b&nR84>t_SGktUqCk(EdUT*Y=xK`s@L%_KHbuF7r38ah&}_r;9jax&hIg2~ z?HI_VTr%ESrtK^(RnS`aR8qmyqZ4W)f#B=ICb;kU5Q~Yf$|7;-X}0LiAnn3a54H%5 z@j0s#h==$pR(?GFb~?pgkgn)?2WlDRe<7Dp?4jkLf9d_NB0$j7jjEm`A2IkPZDths zxz8l1?|V0BNi^|4-jqfPF|d6(@!!Y(lfI8UfghNG)7T-FDr<99C{C>^ED! z6B-?LvUwrZwne>gOwxcD@d4>3P2IND9dpGu-%4Q?Q1-zogcl@+b)vPdmKiI% zc^l1MR{hLqTbF{}b}}MJzpfZvX=4Rb39Pt#%|E}mD@z~MJE4M(FNC+*KkxYoKryj* zR@#5PNU?#EGtx6xc}#X)0~isFa3;A#aE*LKrvl7`CsXSwl{1ug0_(;037KZpcXUKM zUr$evqb-DPi0I}hmMbD9;0-dBJT(>7wo?5=QCa?pnYI>t7k;s8Nip0gR+e^03A*FjeNQrx%bpbHl?ws2# zWfy$TY(f{^pAb&^*vR3mw*>*qCkHN`yx(CfS0T|I9+TQ8A&oGv3Xo-=KF^mngK>vp zq2pNv*tDLMH_`rJ?yx)kd6uZf>$ycrlN3mg+DE^PHT}Ha+tEDgMR=fIQI;SjChEEE zBSi95f+>pyvK4YyX8WdTez~vXN?$G6JoAZT#RVoQ_l8!AVy*H~P)N>J_dg`DYHlg- z9mZ$BY!Y=Eei#8BXg&KbUk>i_$yq+0IEWL_IT0NplvA9>I>dY}2(kA25*+3c?PA^Z zGkL(IB?IQ@{zWAq>HtU+{3!ly=!>p^yIcjBJe~96sr7$5%E2l1Q0hU_U}NssD1F$w zRS$ErN+UmEuuX_WunD?kGoISdcxr+FQZ|~BBJB?W@+hLpaw%k^z1)F+MvMQr@fa3R96&^F`p(mI(^>xdbhW-iy4smsgg*6Y@=2+}XdECc;h8ess>kXKp<^B8>Py9U5m`GF} zZ_tTY-)`ImVZwRW@8{mzvT2@a5f|7Gd~tp`j>%De0>GMYfD>=Hpj|pO-?<02qUTAm zEgx^@R7~~#G)J{GF~aB5SG-K3@pE=3B70L!JM%ePnG#n+4R8N19e7X)n==$5n_oQ| z?nK%;$}$yS=tknl`!uZ-3_N_Eta~rBpMKJdDSXCL>m)MzW3rVf)?kBcZyBzlQ8K~A zroO)iJZ-VHJSky>AP&sB5w>~DH)3U+U!$G*J#FUP<{v+|Sz9yft+8}b5dSyj=e2kK z^XzLZ*E5g3Mk}_RN4+9wUT$3@(+d*+XI#?cDB-h*NsV0z6B9C1RnCc=l4z$`Eor6N z%mW#fFJ|izSWT78A3x^2{^@j|l8LQudMjVZ0QokxEc6Y}Kb<#?_*9u!E=xbtpCdjGn?Q8@ zjIJR}ghYkJKJRyr8yPqKros$#Gg5i?O^LlzJ-1oD_T`r!-+=3{yFDp72>hhQbER%@ zT?1~{h#ux1pK5#_vdd{e{Uc~m)S%ns*fZY-**>VV)pCp!%h`e?EB~~m<8q+icLD5k z=~~FK8&;OV{`rGDc>$nE!7oX56L8k!nioad`dPft7?7K_UP6q46(vu$Tb zEsXADegr+Ba1hbQf)tiunQc23^6X9kPOkhOo7EIf$!zAA08vZ%YJHfmZJEMQ);U- zwEmnB{v(FE?f0W|7foFcH!c$H)h4LUVH6<$Ed+wW;HA(Ap#LZ)N+BOwx6Mvy^eA)>8I;EU&GQ!k@r+%mX{ids; z*m;q)mf|5T3g`Tu@9s>fSkX>}RP|xiPH3mXUnoy?p^ekB8`DU0j+?W4gRcBqL78J_ zu4dqdad3&Zg78-{QD-aY8^VS4YM`I`L2*$l2&{zyVT`Cf4^t^BGW|*e-$; za&!AHJLccP8O8p=YenmU*N#xr?Sp%?3!lanevZ8Kvl+QzvIAt#pgae=WQ_=yHDtH0 ztj4HJujYjHPoJ430Zq?7wU|xvNG89`d3ej@Vp7L5L~FEAaXsyI01$~!+qsh(B9)p` z8iQ^N4;Pe~Cy1_$d6VuBPShWo2CvsJ*O(Hvkj0G4+>A+1uaAZqFBJp3zc!I4w-j9; zmUbD!*4zzdJAhihg3_dfPAXMHPbF-77RLm{ShE(fC2b9wFz}?sP-3N0AMGqgr=(#8 zdZg{wMx6AyX^9M31U6Ao=|$ghif;LX)Z5N#%i zAPcyKlT_K7m2*;*WQrr=drVYi_aII}EMKu5TSp1A#&;ZiFXUQDnm!{G0aa z7JHyV_f&`Ss6xQev!pyX<5fB^PeFx0K$AW$t^Y5@m5K=a%-Kewhgf`Oc77T>pYU3* z_|*l2zAJ@@Xm_vxo7LYa(}6dq<-f}GF2{v+SDC;QQg@(Q?IPUz7aDGXwTIGUxGyUk z-;{6VycWj4RLJM4%{Ft2A}@1=yFH3xJuT!9&2&gPrb%#a9^*Gn%k2vF`B!3~3Ft2$ zzwqIlsB<7w_g5}IV^#{+^`d7SYyqY9L3O4%;yd=Nqd&InP`Jk#n)@tZgfd>)J)2HX zIFfe3f)RwR2btI{M|Yl$flHTn(7Lp(A6AuEdaU4OS{b6MMxsgZ`1Ytx`jV@Ag zgH!122CrzdVwclxc?u6+$zGXf46)K`Gv)P30qfVLM9$pw$dI*mPh7hk0D2mn?+oa; zd6%*XNzXCZtHe>lXU$xa#+W5WV;w@ahSYWEs~y)q*KP54&52_=u(^-=TJFw{GYA#l zE{i`QwISLuy~#Yj(i3n4n-5mkF1&lHbUGZJk6#&>Z9<1AW3aPV7YxI3|3K0ysajv8 zkTQ1i0jfXUBuwEVc53_p-P~NG!Is-!Mr`=(X4yY0hp54E-OgVVjlQ8@e+9Dc@Yvy- z*hW)(gU3Kx_-y7;N{FNE-aG4!&w?K>eZ%?H<%=JG?R3^@eaOqJ=9D%4c0sV*`;D-H zs7K#R?37(?!S{^0t|NWi6Th+1$DlW&p35%_0_VQ}_CLtT5^bA(0IaK4guah!7MtTS zn{Hx!w5vk7n9pcs6}^kLAia8-UOYcBT4ratPizV;8abP*=>hhf`EN>0KvS@cos(*Y zU2|eXF2V76s@xM5{)BI#M-yc!_~>P~Al=wHxupLbOrlFBO`YqeUiVVjnt0?ayll+W zYyG5h738E+BDP*v4m7q#;0iRWE~QG{n)GNgkJ%R|Uv@ndJkWRob$q(^&Q04#wO?1E z%k9BMib<2s)>UDkgTM#jJ#oQWwf>QmFe*bw;Mx=lo&Whv4$t_uK^-@LPE=O0(PR7-)>l5afE;V6_WtWdD+$ftW>urj{K8XHYFK|kd>cj^)IR<7HLQ?|r zUpc%Nc$K$zvNk*HLHoR5a((?}9C~Q`_Kc>M#qbLar*HGsl_YZvxX&&zpnRR~J1vUR zg{L!o(6@yS4P172_N>OKJOaihq)o3O^JrKa8Cd`O7B3*0houhMj*Mi$PWYX(B)`Oc zOPWRC?mOboIOq>q3NRV!yIV)jKK#Q|~t$wWNin*0=Gw9_e|` z6fTl!!vf^X_oxa~bMt<=;x>x^WSy0i89B&WOWd0b_?vVZ6~lk=k>PwgXJkVHo@F!( zMygMGk^=e2Q_Z=_qPmw#75>j0qVPYIJTDD{l*NWR?uQILSbaHt-#OaR;g}VaEd5f@ zZ^-SMnGHEDhwzhxvt~F8X#EN-fBwufq~jEjqp9q)Xq~bu|!8j7=vL`mRsDnS{g~ zQ03pQJs`s`N%(M4gw;{e9_N#S<#*3HCAv=(f__@!LPEmD~Dty0+t!{Jh8Z-IDIJ-HN zaHFR^GcGuVjJsKx;+=yVovi!xtSe;@BbeYwd{a`uOtvC`=SbH(3c9V~N4 z0e|H)H&gTR`}9=4#&hco^d8kSW;F>=sziX;+7ra7mHrnNAoGljiD~4en9T~!~#(CS<2a;7uE>Auw+5cnTjH*vd=b&KsK)EaxhqMMQ|B#H{ z)BpDk@dc0G8ORxzDld={Ki#iIO!*=yd< zt=F?xUwyaQBDo;W4Xyh5&&lOFQ(Q!{(a93O*wyCRZc-EwYx1yZOHVjjQC&Hx#b+tANj}CNF->deEzMsJeuzcN&zjKHRLg*{V_hD^(1mygc^$l~PbOITH$O!=X-G13Wp=cw<>;caREVuh?=m(Qvc1Isbf z^IC|N4}U?RO{-!P4mM*?*p%lxt}yImJnqb?Dbbo;E9^Dq4x76+OTV>i?l+@Y7IecujY~Rnbdl_N>t)`o16VQ~JVp>aWR~!2n}0 zEAEUW`MmsZM5~tVB1IZ^3;!-G(b6sEqPvB|Bxr|^&nAdWyHa$ZE(!Hc@|UD3Q?9Lv zYwRg2t+=(Y2FJK`APXJNU`dGbz>Sx~yaq87p)Ti9w;an>JZaZ<>SUlLAHb-+_HO8i z;aOfgrt?wYS``AgMdCV)f!tfd6#*EJ#qL4xBxU0{3Pp2K(xHiykA=3aKieJmdO3;i z=4;_{4SQ>Mw1|nRg7yjnu4!P)jb19h1t!tm_Nc&>XX2g!2Sy^zKK&vmKzB;jr6v2V zUJw-wUT1UY{X{v3+C;Nh=|>7eXig_99qn4H4KkQnn(0}Txvyx4Uy5z4P48uOd)~Kv zyz(*ylPx#&shnO5mW?`(q|il>Ee<<7kMXy6=pyhSEr|ly{0W0QN)rtu0Fn93=xsW zaW7iAU#_!f4d-P?l&@n@*Zhcy!&8abHs@D|-ybmAie``yf2Yt_i8mBGl=F+y6HHE^!N!eX3KgNb^i?=$j z?+HBt#*)$g^ownqq*|+~5R~Pe;=s%otj7}RBKj$H#kP6VyY+r^B}eVlS%}k^b`re~ zH^l84R;9SQZ}neNL#=${1xuQ4TB~q>%+~$Bedvi6U~8!OG#u8+TUr+|W9>}1GbKq1 z|9iiF)>}BU)v!Ml z<9z#v<#O+qelsOExz2i8n|B*(fb{FCb{_4vzKBAO(RF#n*k02xNirMyDGD9WaW%7a zNh=-SkZ}oib!@mg*plrDq<*~xx0@D_SxQ%;*F6)`6-24B%&oe!?KM@Vfu9m@qF~B_`f6_Z3OQxu3qWXDi6+riYi( zRUt$1!Oi;TUdSevFuNz`&~yOcu&L+Q#Q}WjvGj|Pa1$A4g5r_PV1!@a(%7&%TZ+s> z3o(4vl}JLxn;;@bSjAK>1#DF2lP8c@d$eb4h7<9G9#z)SWHay4*f$X3>W=(#otDZ6 zJpM%n!3{9fS$k3<3lELlPNgVNjY!d5{yzQFP`RWU?dji1G!_|EE7EGw%l=Fi+P8T# z6kF<25;lL=M?Mg>c{T6h%v7J|Ya0;GIu0%j`eNF;i~@hTmsoc@Jn^4NGZ}yqiD&Q# zmf)XN8>SCUy)KrwNKt5Ui@FJm#mdj5-wuqj2-Kc+*Nc^gv*f*10ka>yH&>TR2UpZ7 zd{-Z35y3^bI#(!4cbW`aZkMT*&B4{309dfu8~`h=du}E8Ks$`y$vun{);Om+vvXWF znKlq{Uf-4yeaGC=u={?x3?NR&o>me7<`{U0i3R_=?`fZ~(-s(mWip)oJsiKf_Rq7$ zC$8?JgUNi5{xP?|mqp?GBP*Ua77nzN@L|#2LfyL-=C=`34?J{vE^20d5=AFZ(hF=I zP23{crV_cgwQ{x7nd_9u=(wLDCVhAp)P}7{ZEENidsn#F>WcU;KLh{tMoLOK+cPYh zAHa9>YZlJiwdUYD0VRS@4pPqY$xb?J9(q_gB<~;9oY5JUTs-mFs2_G#x}-gj%;(!L z_+cn?y2S*|*(R9!wgcRc15hfFFLKCD8`lgMSK{Bb zL?(3l=+_E&IhZ**sCV3yRZ&^|Oh{QQT5-u6U@F>U^z>b=V`*tCJ$t3_tQk9e=-;YT zBAxY2S%H6N*1?2FWY6a&%3NqTX?9Uhb5SWzHsZq7WCj4`mx}S1UWXiAnKTb@RP@%c!=dx^S;Ji&S-h*DSoz+0R>>C zTn0zKz%OX983bJO01Cnc5{1nc z?HMt4rVjS3hgvhA8Axa@jGIlDw!KS1)uAMAKCK60GNYcs2t1cQzyF?B)^Q%JbUx4# zJ^V2xphYDBcXu{G1?%4OmGQje8;aGL8v4PF3KqglM=MU+frY*P?t!6xoALvW&IU?p zsS;1^GCwls;*}}t(F)gWSgU)C%J&bq-CD8}{ArY~v;&-;iMM77T+b*14wC7UNua8= z@B#+QM#j*h4SLBAdO5DqPowUUd&rv4&K%qXR|?A}IT>MQHFC!7s$r6a($5IaWM`y@ zlzH{{N86<8Wsh2BGtNTsA5)pgy~ZLbcrH4^D^%XRjF9AZ*ZG?ai57m>B}djb_26Un zYP;pVqOcxi#ggm)-ZT8PWYY}=)u$dUM1tY=1lUhzvRNcIsGZAU3d5s zjJSUVP~OTMT5ryp@IQ3Wzu2icuo;&g*XZ)99~af-a@RzvycXYn$h0#bE*QY*s^y%@ zl7(y`bG)%f;%6sDZb-a3>j#H-!Q`u#(a1+<)l48yLz~uK>>rO?b!l`#-aqE`uKDL0 zyuP)wQQbOsK&@iV8jfoxZX22jLu=jRcIeOThJr7=)`ual6+ZI3rvha#?ofE~_(k<` zuYKaBpPc!+-1cO57o7%ibY??z|Vq zYFe`MTlZn&Y?#WFa0eB#E-Fp`uq+;}wZG}r!>`C7iz!o96w>ojq;r`Cmcg zBS@gV{;M5H8`D)x#K78@=g`M>j&Y9)Tz+H;+61LT^N_8&E|!&_Swekz{5Cufgi{0& z3Em=1I}@9jA9dQ(T_-a-jceNg_EwO98*rK77*O>*YY@MzxDmmDXrr%pZH-pHFznH& zWqRIMR_cSW9wTXsysdN?^Q`6@oea>bLGwh^ z^S0a#r2VF!jJ`S0>2&$aRWGRhlS(4b+OeooPn==KgzTDV3Fb895R5I|B+;P5FPJ`C z9HsIQS15$UK_`F`OYWMBx05Q2#cde&`949@o$O70(0XZoG=Mw(+wvy8Wsn6Yxp&Nf zx|;M1S?Hf<@)(1R$9<|lZO0;l++^ga-NJiWQ7i4FnhOuEuZMYQzT{>OjCZXSjdIO* zE@cbkT39`VVgkOEg^p@jZ{PUj-g-2y+d;^qOx{bCF8`CXTa0)GpWW{zW!wF+pDPIE z%s&l42}!ke0TX^%RB0cRJV;^>E)$SX+g*6)&Nb6&vzOo1q#Q2ZwC*t9Tg&fTWZ-KVtk$ z^>++jGfmng439=P)sX1@jXXV_R~*Slw!5xpyK_r(V`%PA46=DDb;YC;Y5J$ zBZx`c6QPUbp}rDP=+I4lkAwhasd<(6(aBtLUItX;3tt9 zD;2blrQBl3Nm~<#k)qqjlc1-O>Z`^VcJwX_VDjWMuLP#oYf*By5J~Z4)m%lV0pH1< zJ7hpMxz$H(Vg+ZTNJ;C0zG43IH7u!OGXJ$70wEzLXj$7Xf+STp6b?1Cazh_0o-SW$ zZ?H|VYIV(3+)@_%KjzDR!PLU^ZrSsOGc%P=YaY(duy0@^`XKsjciRR%z(@vkn9MT#Qj z0v1nY3q+mqv^B=YP&13nL5xk^^dn$>N&X40t1M}U-~Q6LQSxh?(4%;$Z;IT`?ZJI* ziB9aNV{+z9)d zahLh6=XtZrzb5}qgyD4&K47_wn{9(^%TQ62>WY$s0$MW7>&KL=we{nZV`t!Kr0{}2 zi5}af^gcf%=S*=yquLl2+Z%;%@ndaTDq6Xed*1s~4db=d9u(ND?>setJAcypcBym9 zC0sj7>XZKfu<+WIbyKVI(Dz>Ff@msJ9emxAEUt!iV4l<`wkOaQ)tIKYVvTuE;99;(F{4XFZZ5zD4#V!O%B}{#3I8%gZNY#yC7>=Om0a?iELjH)|UjRGYak745E(2o$ z=YcTN~O&68NufZi4xz@YG z*n;_z)k!beds{8Nf^kbERYY$tAI3K1e&dh}KZ!QdMJ4Q-(tc202Pl$gasKP>DiM3> zlNab}cUeXzZE^Sve1lk2-0%_ShD<7HcTqM zw{rE6WAZG3>_qt$hgrOb=DEii8j8sZ7Wo0b$)WGJNf4WmM4c=bGPo^nUJ{-SV)J7; zSx5We9-b$9A3C}KbIV-ii*qOnnsd!~Sq=NvlyuII=%iTW;9UHF+B(mmCbzb2i>Pcx zjfylWL8|W11nH2dh-_p_5$O<1psFa9^AP}Oo00L2}^iC*JLrs9t z5>hB1&ol4L_x^bQ-7{-uU2FZgXV$sSYn{hX(9OkwYN~mmHCfFKcvCAP&j4a7Hh3XV z&RhUi84fj1&+Qpd?dJp>1{{;JS(+V_@1TX5JGH_e zeiL&=6$L%1g!)lY_$3#dSa244*U@Gkl-=WN`u0K_`&@_IjYhZRHn7J(nJ+*2l7-`pN18` z4|5DdOb3Z6+V?<1cM*QsGP*4<<33P!|4u~<${$_fnPaQUtyv$%-E*EZJgvl{Ix45L zrYW@ozN1bziQ=IXe#bZLuM6kaQRwGb%%8F731`CCpr`<>0 zYr7#n)0667eKQs2$L%#@cZ|lYRkkz~iN|{_R}8;>n-Wkg=pK{IH4Sz2Ytu~5G}@U^ z81m&??bj;*iPo(FCA}I9DdanP$y58_|5OM#eI7>ykLE2ZO{=T&s)(e0n&!onS2L`e z)Q|lV*nDVw`5oT*2hi7@;~xrseewLoCZ$Z@p=@^xj;1E=oqAMyZ+*t&36$7lap7L^ zd|Ph+zlD-M?iQ$r1D-pB9?< zr9MQ9)_M!gb_D{Y9`_%y{{Sgc`BbjKu-da4!7Vyk>I)?R`|{}@*G_7{NeWU>Ep3D7;dApEZ)>RSoOn!x-XE-?U0pjM6Z zE|}(Xn!(>=QzXxEUdHr`_c~Re=HJpq_yV`XxU8zi>4O1)Ac_%Ln)d}s6 zdbl0x+6J_nDS*NJ1hS%J53r$oU#P2jZl?b_t3Kr2sU@){DCVWsr@qEYklkITV1{TN z{09{RoILd5EVA`^dqwY$QU5@{36O&oKkSQA)L@T{e!HzN-$d}UC)J_{D!3&(Y}`yG zP$Kk|(P%MdxU@&c>)2bgEaRArO(^lUL`P!)4rrMz&A6A@uJ;e&_1KTGJK8x#0(BR6 zDnQTpCe$Raf&V7Ww$)4#9?ashA}1_G2C)y`L5>Po5en#@!vopyruJL6zVZ=6RoT8l z{57TO893CTkU_69)5St7l7Z@pLcR6mNO<|2moT-IO3_mP)170!g$*YrSL9eW4VKVn zfs5xO@X5H%!N<5h#_gzN1vXE>UUgXJR<`Ta+xwdk{{6N(qXuPeJZqWXMR@1-(ST@v zt6@|t$A8)bCN<>W6@|XUQ(e-za~$LM6|h}Tv%2&wTa6T6eYd#1L}K9n?bLVK>T#G? z0gAp4St+fIz3Y z%L&m)s^~XT+idOBKTtrA%e-)7CJQL{$P5*>HQmtZz()K1U$!F$7rI=2QE8my^R44jlr& z`(I%*n*Rx#G3HG{tIGiP;QvXQ$?Poj9kFg|!QXzA7e63asBpvNgzVCYS$)P|H$Fsw zPkrr@Idb>N#m^_KMlJhF6fR2D>A}yXHXtyCu*C&MyLOvlzSs)W~BocRAW< zUZ+K3gphXMn1U~bd7E%JKfsu(x^fb$esiH42iyM+Otb&Ua(`|JLDv=En_HA9oWI56gt$uxz;6>vu3OmWloEfm+iWgHA){xkMMc*w|z^3t~# zsEPF`XVP9jQUa3vndMCr)?pKdXeNC_?e!(Lt`QI_1(P3v9XKkaLn;-Pvm3nL)zJypzpE-#tT6cardR@av+8`187oN+bHaqT$q)ccT1$f zI6Fw(=Ew_@$jff9V0WwGgrmnV?B(IdN`2v{o%*Jo!?I?BAbl4nS~h=I$&wrsNUarT z*mxGc#NJ(!V0i%8QR~aLeX-YWLbM)d3a>Kw}U;E@<~FSM?uZi;HJh{uP-zxmGq< zQ~ijn)8vk|KW^WW)LTpa8bp3H!09edqFdNWV3PY3mi!kJE#g|yF-e+0=otA%E)^k2XX z_E6PA!^sT9P^W^4ZVTbcSkin5lb72I@_(|S(6Dee&+zB46v)%Wz}JZSwN&r+x>okG z8PD7z(w*D*82;^3VOF8{b<$8(muR=pqL%$9fk#}!zUNGx)q7b2VQXKr78IYAg}UP# zN`JbYovaqhYAwt<+_EUB(iEhNgu4PxiRE=AV3=3R|n@DJptXr^P}I zV@#Q*Umzb_^aYjVXROvdY+k+iA>Do7NauIT5f?+Wze%Qep$CMfE7j**j1XT;;9Hv- zNU<4c%4>F-N>QfnV{3Spv;PM}!-Y90`0h(ZGApti4~C-*Cbb#k((Vs4Ys}zMnE!jnNsr+t^_5q);b7 zwrr0p}Vn`T7TdZ_UG&A%NuH;$`~J(EyO_rIrBH7DmAxc!$kLO zMMl(+&fNNQ8GJru0`Q=NVdh`L@q>T%=EAIYynQ^FU(NXm)$fnE-qq(xh99>;ofyI7 z700qf#cSPRaO#JwDSk+tOH*6K)TfEjK3ivg6)-#dn(%co2}?+*AV#VGL5X&9BzEOv zsc1|E1p!fBtJ3KnP#^fN#Qqs;Q%5=p4yx0(9Z+A>sMSvZ1mO>KV&3B-blY?(ai+TZ zh2br@iOO53xWIDQjE}s4oMi#+Gu*1`4- zV86kApIpEkx6W(-adY!z)^w0NOD;=q=49YexVwsEB~#oV=O=-#n>uB>1H*GVCR5BV zn~;+?K1tq?I7D(c5)MkUu5E~LIW~Fnk(RDQYX75OpdU|LZhu#f!NuvyZs@Kt*BGf4 z07cPfksn1L+D_>H1+f=k3lH)})ScTs&64z6VFByZ$+c>F*CF!RuoW5AXx=vpl4!qm zof6y=51WuhGgr>ESPC7veuSOM8Y?uvDcaEHM!FOhuged=cZN32Q@-|)wp~h2@YizS zE2Bon`&SpVdNrJB(S70Vu=Ah-%-*wML>s04HdjI#ZC!@w+rh~Yx|f?6$bs?emgMg? zK$mw?x68t%#)}z*`)u|VNb}B_Fn8MAmNkim%HghVeo#JTbeD6Z$G3z7Wy(EkQAgd+ zwf0J64?DT;kpwHpv3JWB%$!{CW8RM{ANr{lst6eitRS8SNJ6+CmqRMYT;8ptvbMJEMIF6>0dXV>sUB>J z`)nm~wShe4Q}O@;y0u>`cu{B4h!GbkN0nFZ#0YavPhp)*oi;8cg|FAhp@s3)41{rH zbhvZ-w*T+P5!g+KU`Kn~%Eb;#m(x#5Yt-qCVnanz&vz$pQgXll-J@Ee5xoHNyyWwm zU}qcZzwlmt@|=|Y4gDR5`R%SPW5VuTo6lKx8S7u(7@p>ms^Kx48-kvo1lfjD8WiKFiGUrp;`E zHep03*vpU41D429LpgBbf!$XZhM;qWx$(ZjJZrbY*{-a$wBiRwK_um!%Apdnec&~T zGwh|Dz1-Zo8w9Hxhqjn1O_(p?>(6uyzh6&#^qG~ID_@*6_>Zq7D;sqz=E)|aY}f~d?ILrzk6TYYdN^s^82 zFN_HA_HjQJ^oU$V_B-MMHBF}=>#*ijrZBG$t!2{D1% zam1mi1w1hGq;Qk3h#ENiz(|H7HAc^@S)^xg(z-`Kem07!I zF@KnaT%LJ+j1q>(FNHEE>dx=%5t+6ceO>k^V;0JZbosxBh|wCucu)I-Xl(k0B_%7ASvtz*1x1ge&{`zIS^J=8E3BN6vD<|(2 zP&Vj&YUxUrfPzX6&iCKosS{IHU92<|DH8n;E07! z3GU=n-~8k|kPtX-53JoAXqwhCW&`b&P$jTQ^N*jTGoZv{uefbV=6-}J^R_h=8s91( zjLq$PPVJa+-1<7>51zAMf8%)k1)X~H^2dMsxjxwnVp1pf*)VdFeha7TAupAXu8) z8!FT$zY=}qyZUhM&j7Y3wWiC`7qRR3#>|=A3tAoozhjHwyMkI*%ijpCZ;v8dsTpVj zdiURPi4}Uwf_T`u4Z*MznfYY!ncc&gEz`+@lzYW@)(>qW7b(%}>DpPf*P6+yF4l;i zj(mEE%AFXT;N&;ep?i4)0Dgwxo!$J^n}GM&9{N>_xHfS17DIpIa|m;K+s0sGWYPpG z4S%#bQRJz~WiqqNIGxT6$%4H%Pk4)`i)B7Y)W*G*L`}5I)LT7qntH#+Yh2gWHe;Sk zPr}@QY%jsSsk+oFEM3cvQ23R^x^2zJ)LD#t7h>!A76(JA6)X@=nF^7X%s-d1v+D^%yyC}~z1wIve}@{T zjd`+l;nv_A@k9W>&?*kOPaq@X*mfs^wu%(_mr|yo|*uvXd=eam9P7(%& zt#MBJN6e?Aly^Tt34A6iy}GiJC2oRz(4d^{TUHu4#Dbn2OadNol32RFB}>u@h?f zfVI4lc15Y~n9}6+1{YJvL#z5%i+zf~Ps;}$hI{w_HOw3e&@4T4fn2Y>@GmCHjORIV zia6*^FD(J-d@MNZ9I+?w_g5udv-Sa-^3iuUu>FByukRqe+Wrw%!`%OITxRQ0&8;)9oW{L@ z_KkCM&Wb6Q(~F7-e3a4Yj*1&&7XJF>x?hOOKRzYY=glGCUgC4?U4EOL;G;4=^eIXW z7`^l$WmOY&Y@}7MW!Fw(((S?SP+_a8)8%$Den-Oh)NNLqqO$RaUIl#d18Kmnvcdx$ zW9~R~-{&s9@^e=U>Xoa5>pRWbvl2sk%Vt-g^j!avpl-IN9yke@x)yMpk#u>N-xic~8dz%3x zwYDxPQGv0_OCMKm{TYtsZRA@{A6C=&aAx$ftK18hcKk(Lzu)kfvZtGphZM8|c$5(x zrIz9PAfqm|ou67>+fhh}3p`wQrC-i4^NZ@SzY{^n`)`&6;|P%$gN6Yop$%ET5%dwn zzeCy{So7?gPEDF^!yQO|r{Fh$Bq4_vNZfd4Zy-Tis02B3>3&E11!c6RRgItW(!kx< zUv;DV^f3mb;zf$lLXyQqCB=>TMtfRKMb`@u49-uuJ>{{3ZU+C9ks{r~;Dx(AwD+xv z?LW1)Missh-F>C5)K!%|H2y^#9%GJ@ewhv{elx%MBhq_%9X~2o%LLS0cBc^HsKP^j zOV=&IHxv#p)I3JZo`8f?WVKZ`hJKX?f97`xgEr{JhZ{!4ke~Oa`5BcqWD`51uSA5e z==EHKufXG$ARoS1_-7^NeR=7Pq=d(F*OY3jJ>nPe)k^IGz3|R=yrcK#MP-t|A=HP8 zLgMY0yCMOSjZ1tt9e`Ia;YT$ejyd~4Eaavfxl;4Jc2OSsCs8MTy$brrMQMHvhb&JI z8`HIuw>^EZ5jb1OS#cSOzsg>0)nrFh5G5|dwO0EblCEI`yvSOzt1Z>1vt%gO)uHDz z)hkTxBp^$pwpZ9&?oLtJNa0tun1^%?NugqmEmd+;9;18(DAfC7zDn_ApL2M6pX!Ob zniQUZib;LRn#oW8zwzKWTMuT@V;&N#0s~lk}I@{36W>P&O3P%lK42kCfhR9VPyo` zgBoY2VxeULsFYDJ(TiG~Oic&#>&k?;Cr-3HPnU+q?i|+VeY!f~tz3DmArFC}*QQP6 zR^_}$k09ZVh|nJG`Sv!nw4AHYYyfbz@gd;Z~tLOaHp#~ctlsm~)Tv@3W zlOb#f}sfQg5y%kI%qLa_0WG<4iK6`=caGdotadPo#ywTszJ=-T+H)F%RPl+ zi-4LLn(4Z#DdwPZ?94a*9z_0a8VanbC$_Fu(jm3Nz)=XT^TvDyA{#PGo zL(L#>CT>pE4Cg#dxCFw5ZRc?!q z6`m}ct*(|Ph{+1X@Jtwmtq;4;^;fS}Nc)Ov>g+dOoH74`B?cJ2QjqRAeTHE~EkS6c{V=?R{$2~sn%M4!**BwZ zwzM)iPPd#XeByt2ph+n8njq7Go1{o04*0-2K!l2TZg0D@RQ&xw zTv8u?r{5T}`Urt+a_mLACQ>> zID*iw&poZulC`gZP0O>yjo)jn-Zsp^sOPn0!WHlhhu8e<^YDqn?{S!ioG=HdTCu`+ zWarM45tNyOnsQ2YJW`RVkX=}LmF9m1yu~?f;8a>vMGGzC|3Y+hcUzL=^A;oVV8rIg zJ(*vDnLlZ&%|=eJM(w7d%G&`jXi(SDg?1Xk1W$Wa!~`I>z{|TLiH_f7i7gw8@^9#` zw%v<1CaPtIOr7{fy%cn+p*gUZyH5)13`0eOxBn)oNbiUrPpkGKoYqGsO8cV=kqX7e zY5TWmy~9KSgbFAqIC%byf68#ubQH&Tx1pNamJr|2awJrzX2kEuhIHaIqc&%9g5pw0^l zT`Z`Hd7P)o-NTi+<>sz+^8OzBxv3f?cenQebC8fe#;)df^Dnlf*uaaNf`_C_WcTd; z>XP4Yj}(z*U#Oc$ao$!3Z(Z==4+1}SjB-E#=L4l1yv?#JhdYjRO>ywQLBDW~B{14% zp4m0RC*U&8sx4q*Vp0r^Ti!KZm&fo>6{rOc@LW};d7dHA&fCH3cvQiCVXrycLQHf~ zU1^CFXzhr0{lWdB#(9QBaF!5o92cZ=&=OK3zOGsKt%Go8SC6&4xX(21RO0UCvjN;% z>YEVv#7OgMZ77VHVmkIuYsS)_lVTCN$T;&prIAOJX6c`FzoWCTA{Q|>IR(1KJ~aQC6W;f0?88CGIbQGlL+4v)oA$C?JH4-- zPFVBXX~wOE9S@!=>58NT{wx&TYv0f!3*2q7AZ&4%j&*yBoAe86!w;gPLjf#36WuM6 zRDw=!;-B#=^jGZ4EH7EfpFyoM@>Uq7)8^YI)XGd+>$|L;20NTL!eIXEqsr*9Bx!iT zw5%pN9p7zo+q-YAh%BMD_qX2kTZICD-Yfj|k zsTBo%W3%x8>8}MfR5%lJKOYDv?^b%*s zp~h|Yii_@R70{O-70_Wv+xVf2V@37HE$)QUzgt5=N7rjASaQHn?<84YSY-e1@?>l9 zNfuMv)|A0&Vcn^H3Gj?3?;gT+?(F!$>%7su-&5x#mH=_a_*8c`E*DE^4b2D-AN)$1 zHbqjbXLD*fr``^Kt)*IY$P~NAV5b{5BWD;|b3xB#V*0O0_P~DX%VX!cfm5&@OGunp zjZ3`xcB0lg5L9X&P8po@)Ksn$-z3YH*Sv7tytfGYob|$^OtrfucD@}{f_WXfyLxG_ z4dsOoOA22YbFf#=sMCZlCqNppSThn7mN03;$28HcEl5Gpa}ru!M5=Q^b#m0x7#Zmf zkL{|+RREs|(09ziirc1__0^} zIWPXK82@?s1~KIFU5kY&&z!n2XW*!r*ow?dO;7h7@r1zsSa(y4WzZ2IVPjkrlt_=> z&Nkcj3XFH?{S$KR^cGTONX_VftX;sF=q$znq|5SP(S%!GDo82V@%g)&EjvuKmZjcTX=Bu;M={S@vIK zP2hhA{)?9%@uX1ca!F^h8BPM2L!rNQsJwNC~}#Bq9PLN=H;mL_|cI zh;))rqzgenI)oAk7)U}03F#A`-@N~MXa4V+cP49{tgLl&&pr3vbM|+i{nGN*O-;SI@-cusBfdB1TbhRy8#BN^l^mbSEbq}=(hWTFdd=TvBdC%MCo*(qo ziBqR8=>_~9-T&tB7O}s*idu}Q!>^*|Dr*1szGcgu>i^x4Ph&(Q+qw-PI{)bw!+%F6 z_B z2!!?XS%s=<{=Ody(GtIQYuoNwJ9!khSN-t5)O)Ef^GTM(wlLQXicyRx_fI-7~#bRlK zJbq@0DyP|+VE7%wA~OLzL&Nbn@ePRgDfZhmDBmdp$C-=H(| zAO$LzB;jZs-lyLFScMZfeQ3e&e28}>MG7TUz>)`1v!W-9HfN{a!8A`mki|mY>|mS@ zZMF1?4>pu8)-WG8>?-gOLV#bD;Q|aCyt>+e`?G4wYRo|nO(>!WoNajI1D~uAGL%a) z6f&)fQ7gfy>Qx|zP=hM2fi;%u33x}T1f*ZqQMrlwl~wPw*DS(FB$$i_!_TiDW$q&o zc#T5Y849(kaEUH%jjF*L^5dra67kt@`8&uF(ZN5FT{s5; z09H(};3hSeqIxGjtyS~qr^^J5HLB#sp!yK{Y&2p5$fN#d^;7ZT4K#!#e^CM@?47O# zhEIHj8BmLi#TPCLxxIij<{AFLgdn?8=)j%N=B*)wqloFu#$|%FYd8Vg!NtAa6pUvf zVcuj}w6WvF3|1Grg40JdwQI^v@VurMSD^fQupz2*f@vBi(3}pzO-=kxf;TJ?WV1|j zDiBMyy`VlW>DS^Umx5!%#|cy)KGoA$+<^39^PW&Nt3QEf@QOitLOm3Ag%43vTT7bq z$bLo$-lVHXyrQaG*Mb#EN+z|wpF(njt&Is{J~9}+P+RQdD&`0tW8lDF-)XXsnT1RM zPbd#8W+!A2;ACx~fG&3(ykyOV@~OI!XITwT@iz%n6i`rBBSBhLBc0?I3c`2t>-?&( zJ+v#`PR=xP0f%=z7gneKb?pd<5oX){XR(!=^s{`dQwOJK;2NX?BJy{C!=f}4 zcYs~QMhhmJ4NaN;l+yM}!@AHm6kTAz3S0~_Vq~?V9q_bi@SIQJ^aMi;CdDjxfMw$t z_&^G3C)9K%G&1-}E~HJ?NHe~tP!p)S24)(gv!~pqJoxYfkf}01oIa(3Vj-pqbR7Ak z3Bf)#h^!Kr3XYph&~qtp{(4=HnCz?2Cc*dq)r;Q=)_qJU{%yGm3Z(!JfEq^RY`IdTvlh4l?rz{4F0`j zZopTbGG*4W37WvKuR}&ycJt#h9NSls_JOjj!{I(j+=+vs2B?05(;7w+dm}zKRKSY- z<8zXArhmPBb3GiIlon^nbJIsUv>QQQL}I&4j)w9=ZMpPoJiAp%dcaP?&#?{_M9GY+ z!xBNBVdf!xM_8Ocy|ld-MI#}=03|$Apv(VGc-b%#m+h@kXGJPLUk>~wcV)>^0)rR6 z!WmlRcJ>#ZBF4X5_y4^R+^gy9BROR?yS;0S0Tu}6BdWEyIUlG^nIpX&{nj=txVX8u zOwJJIOG;cSbOqCWV|YV`>$*ws0e%?7s>;a$K8F!<*Ml)b=fT8iCG$h1X^Nk$HSz1V z@ROFn&g2n&2A2_<+c>Ugsyblg?`5~-(9X6M+?aGv$5*Q(dF(Xy*ot>ut6qF!p2Nb- zu?1rxG9K&HOpv4yUJptS5|WHOL^w8x&n#cm<0BwbP#u!nTJCC zwF-Po%u}^KZb6dA5-L-iQ4!h?cs6(htCl}WWZ87@BTlaXHY0r4Y$P;uS~$Lw>%t4B zLJwPN&L#BsDj9#eXYS-zbHD_ zuJO4C3)B0z=UC1jmk1K1qM+;XPTZHM`x10s+Bbq0*Z+q}qyGCOmkY95L+1^t-=@WB z%3e4Qu{J9WR}l3oV?P%G%Ch*%Mb(jBiJN-AA}2 z(5@Z%rmoRxtsCYlKDF9p_nN=)%{a(l<`jzYpv#*Q2_<`QzqOtPUSN6kS#J||{;GV| zuz#Rq*4lU---H6PmS45odD-PCGjKmPw(t=pr9KIX&D2i_bEDiE%nrSZy97JG^lb=l zhcLyE7U|8!y{yW6XeT1$b)Y_VeQ%oiCpVnQvJVK_+q1ahC7$Ek49Nl`2HHM`UIrAu zr)n??&H}qqG-J?ErR0%MyuS4Hlx$tR7dEM(N`1+ZQxl1ZWpZ^^SX+5tXIQU0C%z@w zFPT=+WGQyN7}!@!gMJ9Zr!;Og5U1QVHHkCdf5K#3ExA5xF$k#K($*&<8bD>Q(aCNmT~DhUe7k!B6y^qo9i`(X@ySiz-ZZjs_ z&s%DomsHa9U6o$CCFz=Ngh}{!4lr`|8;6ru!Y3|{#n++QU}kKqqo!{0ARxc+HD))z z?jgX7HWEv687ck_sussR8qIvkhwIM~?%~{FnK?4y+F}r$1^gC7SATv0S|;`ngw;H!Li*H-ond>$gL%l0DU-pmW?Ma+-I)hx|UbS}#yHKaxc zPnYS^lpULaN`3ecbouxVmJ{b64x$yV+~?nmy*cx}fEUo@w3n+JZ40Fbeq#S9?R^97 zuCo!`|7+TI$~;nJ1urtfryi^-aa|4qGfT>OF^`3xeoxli6?fx1{R$**$Z)n{`fIC` zvNg?1w!&Ir8{YwpPZoWt;8zT)WHxRw+n%<(t>KMdHGJlqcy_eZcCPt?iWT7E^zX*@ z@jFlXz>7FlI&|U*_Q0eAyV$-eUAb0`bJ|885zaIQ6Fg#U>= z#7GlNJuUpSq^QWb(aX=|y=Tkw_&a$QkjfHte%sb?pBIgphjAbESdU%Ze01FjHzwfvBx|yL<5;VQJ(iJf zD1)x+uXrEwpdTz_{0tYfD)4ub5;%&J2qr&B+$9`KMv-BORqaeKd76}ENQ z7aq@=afAIzVX_86;i{2=DkTffKluVLvxY+mHRJk)?6wd(;#VMpByR*s$ac+-)BT#z zLnyc)1P0*>3ZKM5`>(1^jqesDA7-iK>XJYlT>!5zWS838mZZY%Ja}|qUakcGc#s-zf1Qvn zmk~Mnp*&<}wLXc<4}2IUa~T#(CD6Gg?%xoz&672@wJIUW8jRu@kT_1f?=A10^ULf} z7m6t|LbTQ)eEGM8Ut=M0o7^Pwn6vJ?+mhIm?BpG-#1!fii7RLH$7rr^Uek@LaEkr0z5?-dZS8YqIGSk9r(G8HLMJ zZ7J82?)0LMbS3L2@*3O72Gt(czbrM-ea>Z$hL8qH)y|o$0bDc~9At;QVi0zDJKC$x z;{`AUd$I9Ny8)%afR=E;TqQ!8)9darpIt?V$6_;E5Nl59YS2S~%Rr|&2W}OJ-!D>q zecJdA#F4eY{Ve5)$^zQh?)uY2l%9ZpAkr*~s!-BEE51^DKyX-^tZo`lERw+-toE|T zrh>yY8;S^;rTMzavZC98dbbK1M$IdBpg!LS)8?Yx!2Q_XnGU?{Oi}q+@sNJmeg8Z? zdS+l)<_&Bo5=5SVxAxsTxEBqP8#Bu93M>gEGkFrc*V$&GN~ zNOK&DHj%@{sV})K`*~d)y<;#PA%_HXmCcG0KQbDXyI&aCrK}Yh@EisG#eay3fhAiyNg4mO!vKc8IRCErsll%YLdGT^YMuu zG24Nz^av#KREd|__#?jP|48k!TM5bgNh0PCX?n3FlUF50sa%0nt)OY13uDR1s(qM; zfY%7)U)UdY-N}O$^P>%XGs)^Fpwi^lTQhmOj0+*Sec^g(;1|3T?+wLBh9vWBaxhn( z0mD$O;uWsG5AANySEhMHC>p!V8Xx<`zlPn-=DG>LjFrFO-s&pfqw?uKika=|g;;fA z+-(Dv^a~ICnJu+SB)>`G%~01%jPl>X^(JR5*~q+2dzwqzA)~P+SteF9>mK0htmbAN zuDs`%(6Cck5veqa7`7SK>jCXFmkKapo&FK`EvZF+q2{BJP(Ex~Qh*8jt~xC90O&DU zK+Rh8cwz11D4f`A9$G>3jt~`!H={M^XSWh|t?i_-y|#z-OpU7j2{G>VD)IS>(kZ)t z!u1+QCoC*p=+K3=k}Yr6_o8`qEp&JM_9tA3a|8cSo;lbJ`xJRdwu`ic*Y($a0lhY9 z(Po?;>Dm$}Ny}4#TPM1vL@Br`jZ*IlV-xd26NAwPKt$e-Y)+5xL zJjx9Cne)f6-q(D{8Vf`>oH$uKa`*$ukQ?w!BU^_a=;_*Sd~$ZJlqrj_M&d=A^83@q z>%A3~k{(@e2vu9*@pO6@>`9n~Xy~O{xwgm%qUs$(Xu}W8O%-UYGxRXjzH`DL{C9eX zdK>I}G#-#I4(Rb!9J9zwZJlB1FA1v&4!!tJoJTi)Kf{+%x>M!TT>xoG%veDEmLwII ziRzIr-2NXco?`lIeh%pduijsG)NRTT0T}KbEc?Lv*uSolefmeV8~8Qq{C0p#XJQO` zPSON-o}dA;pO4)rDQX$b#%whg10S?*4&J%c zT))A453WfM?!Ap(#X_%}p_B3XcfnG``)e1+tRM3vzxUCVcW<5%cuUZS8q2qgZHpkB z3w?%O;UXWoUQz>+!yuX{!iYrb9*7=Rc8=}w4Yga{*kh*q>8W$==>Th%v;VH{o+BzdxnJ6=jJcY^YWc{} zWgcDRLDgMMN>y{s2VN1DzlBOn0rwlmMjiwQEXdWLZW^Jq;?FlmO>8wNuc$8MDPuN* z!8PPXFQ6avHEn8!@YMWtG>Wi2?opFtI&B-)mD&@h@K^6tEAZWEjbk;2 z?dw(2#G?!Py8VGqF%ssFl$}f4@rFdJSa7w8EG! zK9KeL3h$=asO@Qx$w>yw&W{`W-CwA|j&=l}23Ccj1JQG`Sw@IogbtBQD2$`OytMXv zt#MU}Zrh}luCU!SG@f_Z+0H+rJAdpf)zt5mjG2C4nj&w2mU+3q1Njr5w&>37U)|YQ z5anyw2o-dg&UlgvAOVS|c)#svTiI6LyR+ehMJrl4C?Ndox{{Zd7Q-+`4bMReMOQgY zGO+9J1YG#58=uT76hl4~4U&S_cMGl>Gy7Ed zm?q&(CedQeqZAyGN-qT*CUlqk*PzheiP+(8uzdJE91uE+e30qYU+6VwlTOV$4?Qm0 zP|?pGt#jte>YaFxDtAIxpnSC=tYcBlKbPn0!?Wo6U4XB5rvjF=k$esoBLmi?zF6o_ zdlC47*G{dURKeE7xlVlmN?3+p23QEZ#t66ki#p{ELe9)Cwai-Ns?jQ5u4hKeI)j~r z!)Cw7bv(G1p9%B6Hp~yZ5$}vJ!Rz0o`!4Eb$8Z^ExDMw#l9GFl;B3b{7S8RPa%rY! zmdQSz9NdKQb|p1?y)FaCBCVIgG*L$FzXUycxBS)I@m&SbvzY;NHv(uD^r1)DdBYUe zLT{cRiA?=ezh99q6M_z2KiRfj2lhA$TM#C_0JdtXRARsvrtBsyrE&-s0PGmx*ZYZ2 zCSu(^anP&?<$&B^TGD~~gP4-V$=^RM*jqEo4|eACb6+Br`_Kk`^}{y-%QM~x#1soG zvd~+BR%`oOGh>N?5l?{pdnJjK>$ z3re%feRiR@Wgh#Lrrl+;SvuS)HVe{0Zx8=5abMx=cvOuO2~(Xgh}KVy8`}Wl#MZ)H<`^(vys?;e@Bo zg^y`aYG{&UD5)vHX2~3LKWXY-(zQm)Nxs953l}HuP zulpzmHHEe)houy;fXm4fO|k)-En9@ux_yB%2pwJX$Ny1{4~)hsA&x=6Er6mOpVf^Dt?VZtA&?)Nx~+F0?f{|6=XH%CvyhC@$4WdmwyB(bpP^sn*YFQ9A? zFhf%c!#@*2v!0x<1*Pz0_iNs?LM`<)hh(mq`nfJZ%Vr@j09SrZge({GbYCRgFn{LL zF%idXMZRV^&xU%l)`WRfa2ZYul>{h(3!CB$m|7roFjddK2-_oSqkL-@v5e5=rlRAB{ z)96|QKdqjnr2o?${FDZwaCXsOl9MT$EJm5WVAY=Q6o~OPWv7XuwMgpP1DbkZc2u40Z`M$cSrIg z2<7d4ZXS&>paLU;6Bc*pT$V+lJ?TQg9kO}JHlVICz6Bc70lQ)wSN^%LIT>^&CO6Fk zpPL?rqGU{M4SkSPl}o+@mok2oM&R#cc}K&`!p0OM-u*dnF%6J5nwk!9di7ZR0K zEBt{ORYpV-d;_Md-{5%N)o*0kQs*&vl5r@wqYja=9wdu8rl5b6IXAW$@8buVjzLa^ zV26bA01%>f8(~pW#GZ1}l5BD#XjMtsBK4Z_j6Xuo1x*YMea+Jv>r zx~nh1#uz<$J6*lEwR+Dw?9%-$%eQ=#t1Dia2xD8nzJokzuGwpv4odb5lXI#qXP+0K zV{{vT@XlN(%O}zrFNFnpX;VL(cy|mlnUCAp1RKN`Y2CY6S^4`mS7LZ$C-3#OB)~44`pyCvfcozIg3egNYYN0jl1WK$>cKylnPYU zWLFfl0IOq@+4B6>XRoGWCH!L3p=XEQ4$;GfX5%7R>%!~{T~Jypdkx=DI`4VG{`Cnl z-}Ji63uHan=LnXfW^?JE{_P*rI%R{1XE zt!XQAkeU~?rO8~U$mfmqYs%50jot2vcYYFeY4wy)G4%CuSO)d75#$OfYp%Wgl%+y8 z&NI7K`mu$`xgQ86#B-At#uDFKYmrS?i@Vm$R<(m@yO6a_E6$&J&%1Nqf6^%pw-DaF zby0Wa1ghcSb%l~SX|4Pgvx~IfTdDh( zzw7;f1U8#b2KYm7pdNbQN3Lf&5WyGUhTw3HRE&O9NSN?_QmXyW&}CL_NgUi?m?1(N{l~)aoqeA~)J3bYG8TEPu{H{DjQ3HjU1PO+SnH#Iu{(BFjdGDb zp4-YAJ{YRC`^vI*`Wei&*Y@G(Gg_11+C0qMT}cav%Kk+l?bPn{;k2;Q+WF30pS0ks zC*XgPiVxM4Dp6I=3Q>Bru2pyTxpRXoA7}Y*2*I@9q0YFs@3raq+x|O2>Y)xX z3zwS@3sbikj~1vwzu&<-&pU^^pVr z>@ZhpwBdxs3PQur0^s6}Rz|&YY1OiI4$FSxg91P3`8&IaOFLN4RO%hoJ5HB)6bD=k zuof%a>w6|?sm|}UOhj1_fQw+aF#8)au-2X)kNql@YK~`g9Z$B~pZjtBSauAZs-0OD zC||==6drk&XD(t;-vE{+t)|;KqZb*;=XEI_p|d3MC8#u`>Z0Bw|3IIVxQyzxT*|!* zg``@!1K9~mq1r81ssz);(CKzhvf}7JN&ItYsnm{-~ra{K%|N4RN%3JIyTu@0?`CjZjWA4Gof@is}S72Rr*CL+0 z2#}NH-ehOR(lRj5bE&f-CA8?&wGXEc9O!Njr0hSF8(j?ZmywFGneoW;lPCaR{vXK1 zYh?C+5EG{n)N!=aQ*7E{O<0aOtf3Qgle7Hv1aK;AAHtQBG+-`)lJJ~vf+{nEM>e!e z6ILaX?2N!%*25pTR%Fk#2w&3E2eONuAIl)Rz9tZ_uzpY--mG|SC;N$GPB-`E8YRB} z%YFvrVrUAU$TLB`vNi2G4$Jsnlj1p3Sb>tYsKb2*(F-3bh>}Jd8TRB0Jac znd<%WWg|eU>|t{aoMJHz-e-|-mC`t3vorE<~TvL${rv#6(m z1D_Oe5|3`=MCOg zHf9A%o=#LLWmsre-g;kHxOshtsSzC%LfB-H$AYkSE&G#rlYe7^tGjqkA~yJdW3>>@R)N6k-0&&cK1 zU$)$r!njVH`n%+GuZQgk={h7dC=k0oe&;V7No&DajDjM3UO1P~S~GZWXBxOzxg79g(u^u5?OGEHYkAzCXuVP_$Ax@ENM|Ep8tO{UHvd6=wZnIzLFZ)9DVr zwyJo>&zPP`yUAu}E)~#~fweI1Om&`_5xJP|=0E;Kd4QCX@6_k$tw~TYw?y6ItR66S zSw3{L{gyyagV}JNrQA@UH444c6C~Up$lzZGatX*tNXRbptFs*zo~WA-Z&a%z|U<}2Q@ znBp(HCtNm9x)*C?mQ5(;H=;E*$r@$Uax(a}h>Fj>dXm$rlL-(C|zktL7+ zK#|tLps|QIf`A> z{S*Dbk8X?EMY}DwBY+jf2R6;Elgg82KW6H#74z?)k)klaw7aCeufWPmIl09nS~&iM z@5FOj5bWE;b{k3IZkSB%M5XLBa|+qlWv3dkbs?{+>?r$+fT+ruY@~v{4w>(n?*!gj zD0VrX{bm4>-eNZs+LS|@t=n3Q_CeuUhRWb z(zJ(THTsl`@ve5wBkl^tYb3p7{1qZy2Gt?M^WMAsTk4m;U$V?(Ai+Phx97m9hY4?g z2I#`SJfvB+;Jz8V=i|&eosb6ou?LA%Gf~()3&vzG8dm=Yh+KO+>m`u7isWbnln&$< zt=Ke!h~Hqd)Z+i5A)v70xfq9jFIqrpey<{Q8Fz%ra=q}T3j&H7pZ z3h^qa`xB%1g>vNQ-CFCfd4xm29+ac|bt3CS04dK~iko3~=B%dzkg@S3Ot`z@Mw1gw z`9Fypv${*=GrP!(o+Dp1y8u_$4#`J0E+S8VgSsW%Fs@4s&TvKU20%@wi~N1$CY_j> zZah^P4*jF` zW@F0XIO#Q5cTrY%i4=MOBN1}auR;d?W+g*gKm29RYF6j(&iQ-hgsos{jtXNguW`!~ zN@ugBn{Zb5&mR(C}%H_)}q>%AzTVw0l208Xm~-24~oTn4zATV+=J z<}$ya;aP5mnYfT<#A|-h;$#A(*er)pEYI?8107cl9jRq%%yK%HNBvi(kZNL1XVEuv zBVusp6Hs>Am@SP5Ev7H8K}+5nn&9YzbIx8Mf93y9MNAjf0ty#ZhE8GC9@J5Y`oMDcts>kf$V=!RMO3v}j; z9B9;-370wlS9DDEdEjjhwg|1ISLM!!&0E?><9i_Ikrgk%w-3wir@h((+k(cOc~Ud^ zYBi67Dh+>CCC!8tII6u=*bj<_UXhTw@eMZ6>P7ph1h)9!fsyELWh;;ZL9Zz;9dtV) zVyA1E=UtqZf}2**ZcJbawJeROSwm8H$^v{2n>2G^AEHVLebq!|D|4 z?$N|;os<3>BL5U-!d^}ZeI!bA+s8W9iq^0w1E!Q~6Ib6gKJK1RnKK-3CMErXC%M-I znO~kCzY*{c54n?12*K{YX^8k(7ko~ z%XsLzvJ?Ey!#BYM2I4Owd@-GN9v|p8utzqLe_J3S9T^mrU06FKAB2p-T1S3qmtJ!l zAl%9>90lIbt36K?%joj_UtkeTL?_sOIa`Bu(BqLnggE(j&27^G*>0lSAg?HQwA>i3 zngPXb?wt#`32MA3^sMkY-5+y_JY54E+iEm+l5rlnw`U27pS9FkdgZ6eZXKS9(1t=! zqS#IcR$z&_DNp5G|LM1*ZU464+2e^?i4$Iy6KL%?vKtXTu`n6DzKd-p$*er9cL17> zxquYAdE3ABWX>S#=uVe` zVjhje0PcA38!J!;E_69!?BC>-8;phBDyc?qgV*&v3gxUZaYfG8B@myJGxr;Q;@z$% zy|8%HbnaQ}UFh%HGaf=Bp?X`AlL^jjRUF~_EB|BM$P9Eq=(Xr@o+Z`x>JXqa$(j93 zPnuT6rB&|dq}Qrm`zvfbDbRWVA>KCCj&={de@hQMk%q_j|>0jm99L6I6y z*Z&(7X=6*emo$;COYKJ8H=WCN392s_ZM#0vWHTH!WPpF^j_G}LhGux>Ux4nV+-cM8 zapx=~8Y2OI;^Wt^1Sae>E{_3!x$3?hJhser{729gB5V3mM0TJuXXtged)O)FCCwDA z2E*{PD<(nb1!gb3NKNq>1kQcHh$v=C38dI9MEP^}{iQD&o2X;>NBg0w_>rI`n(4U5O-@QnA=`Zq3+Gj7 z-`58;jV%>}G{pd^=pXG(bu6FU9l}5Anc{OBN}`O0e!~8UtNf_o_3sJUUTs}EzLxGX zQY*)_fi7CmeL)w()ri!OW`)GSzu7)u>+OA?zFo*vaggSx6Yh1_+1EW@fPbzhE>WlR80dX|6va+~n``YRXG-JA>wgWu9eO#|6UGpH|- zU*hKQlh6g619roL=)^XlFsW(1zeeuNDc&K9b=!C$Kb^Aw)?=_VsO|A7QdXXGznR~c zB7UlCVI1WbwUzHQ5B4lASkl$bG!3i^nWFAuza`4v{_6V;Ju^~HogmW!>1DTN%!`aP zyJ5Vtp59qFeCf9?C)F=Kj&YI*&WMLqhywBd|Ck7I+}TKqwd})$1o3v&U8R%L5q&B6 z3!x4)ZUH%3iFI0_3~q6wy(=Im<(6a>YN_20x07P%ws{>BT7B4r{&ylWENR)C8}r|ZNd7ab zHuPMwX&y_Ff2I-L?l=<5xh(EMCX=zkb0}X4WT%!u*JACdLmi$j)LJtw`5IV6vEB(9 z{y@4cyn%Qjzj;~0^_$#mkrZV@5>9>rSI*3F`G(eMzmB~$Hs$5_??AeZRo-Xm( zZfr_EYWD(^dw5=pl2|(+8zIC_tzC_EWYoLzuZg~-(`k^!M zQMCo~tc^Fpu9pH>+c*cYy5QfVI1M6stEMd5thVES$wL}LRHunND~eSg1xGOlFi3^& zKh{{|0h5oW%+5P{&dPri9;gS?9NSi_UT8L}{mKKV4x(Z}Y9qzQcloGXmX#nk9My~e z?B=es=D+!@8^5zbg2|U`cyuUIdh)D$P~d-~Ar@+S%XlXQE;?+wkn@ITk?bX}dFQED zQJ>R`+{(DfLe939sSK80A`2?Y8}Qr9yI~(_xBe}L2hGEOaob0`xfCdkOKH4ywqrZ? z1t9;AayEHTS(KdmKXAxrQ6eIffvm(vvm=sQgT#`k` z!&OE!Q-x7;&$O3i5yqpGQ%Lc?VqT8{&uYy=D`G;ApN_lefBj3`*VQm?KXw#P&(+~2 zu7U($2ESv2HKTb%SoOB2h`cDb6rPy9aVBz~{+EnV(azy;SUjEax$o|0ySN+)oZKsA zzky^+#Yw%_Bb4(F8BoYZS8@W5OU>!}BVh;V@7xHVX-V}YQGWbHN8+bVzuCtIq}@Vm)3XBW z3b=}%w-5K%-7in;b9ntU~7=i%r_%9aXCF#px=Z`?(MP)vw*%tY?jgHnQsbY_oW1CM;qtXZZ$AIJ{k4Ka3meLc$~=d4srvHxcT&~kQViahN-1yT z@FyCWtHprHX$%a?XRdA_CXf%{?r`^s>eVVAINub<;KGE%R9;Kwv>*d07$AX!s#N|e z5W^n^AlFJ+$k{+Np=Nbs^|u3R<5DD{8aClNRXrkbBUBq!JHW!wyzW;ihJ>-2)ud`e zrVqCncB&D>?SY}#>(I#gx9l3OR|E%2_}k1CGf|A zf)QLKABg0?Re3ObfDlP?TFxBm+3ox~iXZ2@z@j!>O=7qTD^S2bU0e9f4N!4f?pnUl z*euT9Xl%7s2ga3!q>|>SfW{3E6!hMZ5B(O%gtG5PVO*>Zc1>ci@47L`=1*~8IhR^r zb*!ulNygaI!6&V96L7*Xwv%t^91+vFO1C5L0Cej&^m;5A=Y_u^c?>SV$^-rP+cE|7+BQ)ZNV~$R z`%1JzwLsEqKs7@ysL#AA%&8}~4*;l(g_BpX4;sg4y`((1z$T!^7 z$YxHIbWjHw`=PwpRE624jc)xOI%>Ik8%2a;?vUn;Hgiih+7N!|Nr@RTeMTO(&>`oR zZ%|{EYiEzn9i*lbs$~dGq;*+DJ|~cWW2-4~8&+Wd(8S*nU2B!UxcJG4Ab(6wAl*KQ zRJrY9E4N*E4Y6T>3m)UUpyU*qw>m+26%_F*O%E0~^-iIsYAUYJVG6z!3L*kI+%L#t z|Milu+-sccFDS)}>bUPcx$EyaoGa9#jt0HH@_fE??8jRySR&efN50(J)qHN{ ze#m&%BVHMN3VchBX%Y&CYGprYWL0s;n*%Q+pWQ?BK-bCOR2c6V=q8wN00cD#srkeE z?y*WnSyfWpw?_JU;n8n#AMF4(0L(yEdsw+@6fdO+zlhAJh zhz^~7Ze11X)1NjLYUBQa5FJ<>(Gi}ci-TkMHh(C1Xd^E~?>CybcCS4~^mi+doQ0DM zeV0r_f53-u>3Ea;d*f{oQ?1OPZpdlSY3R5`TJ)w|s+|X#Wh+`YEEC;1X1hdag z8{yKxy#zYQAptLY6jQiJ;+|czMNV}=rUH+$iGvV<#c~G06AfUj*hRjHctm#z-L7dV zcmd(*)Y#>!IWOau`~{1R%hV&85ldy`^?<*H;8X_|HUkpc0Z zP|Uj7Cri*TBj+|W2XZkqTO6$LXY(=Qv?_-aTYIPMpCuK`*0PSTs8OqQ;Sg+m{mkjv zbKa&Jz$EeC=&LW$mgpX0M(bR=CCLbM+Ex~!Wy`6X9@QYA;Ui~BQ8VY#4f&M!<7x35 z>uyuP1-FId$i=|U>j-A0U{m%Ya+G9~d2juU3H~JzWaw$mpPgZ;0F*{7HX5e=6Coj{ zws?Om&V@g0k_-)5%A5URh=iU--S6ul2wc9CiraoL14-07xg9)LTa1E#HwcE7Mw-T6tL>t zF`GFtn+p!O1Z3Crm+4~vkWJ}^+=|337=i<;K(XEv$8wUPeWJ=@;>@*7D zReTL|mgqz3K?*iYiGsA4KX-OUfaResqYh|d{=M#e>Psh&MG~Z>vTOuGkYv`EubZyE zlMQj6!=@6pQvqdRt0Qd~3pI{;3I86n1A7DC2hk{5-Jy$4R(WU6IBnZk8~DzZn_pg( zMS$K^A>o~7E^a%Aem-hvGyzD~wDrqm@55*tVz=|$&g4_2l)A$Zr{PE!maWOC;a;u`ib zR8-)HT1ulE7R2RvI%B#vIM+PLiGblX_uYWGY_*e;HE*+e)Fa;w#*Qz*73j z=jhleQWEk&IK21!( z(NFvxq5pWM6rOlJmplCd@(|Oi#=pyAWu@Uh1gaJw7|&KJ)z#?jat+fQAx&^_BljI; zz3|WX7lUD}>!kZjJ%DikqnNq!c5_I9%le=tBp@6LF%CHhAC8Os2dq<#3wG@ybVJv= zrOZcpr!M5WaJSp2A@jSWy&jf81_EUPS>oSe&QVwjBXrPj^VNYcYuJ^f$gA^~Y{&ACnx;C&f?$loTFGMF zcc3jZ*AR_XWi?AI=(LSFE|_kpCD`JQq9{LB%}j2G;>-DwcAO;nj`eSYtRYS|Y02!5 z#DZc@2u;pTrdN$~Bm0jxl6ga~qswL#Ee`FWN>Ac}&S?4vJw)Qg`*+Hi(k4GBHnvQf zrZrW4rI=-#3w>SONwCSJMMEBE7?T$jct=K+kb-XzeI zq`^P69e?U8Y$6m!op!A|Ga;D)>_HQ4b zkV&?rvM&{l5<_-|A&L-gC6&FKtl4*Fa8p8zrAXGul5G@4w#ja6!`Sz%gR#w6#w>WI zp5rnYZm+D&4v?Ab_K}$j; z)H4y*KF-H_gtk=sJd{T6?hXGKJ8H(8;K}@VVeyGGRnNjUzX(1=y+hH*1wrso3CxCK zm_jpSXJ0EDG~?hyw<`28ZWMWPuBKCP(Xkyag?B{&MU3kbn%qq(e*iwPp%p_DgE|ur ze-pe%MOCV~hu^B(g{Ajlh!EQR(=e$DXN-7HdYkOTB|8Xb7aqDp-Oad$n(==6JU%;VuPK08#MN_ zqtJlTEEHH{jHm#^*y)EVs)T?>m#_tpfA*5DNHx+R!txoNYP3b}1jp?8SS@Jdb4iU6 zr@vd_e!bi9utTREN9Bx@|MDn?+KYf0H$YzzsJsX6;&XnV_w`VV1D#pA7dcf9xI@BT z*EcDqdpqWj)NHTC9rc|gj5Qs|RhQMk!C+Zw<2X94E#d;e&y-9MOen{1F!L>jGL_?zA-&>APK}aaD^i|X&P56SS*7FX^-?6c zyk~2hl2LnxW1RBEnwclqW-dKoA>46V~txPr7R&?YC!X| zAinM0v15%u4m3ih%!BL-Khh<}i?m0t7ok?#qtp7Yx?@x}vM*Ab{OzFJjveA2GP`NN z={Vm!cqouKXd>veTb>w3;kR5<->+3B$61r_7)>t`xF00Y&Q1i~RPk?{s%{b_om-5d ztvA6n zDvP?%_#wDH&D@fYbk6-m?!#ydZBW;kf_4Ovb=U5N5hEMC;GnP%sAX9Hg&YyXVBVV5xqK*(iZ_G3U_Sy$GUSiwzrGr1b?2 z&E1pUAFv|P(TN%g(g2^sL}gDc>rSUYRFu*4#@@Q*rSn5g!MGqpL};E@Z7g&@Cw5Dj z6D~bW7@;_+?(MUCeY2DuP)T@Yg|IuROp!SGJXei-;nWg2?yqkx%vl0W=Y=9P($JF8 z?eU0yuTZDV-|4;Q)A+@p2}-Jn=x1z>l<=U;Xng~5<8hsJHr<`wm&v`j#C*zz;}Jn5 zmR5<$kZxUh;hW886Y7o)rnJ7C69{w)C5>zccdBSi;FZ-o$;aPuhutZ(uiBjKpe6z} zkIe1UWL;=z%-;ab0m4e6;P;6HLG) z#@S@=*RQ5+l&?4PJ4Vk{;`#8kKtE^68_UM#GyMY{=cBz zkq+$#I227q!cU6vNr0c74J;Y)>N=uHZcEq>e%z*t4<^gSuRp>COe%y1#U?0Z_pmLOd1UkS+-l!F=eS=ay)RC)NF9OMJ8o)KH zp6$*yM;JI;a_I}TMb}+!kkF|zb0kVKzvh{{R%#JDuYH`Pt>#Fu>zv1&##@Z=bcr7{ zPOEP}T`w0Y4cV`H!#P7v;h_*O9t}0Q+|;HxPu>A_BkTA*!eq{dXpj_Ovp?bw9EUfD z_%T5(v{Af;unX$b^u+3MWA2d^EQnaOE9pU*w+>5~-Yumf8#+{NQJd@}=Aar3dMNsE z^slSXEIB7?@?5`{pJSjV-UD> z0klf#{coJ+g8vEZyZ2`T;&U#NFr!U0!}faRXx0D5>uEs$TncY=$7T4lgnX*?^DJU1 z+g@#8S!AZ@s`Xs|mr13|{;J+5d*uc&V`#9Ak90R85|`7 zR97Uq0g*w&VV+c;!0r$pX|~4vl4B!xN*J~0 zf#De~^^@sM^QX@379Y~T5f#?j?1ML&{c59Ylj7kQvH?*hk=x-|nhXb_-aQ+9hHX5U z61HsjyTZk4Fi$o*A3|!plhYdIvX_WW+1?wP2W6aO8Tcc&FnmKY9eftv z@dQ_r9bQA~4}c#a6p2FN$dm}b%gWx>76vvIiTVnpEVQU6-lV7LX-aAGyOcod z;yI2=nQqJ35L`xX_&4r-j(pWVvkk6ThLwa&77$Wr-wKo8cOZyW*7xWwG;bO{7`*VL z&&Sy&b3@%j1FE(a$=z)pTUFH^u&#b73x5B2I%X=!w{k1nhDt8n6Ol~7ITUSw-dDj4 z1`Ts}%c*Yu0u}yl5fmtoOwcw8EE7^PDxsWBsdECgIX1N#%Xh3Of^lutmYV{;uV*qc zH|CAU;bSVP-jdP5VN}STtJ*zDqF4cyeKyhGpzqNA$5L+qvBdVj@=B{o1al&c-J{I|{uLIbherV|IO6lNwZM%+pjeUJUe$! zGZ3B#Yc8C=oOlkh6CRb=EdbWj!u3w$LzFTC$6h48zOcRVEdY+A^{4MD;D4r^gflDw z0Kq#zz=o$NX*NqOVC$`c>V<~OEj~?bKO?3|w)KoM3@W=3p&Yr$&I^u39U29E5&g0xQHCU5$1%bKg5$Ov_KZ}r>v!`mA8aaNZuK0XeY2Dkz5Z(%)XG)g2?y^g?<8{qQQx1;NfDx)R#BhmE?>|(HBI1dYjAn&V{ zm)*)7f8G4>={@n=fcH${K&)mt9xi4|RsjB@s4f|)0CuBx8RjeHjdE^EZpP%D#vT?5 zuzjL#sQ$bNd=arSnc|i+Wqa#dOe-PTd=f0OaRyiiWOq;!gsLW)WkD{H3?6kNZoAuBOW$nH0l# zZnjZF#Z=i-l`c@0I+6+cpR}z<%37{Amk1;Bsy7If0@TsUOkmdNbp&v~{va0~=R27* zdYzrsKc#{3N1b}vm__`B=;03v*b~v$Hw1c>g*qgcx}wjE4`6v*7%NW-KcsCgU_*~~PjFz;?hmDrOQqdYA z+|@Lr@kiOi!H>ucvujWvj;bQYA3meXDWqHdex*99H0TF6RsiF95=1CaOF3Nf0_3My zP-h>*k%0)E93Om?K+=W2`I(mGpgpeCy8 zVUaK^njozA7QG#HYHwf{VtL`RVDRB)7=Nla>!>bjyxUYz)BSPkjW(>=vo*c1vVaQ( z6Yl~i9Y$Y?6^5FZ`MWy+e|~dXYmt1g+wP?EXfV$Y{g%<>i*njM$rN9?)3doFXCu38 z+49}ze@M7p0-wdQD&J*$uW%6V{I&D$+Ph9{PilJN5VgEV!_CUyxKy_Hi+`?+z2eQi zZ^8^Rmz})L?szKH?n1g(HMebg6B@&uX1vbT_yR_yxJq?&^j5NrG6GDjJxA_e{QMKa zVWXGlOx*Z&I8MKcPuSFYJG^9@Ipo4HS2UCjrkOmBvw zqh*uw`)8tboCy_Nvygd*k`67E9?6z$8q+|l?)9HQ*HJ{PUY{J-D z$wIHV#~I9CpG-pvvEx~Rq0HsG$=Xj^3s{?5om-#u4d4Sn)~Jgzp1Fq#+~?ywO!Wkf zJc$4@al$Kb^$9KwP}vue=bC3naB-D~*yhi_u#iHU7z~M~g=kE0C6haxen?kh&AEgg z_g5DBZSF(}wFT(DF|ZYED6Ri8l=SIwoLYt@Xw%lzWh*x}(N(BK|3TdMqgUm3w{N#F zI1k>i5O?6&O5lr%dWq?}yYCaGYytoFvfgg~29sl+d!f3XnMAAN;;cwts_ctF>ne@n z>w$-#GE=_WqZ&*uW~cQ#UtHD&b{268+3gAVdp@I_Qwv=ipT5tf4}PrmO3mexV7P>w zn5@r@-Wqc~VY%LJUoy;F*!brTWLa({wwS*}{Qk(X4`8QLr%y5NHXrvVMiZ;(8Ji!_ zUWVqIq0=&HEGxw5e}YE%Wv^g+y+Wm5w4G9E*XB;l$-Qkq9JQ?Nds7l(KcdR%*CtaM z`*gtSz`AOuhY6*p;d_G}B{cuJG-x{afyM4%c#Wj#tr@gpP{-KE^MgBg&93!wvjrT4 z2{_6kD3+NZ7GUo4k8UtlR_ZEN&05@bTk8B< z(YuHuzD*?)ZiIbh-tslhJJk;3{w&uY2t64eQRjP{zpxq_p!&V^>Me&J#r(zfwx;h+ zGYj7`qTUp!%v{6lnvFOqa*Uh%r-ax^-Js+lts! zNK;423QsS$(tXYd_Q`8COx5UWMo%B1gPZ_BC_@GJjwALb>?{4%3?VMIjOZ&qcc-#5 z+!G6g)(X@L4Ao}AxYWeO`KlXOEvY5;O9PB-Y%|kQ4O6eS<06RP&Lr)Elh!3aQ4F8% zpHdmxb8Zk+hwTMXS?q;@OT04nG*^F<8$z;M^<{i9=UA&SPjYGl5)@A7yw{=atxp#3+fSFtw7}-v z%C@`pg}AnI=gw2JADue9%yzoV!=B`gLv)H`;oC4~s9a4Hq|r5=z!5_j3%0qwf5$8}Qhc1fJduzoFvqbrPx6Fjn@$ zMr_JjZ0h;*1sIXx(z>>Q8E4aGp8Q<(?Da14DL==LcZgW%KKU+P)U{l) z^0J`UglFn_^`$EoL(*$*uBt}NUim%Vz?+c4|7`NYxkaDjFPh!8*(UIK=aF-TWi68B zdaPT|nszhTxk_#bzqUHueD&xab~{8;>sR_^85sLzb*6s#9%W&d*L-Cqdk=;z<3KD{ z*vPAfW!d(BgA(G61=YO%i8sy+T{%R{8Y<0P0C)>=(B4-xdnwv=Fd_=bt4a^roz8f) z{xxLpyXKZU!JM2CWVoDtM<0=4advMvLaj$~u!*;XtM+i8qlUFtpDN*40Wy$3e;aDUgegCiCTqQY+RyUX}ZME8^GT1a_=EQW; zsOvoDbt^%U_WY&a(4P2{6{brLpS#uVTsE$h*F5wLn9MK#wmEpIF0LoTpZmM6h3j0t z)El^AV5uuu|a)BBmm=pF*?Jh@OK?>A zU-`!L literal 23459 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 Date: Wed, 16 Oct 2024 17:44:52 -0500 Subject: [PATCH 9/9] Update submitCreateEventLists.py stop looking for resubmit failure reasons if one is already found --- DBTools/scripts/submitCreateEventLists.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/DBTools/scripts/submitCreateEventLists.py b/DBTools/scripts/submitCreateEventLists.py index 529e6269..d50fefbd 100644 --- a/DBTools/scripts/submitCreateEventLists.py +++ b/DBTools/scripts/submitCreateEventLists.py @@ -52,7 +52,6 @@ def checkFailures(jsonFile, logDir): #loop over output files to check for issues for filename in os.listdir(logDir): - needsResubmit = False if not filename.endswith('.out'): continue #get run number @@ -62,25 +61,24 @@ def checkFailures(jsonFile, logDir): thisFileName = files[int(runNum)] eventListDir = '/data/users/mcarrigan/condor/EventLists/{}/{}.npz'.format(outputDir, thisFileName) if not os.path.exists(eventListDir): - needsResubmit = True + resubmitJobs.append(runNum) print("Output file {} does not exist".format(eventListDir), runNum) + continue if checkEmpty(eventListDir): - needsResubmit = True + resubmitJobs.append(runNum) print("Output file {} is empty".format(eventListDir), runNum) + continue #check if there are any file open failures with open('/'.join([logDir, filename]), 'r') as fin: for line in fin: if 'Failed to open file after 5 attempts' in line: - needsResubmit = True + resubmitJobs.append(runNum) print("File {} had trouble opening root files".format(filename), runNum) break - if needsResubmit: - resubmitJobs.append(runNum) - resubmitScript = logDir + '/resubmit.sub' shutil.copy(logDir + '/run.sub', resubmitScript)