From 5b6ca8525ce50b4e4a461b2f2cd1d021a3f4252e Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 18 Nov 2018 13:45:13 +0700 Subject: [PATCH 01/60] use ConfigParser.get*() functions; move config reading out of maincycle; drop unused import --- src/compare.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/compare.py b/src/compare.py index 62824d6..5b24c22 100644 --- a/src/compare.py +++ b/src/compare.py @@ -12,7 +12,6 @@ import cv2 import sys import os import json -import math import configparser # Read config from disk @@ -61,16 +60,18 @@ timings.append(time.time()) video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true -if config.get("video", "force_mjpeg") == "true": +if config.getboolean("video", "force_mjpeg"): # Set a magic number, will enable MJPEG but is badly documentated video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested -if int(config.get("video", "frame_width")) != -1: - video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, int(config.get("video", "frame_width"))) +fw = config.getint("video", "frame_width") +fh = config.getint("video", "frame_height") +if fw != -1: + video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) -if int(config.get("video", "frame_height")) != -1: - video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, int(config.get("video", "frame_height"))) +if fh != -1: + video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) # Capture a single frame so the camera becomes active # This will let the camera adjust its light levels while we're importing for faster scanning @@ -88,12 +89,15 @@ max_height = int(config.get("video", "max_height")) # Start the read loop frames = 0 +timeout = config.getint("video", "timout") +dark_threshold = config.getfloat("video", "dark_threshold") +end_report = config.getboolean("debug", "end_report") while True: # Increment the frame count every loop frames += 1 # Stop if we've exceded the time limit - if time.time() - timings[3] > int(config.get("video", "timout")): + if time.time() - timings[3] > timeout: stop(11) # Grab a single frame of video @@ -111,7 +115,7 @@ while True: continue # Scrip the frame if it exceeds the threshold - if float(hist[0]) / hist_total * 100 > float(config.get("video", "dark_threshold")): + if float(hist[0]) / hist_total * 100 > dark_threshold: dark_tries += 1 continue @@ -146,12 +150,12 @@ while True: timings.append(time.time()) # If set to true in the config, print debug text - if config.get("debug", "end_report") == "true": + if end_report: def print_timing(label, offset): """Helper function to print a timing from the list""" print(" " + label + ": " + str(round((timings[1 + offset] - timings[offset]) * 1000)) + "ms") - print("Time spend") + print("Time spent") print_timing("Starting up", 0) print_timing("Opening the camera", 1) print_timing("Importing face_recognition", 2) From 56cf32388a8b2c98ea2517ff7c17c90ee49853ed Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 18 Nov 2018 13:46:20 +0700 Subject: [PATCH 02/60] use ConfigParser.get*() function --- src/pam.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pam.py b/src/pam.py index 42ee919..6de8f19 100644 --- a/src/pam.py +++ b/src/pam.py @@ -16,11 +16,11 @@ def doAuth(pamh): """Starts authentication in a seperate process""" # Abort is Howdy is disabled - if config.get("core", "disabled") == "true": + if config.getboolean("core", "disabled"): sys.exit(0) # Abort if we're in a remote SSH env - if config.get("core", "ignore_ssh") == "true": + if config.getboolean("core", "ignore_ssh"): if "SSH_CONNECTION" in os.environ or "SSH_CLIENT" in os.environ or "SSHD_OPTS" in os.environ: sys.exit(0) @@ -29,7 +29,7 @@ def doAuth(pamh): # Status 10 means we couldn't find any face models if status == 10: - if config.get("core", "suppress_unknown") != "true": + if not config.getboolean("core", "suppress_unknown"): pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "No face model known")) return pamh.PAM_USER_UNKNOWN # Status 11 means we exceded the maximum retry count @@ -39,11 +39,11 @@ def doAuth(pamh): # Status 0 is a successful exit if status == 0: # Show the success message if it isn't suppressed - if config.get("core", "no_confirmation") != "true": + if not config.getboolean("core", "no_confirmation"): pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Identified face as " + pamh.get_user())) # Try to dismiss the lock screen if enabled - if config.get("core", "dismiss_lockscreen") == "true": + if config.get("core", "dismiss_lockscreen"): # Run it as root with a timeout of 1s, and never ask for a password through the UI subprocess.Popen(["sudo", "timeout", "1", "loginctl", "unlock-sessions", "--no-ask-password"]) From fa51ff7c10b50e662ac67df384b5397b0f36001d Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 18 Nov 2018 13:48:02 +0700 Subject: [PATCH 03/60] use ConfigParser.get*() functions; drop unused import --- src/cli/add.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/cli/add.py b/src/cli/add.py index 8df9c65..243d478 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -1,7 +1,6 @@ # Save the face of the user in encoded form # Import required modules -import subprocess import time import os import sys @@ -82,15 +81,18 @@ insert_model = { video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true -if config.get("video", "force_mjpeg") == "true": +if config.getboolean("video", "force_mjpeg"): + # Set a magic number, will enable MJPEG but is badly documentated video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested -if int(config.get("video", "frame_width")) != -1: - video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, int(config.get("video", "frame_width"))) +fw = config.getint("video", "frame_width") +fh = config.getint("video", "frame_height") +if fw != -1: + video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) -if int(config.get("video", "frame_height")) != -1: - video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, int(config.get("video", "frame_height"))) +if fh != -1: + video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) # Request a frame to wake the camera up video_capture.read() From 964e96377c09d5b1a892c9eeba77c037977c0987 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 18 Nov 2018 13:49:16 +0700 Subject: [PATCH 04/60] use ConfigParser.get*() functions; move function definition out of main cycle; drop unused import; show recognition time --- src/cli/test.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/cli/test.py b/src/cli/test.py index 3a55053..e6f495c 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -21,15 +21,18 @@ config.read(path + "/../config.ini") video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true -if config.get("video", "force_mjpeg") == "true": +if config.getboolean("video", "force_mjpeg"): + # Set a magic number, will enable MJPEG but is badly documented video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested -if int(config.get("video", "frame_width")) != -1: - video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, int(config.get("video", "frame_width"))) +fw = config.getint("video", "frame_width") +fh = config.getint("video", "frame_height") +if fw != -1: + video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) -if int(config.get("video", "frame_height")) != -1: - video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, int(config.get("video", "frame_height"))) +if fh != -1: + video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) # Let the user know what's up print(""" @@ -47,6 +50,10 @@ def mouse(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: slow_mode = not slow_mode +def print_text(line_number, text): + """Print the status text by line number""" + cv2.putText(overlay, text, (10, height - 10 - (10 * line_number)), cv2.FONT_HERSHEY_SIMPLEX, .3, (0, 255, 0), 0, cv2.LINE_AA) + # Open the window and attach a a mouse listener cv2.namedWindow("Howdy Test") cv2.setMouseCallback("Howdy Test", mouse) @@ -61,11 +68,13 @@ sec_frames = 0 fps = 0 # The current second we're counting sec = int(time.time()) +# recognition time +rec_tm = 0 # Wrap everything in an keyboard interupt handler try: while True: - # Inclement the frames + # Increment the frames total_frames += 1 sec_frames += 1 @@ -109,14 +118,11 @@ try: # Draw a stripe indicating the dark threshold cv2.rectangle(overlay, (8, 35), (20, 36), (255, 0, 0), thickness=cv2.FILLED) - def print_text(line_number, text): - """Print the status text by line number""" - cv2.putText(overlay, text, (10, height - 10 - (10 * line_number)), cv2.FONT_HERSHEY_SIMPLEX, .3, (0, 255, 0), 0, cv2.LINE_AA) - # Print the statis in the bottom left - print_text(0, "RESOLUTION: " + str(height) + "x" + str(width)) - print_text(1, "FPS: " + str(fps)) - print_text(2, "FRAMES: " + str(total_frames)) + print_text(0, "RESOLUTION: %dx%d" % (height, width)) + print_text(1, "FPS: %d" % (fps, )) + print_text(2, "FRAMES: %d" % (total_frames, )) + print_text(3, "RECOGNITION: %dms" % (round(rec_tm * 1000), )) # Show that slow mode is on, if it's on if slow_mode: @@ -130,8 +136,10 @@ try: # SHow that this is an active frame cv2.putText(overlay, "SCAN FRAME", (width - 68, 16), cv2.FONT_HERSHEY_SIMPLEX, .3, (0, 255, 0), 0, cv2.LINE_AA) + rec_tm = time.time() # Get the locations of all faces and their locations face_locations = face_recognition.face_locations(frame) + rec_tm = time.time() - rec_tm # Loop though all faces and paint a circle around them for loc in face_locations: From b8aa070600d7690f0ad4b7023f4bb1ecfb9a3a3d Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 18 Nov 2018 13:55:58 +0700 Subject: [PATCH 05/60] remove unused imports --- src/cli.py | 1 - src/cli/test.py | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/cli.py b/src/cli.py index a937594..7f8a79c 100755 --- a/src/cli.py +++ b/src/cli.py @@ -4,7 +4,6 @@ # Import required modules import sys import os -import subprocess import getpass import argparse import builtins diff --git a/src/cli/test.py b/src/cli/test.py index e6f495c..cceb1a4 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -1,14 +1,11 @@ # Show a windows with the video stream and testing information # Import required modules -import face_recognition -import cv2 import configparser import os -import sys -import json -import numpy import time +import cv2 +import face_recognition # Get the absolute path to the current file path = os.path.dirname(os.path.abspath(__file__)) From 59e622c17db527c68d33c19f73f2c294c5be03c7 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 18 Nov 2018 13:56:52 +0700 Subject: [PATCH 06/60] minor code readability changes --- src/cli.py | 2 +- src/cli/add.py | 12 +++++------- src/compare.py | 23 +++++++++++------------ 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/cli.py b/src/cli.py index 7f8a79c..2c5d877 100755 --- a/src/cli.py +++ b/src/cli.py @@ -15,7 +15,7 @@ except: user = os.environ.get("SUDO_USER") # If that fails, try to get the direct user -if user == "root" or user == None: +if user == "root" or user is None: env_user = getpass.getuser().strip() # If even that fails, error out diff --git a/src/cli/add.py b/src/cli/add.py index 243d478..4fe11d8 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -5,9 +5,9 @@ import time import os import sys import json -import cv2 import configparser import builtins +import cv2 # Try to import face_recognition and give a nice error if we can't # Add should be the first point where import issues show up @@ -55,12 +55,12 @@ print("Adding face model for the user " + user) label = "Initial model" # If models already exist, set that default label -if len(encodings) > 0: +if encodings: label = "Model #" + str(len(encodings) + 1) # Keep de default name if we can't ask questions if builtins.howdy_args.y: - print("Using default label \"" + label + "\" because of -y flag") + print('Using default label "%s" because of -y flag' % (label, )) else: # Ask the user for a custom label label_in = input("Enter a label for this new model [" + label + "]: ") @@ -119,11 +119,9 @@ while frames < 60: enc = face_recognition.face_encodings(frame) # If we've found at least one, we can continue - if len(enc) > 0: + if enc: break - -# If 0 faces are detected we can't continue -if len(enc) == 0: +else: print("No face detected, aborting") sys.exit(1) diff --git a/src/compare.py b/src/compare.py index 5b24c22..dca8a88 100644 --- a/src/compare.py +++ b/src/compare.py @@ -42,17 +42,16 @@ dark_tries = 0 # Try to load the face model from the models folder try: models = json.load(open(os.path.dirname(os.path.abspath(__file__)) + "/models/" + user + ".dat")) + + # Put all models together into 1 array + encodings = [model["data"] for model in models] except FileNotFoundError: sys.exit(10) # Check if the file contains a model -if len(models) < 1: +if not encodings: sys.exit(10) -# Put all models together into 1 array -for model in models: - encodings += model["data"] - # Add the time needed to start the script timings.append(time.time()) @@ -153,7 +152,7 @@ while True: if end_report: def print_timing(label, offset): """Helper function to print a timing from the list""" - print(" " + label + ": " + str(round((timings[1 + offset] - timings[offset]) * 1000)) + "ms") + print(" %s: %dms" % (label, round((timings[1 + offset] - timings[offset]) * 1000))) print("Time spent") print_timing("Starting up", 0) @@ -162,19 +161,19 @@ while True: print_timing("Searching for known face", 3) print("\nResolution") - print(" Native: " + str(height) + "x" + str(width)) - print(" Used: " + str(scale_height) + "x" + str(scale_width)) + print(" Native: %dx%d" % (height, width)) + print(" Used: %dx%d" % (scale_height, scale_width)) # Show the total number of frames and calculate the FPS by deviding it by the total scan time - print("\nFrames searched: " + str(frames) + " (" + str(round(float(frames) / (timings[4] - timings[3]), 2)) + " fps)") - print("Dark frames ignored: " + str(dark_tries)) - print("Certainty of winning frame: " + str(round(match * 10, 3))) + print("\nFrames searched: %d (%.2f fps)" % (frames, frames / (timings[4] - timings[3]))) + print("Dark frames ignored: %d " % (dark_tries, )) + print("Certainty of winning frame: %.3f" % (match * 10, )) # Catch older 3-encoding models if not match_index in models: match_index = 0 - print("Winning model: " + str(match_index) + " (\"" + models[match_index]["label"] + "\")") + print("Winning model: %d (\"%s\")" % (match_index, models[match_index]["label"])) # End peacefully stop(0) From dee2c98a99549116c8ac70da554212bd331a6107 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Mon, 19 Nov 2018 11:59:50 +0100 Subject: [PATCH 07/60] Minor rollback for readability --- src/cli/add.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cli/add.py b/src/cli/add.py index 4fe11d8..ca1170c 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -121,7 +121,8 @@ while frames < 60: # If we've found at least one, we can continue if enc: break -else: + +if not enc: print("No face detected, aborting") sys.exit(1) From 873211da4ccf3a55a9bb5aac8dc388561e0388e2 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Mon, 19 Nov 2018 18:36:35 +0100 Subject: [PATCH 08/60] Reverting compare.py and adding new tests --- .travis.yml | 11 ++--------- src/compare.py | 22 +++++++++++++--------- tests/importing.sh | 7 +++++++ tests/passthrough.sh | 3 +++ tests/video/match1.m4v | Bin 0 -> 179852 bytes tests/video/match2.m4v | Bin 0 -> 173075 bytes tests/video/noMatch.m4v | Bin 0 -> 196972 bytes 7 files changed, 25 insertions(+), 18 deletions(-) create mode 100755 tests/importing.sh create mode 100644 tests/passthrough.sh create mode 100644 tests/video/match1.m4v create mode 100644 tests/video/match2.m4v create mode 100644 tests/video/noMatch.m4v diff --git a/.travis.yml b/.travis.yml index e3eb3ce..2997d16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,19 +8,12 @@ script: # Install the binary, running the debian scripts in the process - sudo apt install ../*.deb -y - # Confirm the cv2 module has been installed correctly - - sudo /usr/bin/env python3 -c "import cv2; print(cv2.__version__);" - # Confirm the face_recognition module has been installed correctly - - sudo /usr/bin/env python3 -c "import face_recognition; print(face_recognition.__version__);" - - # Check if the username passthough works correctly with sudo - - 'howdy | ack-grep --passthru --color "current active user: travis"' - - 'sudo howdy | ack-grep --passthru --color "current active user: travis"' + - ./tests/importing.sh + - ./tests/passthrough.sh # Remove howdy from the installation - sudo apt purge howdy -y - notifications: email: on_success: never diff --git a/src/compare.py b/src/compare.py index dca8a88..b42dc38 100644 --- a/src/compare.py +++ b/src/compare.py @@ -42,16 +42,17 @@ dark_tries = 0 # Try to load the face model from the models folder try: models = json.load(open(os.path.dirname(os.path.abspath(__file__)) + "/models/" + user + ".dat")) - - # Put all models together into 1 array - encodings = [model["data"] for model in models] except FileNotFoundError: sys.exit(10) # Check if the file contains a model -if not encodings: +if len(models) < 1: sys.exit(10) +# Put all models together into 1 array +for model in models: + encodings += model["data"] + # Add the time needed to start the script timings.append(time.time()) @@ -63,12 +64,13 @@ if config.getboolean("video", "force_mjpeg"): # Set a magic number, will enable MJPEG but is badly documentated video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) -# Set the frame width and height if requested +# Get the height and width config values fw = config.getint("video", "frame_width") fh = config.getint("video", "frame_height") + +# Set the frame width and height if requested if fw != -1: video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) - if fh != -1: video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) @@ -86,11 +88,13 @@ timings.append(time.time()) # Fetch the max frame height max_height = int(config.get("video", "max_height")) -# Start the read loop -frames = 0 +# Fetch config settings out of the loop timeout = config.getint("video", "timout") dark_threshold = config.getfloat("video", "dark_threshold") end_report = config.getboolean("debug", "end_report") + +# Start the read loop +frames = 0 while True: # Increment the frame count every loop frames += 1 @@ -145,7 +149,7 @@ while True: match_index += 1 # Try to find a match that's confident enough - if match * 10 < float(config.get("video", "certainty")) and match > 0: + if match * 10 < config.getfloat("video", "certainty") and match > 0: timings.append(time.time()) # If set to true in the config, print debug text diff --git a/tests/importing.sh b/tests/importing.sh new file mode 100755 index 0000000..3f7bddd --- /dev/null +++ b/tests/importing.sh @@ -0,0 +1,7 @@ +# Confirm the cv2 module has been installed correctly +echo "cv2 version:" +sudo /usr/bin/env python3 -c "import cv2; print(cv2.__version__);" + +# Confirm the face_recognition module has been installed correctly +echo "face_recognition version:" +sudo /usr/bin/env python3 -c "import face_recognition; print(face_recognition.__version__);" diff --git a/tests/passthrough.sh b/tests/passthrough.sh new file mode 100644 index 0000000..8822b50 --- /dev/null +++ b/tests/passthrough.sh @@ -0,0 +1,3 @@ +# Check if the username passthough works correctly with sudo +howdy | ack-grep --passthru --color "current active user: travis" +sudo howdy | ack-grep --passthru --color "current active user: travis" diff --git a/tests/video/match1.m4v b/tests/video/match1.m4v new file mode 100644 index 0000000000000000000000000000000000000000..b3c24970ac3c2387a23cd61ca663dbab337e7a35 GIT binary patch literal 179852 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%0DAdb=-MESuh>(uhy;!W1)j?Gt^9~e=QLl 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
nS_D=8q!Z1NIal(k$2yP6m^bNJh8N< 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�I;U|&-hjk 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 AUH||9 literal 0 HcmV?d00001 diff --git a/tests/video/noMatch.m4v b/tests/video/noMatch.m4v new file mode 100644 index 0000000000000000000000000000000000000000..dacd9a1dd05f4fc2bf545938126d623b0ecac1e5 GIT binary patch literal 196972 zcmX`RV{|4>7cLx3Y;$5wY}>Y-+_7=Twr$(VOl*5%+s4H9$@8A?d~0=e?|s#^S+)8{ zSA&3n5Salz9Bds}nL$9nKrEf@ZNCSzkt=}d8)E_i0f9DiGBpJOJD|2TF#>*b-XI~q zzMeM3PP>j)C0kNySBO?gFR$F0*;$F`hyeCZrbJAvoJ3CFItvjSfSrwl@xKX4`fq?i zPEkyPj+IDAUF4f-VhZ@45V3dgurW0Q5-~F}vd}RzGO>Mw7C@i_Hv@y4n;X5WrHQG% zjgcL_y^}e^e^KZyfVMW@9D4_#rM;aqHxa@#>d1?WMXP;V-K+AW8$V` z`M!vZ?2K$YoK5){-I=(*2MZICttlVS)Y*v0*~R!A z(sD2o*;=}rni%}g?YE7AlaZadDIYT{5x~O9-qy(AKU*T8lc|l3r86Hh5vMz+2>{5) zNCa@S{l1%+8ku<7+kG1_(SC<8GjawRI5=BdI{e4@zYZK74D8L!oK1mz-#r0ZIDK0< z^D!|K+1T4#8(Dm72LBIaA#%2{1bip+{{TiJJE#8z0a)4^0sl+H(hg|qWMlMA`o@iI zT%3$N3;_1F4o3e=>AO)tCnHO{Zx`Q0C!_y3W==-7rr!bCiHr>#JiZmn@8Z8@BNHPB z;Qu6JOC#t1qF6eaepkjq|6eix7j*bGur~GhcFxDb$oT(> z2DX-V-zt$az|_tZ-~!}hW&AHsC!_zG>SXF{@onw|F!=xLcGcJ-+0E~I3AABf-rQqdT-i#aAl(S z4h2VCp^})8e=j!j3rDKZd|{NJTKui`qUNdB0Z9S#6%}|ZLzx+)VP#KUZAZ89Iwj2l z9%^i~(v}b%1iD>E{L#VWEry~qt0Q?*m2B8LjULtds)Lp4 z$N7^P-4p7nNZZPBT`Z*~syxNfM6k~JRp#PP@N`$K3GSW`D9FB+JyF+>H0m(T)tT97 zddyWm%p&yHVVlCZaf zk`aFsn%NwcyB&$-^{$a)8a7P=+7rYkZroSY9mn?VG{UBePCXIwG|E|s0pmf7{_MJV z8UlDaZq+3!bc7QYRB~YxV!upX__3ezqOQ=R)&XHP4aH{<8ts5QJDyJK$QW#xa=P~1j1kBlkSQzluzJwfqnDK|?3&$?- z+HU^+cuZR>Dpw$4KDn0=f~V6a7Jq6*2SlS!R|elYR@xqH@RW;xsy3z9i%hgsirFnw zo-*2o#);49>ThRz4^Tw~i~^-lD!>cM+O?FOLm0YK$bKO-D%NvpCY23Ksl(JLcp}mY z&Tk4!lCbMZxz4A^Ey~PB^j+U*xGv6d^Hfo>4t%K29uci|l!D6;HkWn;1nkH%5HPu( zPS6Emrlj0$!WL>UI)e3u*y05^ z5{(t%(j-~Dm6Rw}2}B}-!7ZvjEW7jCWs66%%-1iBmyxw(`-{uF$%^V!m)!(xV}yy! zXT`7uZh9Rgz=}yawuW!}3lYXCV5kA4qvJf%ITKXy(~sOHS~pGQ%VxPc=8{5O&{PC*m$PDsih zh|Sh6x&^u9dQWo@-hVyA_IJFoK1LHhu~)w%OsTMf!(HEwdrGr}syQa?IEi%n$i-ea zyM|8lgwcLsrE!(N5srkX`h?=xbp z8So14Uec?h5!Dgc*(QAo1m=I0+Xz+k+82&wS&K_!BF`wQG^*=v0q;+TKSGDtnrXXe zIL+m6khDzk^$m_!Xd?T~i~JW|biHuRjgJK}q-BEI$MnNVMN7fXVDymux`v<}Z z3T`3l1!&4)%&W zL}_^90mMnB1;kwlk=8HNf3=Y=*^g|K@k;_{HMhv?|5mB=$2L5ECDZFX4@gGD{@DGa z4%0iw2z_#O3NadIF@+aKTPlB@YeOxBJfd!HhU?KSz=zwaIkw3s9K_={x%5m4(~qAP zh!UPW(ilzMH=>^)SvZ*L_QSW+P9ik&CKEcg(Ll6UT^G=}%3RFESVCkH9dZ1(;z#q_ z=gi2cJ?nU~l7&Ckjv+`H*BkCS+O+4~axb)8-7YpgXW#|`yw@fPOrP-1;nE=0 z73@)3#zT;xJ&$cs;iTdF+$&y{;gz%hZh$GKf;pY!;Gf06nqwYzs&Yg(oswy~q6Y=u(6*M8|Tp$gMqbGTvQE9vrg zgBoqCbn3WJ1_-55nsXn$k!9VqHEEM2cCWjEra_vXmZ6+!CY6#1U&PgbsrHzrcD))U zW}U^WPzoIb%^%f0%DCPp_LDPc9vb)T8G_ZecM4&qOj(C`aR}T!MC__Vv2)rO`pLgM zIB0Da#ZnX|j=p9<5}mA~%WhH#>Tp~jLaD@*IWOuQ9f;TY99i(GOfSQ_MhX=6a^$l_ ziU(d?gE%t41FC{d8?~z7+z6^hgn^TVO&N0KEWG9v?@6B5x{AcA%2dsUZDZHTA{Oq{nPpnw54$&v^=WGe(<5ie z&Z*wKbXmZ^V8V+d*vc)*6PD*A?ne+}~g&pD}09xr|FTwO^=rV_N!N^hNk!c{} zOjHpfT0Be)bmXBlx$`M(3 z8zf=e9I53C(l73i)R;*RzYub@MC(zCl$&yZt@$UAd$~z~-o0@JRruKn^6o`9QVSNR z#GNLStPCO@B-+_pY2)jsl0s8fBau6hg}7{p-ghix^XcB{w$tuCBzd9)osIrOtZfca zzon5kLG_ToA=(+e&GtHWg2>F(5}#42M>J&Zmf%wObCxIaSYC@%VSUn_(7Jc<%b2{( z82YRIIp3}x1?|!8AI$rZT=a$0&?xeKK4At!ScKc^?Q8&AS{`Lp2()daB`L}HP0Czt zMBfZ;R{jkbX_}+sp)T?t^9Tv6AOah zZj*c}PJE;W$3$O7I(gf?WL&61NHeJFD=cVD`B4{ zqBzEX6NWr-rzg(aQV%}he!SANVD89KIw=`#%-n+pF-4vhBXDV`JBwE;L)K8)U7@|M`^B)Ots+v?MKUmB3@0x=jT6byAPpztp_w z@g>iUzh7j22hSL+82|evabbbb&wI^^uH~Ct@TO20 z1VTi;;Oyue;B2BGk|0Exg48VXzU~p(L|! zxjl}#7FsgY*RkK%H4zSq0{o$pN$#!qku9G{xvF-*tYo%23n%vC=T{741dFDphJHp; zo(zJRA&~QM(`9r~fJjm>DbR9nwhY)XGYWiAIl(UQ*wOkButX4pWn10RC*$KQNvO!s zJ3J@cBiCe;de6}Aez45a02R`FM>MCcy1OocFx@_X1f_V6F<^(MWo5c@EX3!C>IZlf zp66^nNdRgvR}_Uz#wzPs)+eTPW_1cfco>a-ebJ?jX17)9eR*=cWB=f(5KsH%I)_AK zvaIIy?)@N&;eAk~Vdf}qwSh^fY0;~&Vhw5BZfw{vPSPrg;s2`4uzEZQ{@P(P>a=ur z$^;c^ddnvudqWcDK+%uyKC8{Mu0nXwb0!%-^y5Z|QF~(EtED0UT&`n9N7D000l9vm zg`nDPZUqW&O^Ohe(4>Ow0XUx7zXVhuV3psp{^_ zvM#q1iJ5wwSg5OCP@3V!Oc#=WK*!_X^ZOruXZAcL5$dP+C6I(laLby^nf(~FpDPsO zx)(fU2Yxv0pE4erEk)+i<YW&)}hirdQ6>V+kUVYKIwlu!(VjpaHVM?cZ?9dmW&mTKNUpqdYJ|SL? zTZ#VxmxXguE90Bw%T)Yu)?1@l7J-YBJEGHJ_4U%}n`CyI?q>*IU|jB*;0&0u&L2^i zNYan2Cb=7tUMEv>wt-_S3MKFqW`LN=A(ZcdZlL0Df31sUh;=d$8>J=v8*caajzQVE zaW!q29xrCq$9O(^eOUuQ{M=IdM@KG2xI2e?w8Ls&{)nA;I#+*hpv}D08@yF3j0}P6 zxcI(e z^seoHLON`+iE4f~AH!_pW3YY2$JSb8h*R_n1h?y&5{z0Hv}L#o>E;)y3H8dk#y0uh ze>!Fw zeey-JYSd~NBx4=ku^>#Y*K#bwODHzotzX&S<|tXxtiNd_q3K7IBTn^&zSu6<(CZcy z*Y>#hISO&(xQf5xXND7GL8=Ovm}F+c*$wQ+y%^;Rj$mzvo>A1WpV1S>PUF0-Vo(_^ zvZt9*D{oNxQWp}zMPEBtJ+B2|$_X?G+mw}IFW0j}BV`r#cb%@`;j3ei#hse=4F{Nb zmf1)*sMO#0Gp{gCrq3uynJizFPGd!?OnklO*r|%wq2aqdVJF`a52zW9m@D~Jop*S@ zZU5*G>1N4_4{(fY<~IPqeNMr8Gh&mR2A_`fc~}Jogpm`=Gkaua46AwRJkN1F=DZ5R zHM;qnxA8wVY$`R+YK8^#D2ofqYfe1_FhaVLY3!T-@e*jq`~bpaDr_hAjz%*2b`*8M@eP^cNrQwrj*Z++XoA z2&nDH@To!pxn%wKWlcD`f04`S!5zPwjfuMd!XwmA_-`=EHz2e#mS|e$rkVOFh80VEy^1e-#&Jj}gh4AhlzEN<*1dC7K}mTXqRJ zE$`!Pwdr|6bE3(c#eQb{;Urx=qkVX&ZGv9&uDDIJyvI+?@q`2)zY8A2UIqsS`WNz< z4`eLY)12664V!Xe^B;V|a{LRxhXt=`e!nU!$;RS+{FX$ zcyCU_nMe0mQjT_M*qFBcjNc%paW-Vr)tDP=^Lwmpa*Ba!Dx~4a;T6ZuVd^R?*0qT} ze}j_sb^@0CVCEprbSUxh3-+;pS{YPGHk-raZ)Dui@U!L1)BK$_hr?i2Dna_V#;xvI zLJB^Nw2>zLj3VILVfvR|4qQ(x?xq?^JRzU3w}M7iX+^59o^v(ln?=Qah=@;rgGw?qs1QmCwd?deB)NXLQm?i>U`Fm0TTcy|p6BRzOF(#x&;F3hi$% zw@mjXl9S&U;=+g@^66uvI|pb9T4fl*1%Xi&2#@rz)1MW%4P8?I!hAnL#vkTdmGfex)R=Wm0xpNZB^8fvG!>lxQ4O>hW?4={e zXaGNEF;76WNc7LdBWS)$B1DiW^-q2hQa=!9369x0EsB2K<>s04-_K#(9E%*A++QO) z>&-!xzbRfhLEh}HpL6#rIrXCW6}3ff)*+GkMd?X7=nh@ zUe4N6=hc#wny(`^f7ekOw~9ENOiXjE2N*!=2;H*D^D#$El29)cO_fJBbpV&J&`QY% zr{8(+-JC5N$OSA6z=vsCjyNw$q1O0|s5Tt#mwh=oppcB#Z3`+tSMf{!czfyQ>U_0^ zFW0m6-Odr(3SAg|UGz<<&T6XDxOD8~6eL6g4NLFT=ljVaC}LO!sP# zu!0iL1AwNl?(>fF3f%w5k=T$Nle|h!lhIKuBDtf+jcFYdbE#E43`H~?mOg)>PR?u! zKMn9gmR;#KLbQUxTvH$MyX`)Mjlsj+Ni5H2pSqV>)*yzA$5X@VjB}bSuBVk|DMp)` z?jN^n4Tz|4?YMD+bY`-iDZ)B=?AcSYR%+roK2ii~Z?ZkKrI)?1lC76sdlsZ)r?QyJ zkf+sHs3hk%?McbUkinvaNdT6Y3}V13A*e#ubV^paoS>(mX$B=NI8odkVg|5EMf<@g1d7C>ST#^=J zU-GSNnM47UKz~$>Vf_xNa7aB?;u8&L$h#GBY(1=>mP9tR^Jz3VkvqdgypTB)X_60C zg#ykdr&P=lD|Nhw*c%5?5kK?O?0m}M_(}mLDE^T9!EBGNMw__PT0iYm{rKc&sAiy< z-XmbXdR_#qVAcii`acv*h4mK>MG7%pqGJoYa!;KFGqN zo^px=?|S*1pGFEpuQ+DleCLT`JJ6%+AbW9JwvwA#I{9tY@U{f*I+2)8S6>a=e5l4$ z4pJ|FETWr(vCSSe15J;2lcqR?>^g^Q-{iP+DHX1s}a zs^8SXUaJI;#03wt#xfoZS1%>J)cYmkd;M~7DcyOI`|!MrX23hWEilcz0C^*3q%blD zK*4aZrO(L(tO(c7?5-7znMlKALT z7NSFfi7gR(j1NYMuwmP7&7f6HzrESxcVR0yZ14B;{LRAp@40~a2CVq)pSi8A*QVTC z>jukk3ws@dZBBI;Jf55=8rqgut5koTv$$8kyu)f793Wi-)Nauj)7X3s9I44$B8#Sy zchkkd4*x_7Hv0IM@<$+eZ2V)G^{DWvB6Me_jaW@Cj;Z16S;aIO#wdY|B0L0>h4z4d zcpr7zvPR<_@3MDwhc9^se<&ly2)Ehdsx%j$*?pm;(`+K=*c)Iqh8Nai|KK*QcX@o4 zu0<_{88ltAFIGNqop$WE3lNkPzAV|Mih7T^M>vm|iyBj}cCl#3Yx*^N!Sq1Zz-=H$ z0Hhstl~wK7)kXi8t=S7I7r{2mz+DVMTH6iy9ELjO^^;zjO|_xhi&U^^ty1jkh`T*5 z0xxlH$XGH<723(~_pXN-eSeJ$+T6jHAk0JKT8_2vPxmwtW0(WstGt$G@A4{BDpcot z=JoqO3KEM(N0>zVz0=oYXS5_rtJXT~KL60Hr^xsz;EhoufN&j9WJqe3e%u`6vm^b3bHJBdbzb=eIv?q8d^o(ZY{ZWEhMhis#M@BJZ|ttX=c#iC`}u7EtH&_|FyQ|Cu810DqHu?zRf-5 zzY(6ydj40575aV$8oPHN{^NtuC>QBh`pIzS=Je1@vDrjXid$%O2o`O-pmAah;3tSL zCE>-IsUl4Q3`eIqo_`3&HV&6RW7|NhcAVzZ@FUjJ=x*XU?4Z_rzy*p8vP7+b|X-iHS=XBXU(4w@z z8gHlwbbT9`i7_5t>aM{zNZ{6Iqx3RpgYDq~0(LPVd@`QG%h_0rkgFdTzXvr#>s@=5^Nu%~V{yDY zJ~$EhzHfEBRyG+)^6;4mYjH^Fa<&{ z*#c(|8NZuX*93cq5T7FS352+EN-fD@3^6)QV3-y@Xl)KUSeF!C{6bc{?SN$rerT4? z@V1}+X&Y1f(Ir`@t7|Obdj=Jc*q)&`(~MEMsH5GjxRhPrRNTS}9K#i_ph&Pt?QYtgE3db~`}3NT=`)_Y+q47MFw(fv|?B3mudoS1yh&dhw@$Jp4S-tt7S`zT|n6)*k$$@uG&^K3te!hj(k*Qc+5^MtB6h#7==H zu$39p$v5Q=UbkGZGX$p-mM;lrnmQu%4;po=KM zEjBSB7$W20qH}aSnO~qr!2{G8H2V=_)VAYkY zZs~+s*E-!D!i#pouoH^@ya$R~>;W|*1uE|et{s~}fFKEwjyREU+w6K0Ubx6diX0(5HpCW4d?#Jjc_-1CAa+&>@v6ODu` zMxO;%=9{;@Nvi4L7@iQqWV)qw04f0zv0s(R5ha16$jB1)I66u|VO5M=^<+5YYj3)| zc?-mGszs#d(wj5w7LAd?soqCGK2|E|95V;onL_yyN3=Dzr^ivQCHz0XdoZ3|(hI6KIR7=&Lq z-mil2cz{BU#E)cO&}v9~X|z)Mun@JE1q`X!Cd9%qW93mwEX>pEh}H@_(RjEkN4>Y{ zwac&1Pd`TK&Ff0oU(!X?!1b@*MX&LJv9zwNyEW&+m@7ELYmW%AGzac$S?BVpdt*cx z6W5Ql1|KP;{y5Y%w7iL6hN6CdFbDrQ|7ZZl*7oCqG%iuE1P4M6VIPmR=XnXx-|GGh z&5Sd^Wotbpum(>%Mt-y_;$r=ysvxTGLc4>L-#Y@g8ip^Q&?V~MF;-b6Y=@eUVQU{e zcZH5_!xx6G@{9Qq-Dx0S(PXllioW*1&x_1>dlwGJ9#nCd2RnFRd_Ut^s;x?5f-&ix zh4B_{~d0|vDXj8qReZrOo`T|=GwP2s_ zL!xXp(NM2X48+v~Q%NwZ%0p=}Qiss7)K5jxBy!gAVK}20E`PPs9ccPp8+U)jL7))* z432|`7}xu4c)g%te)uYKSiKTimY-S>%_QN35SGJjBSFf(Cj|;M5NBfT&;k*Wucw(N za+tDvm=IXj`2P322kKE>1~-@J_=$nB?yI>z*dvb5(7 zQb5JnOXWev0ex9Es7sbJzJ07pWPIJ@<5*(uR(hNbZrv>j@FLI0_NdKwx5zSfO2J9M zso8|Z;k8j5A4eolAFSZB@tAYtl75lC9t*q;(t2-luMRg-hfM1D`ri4ctoBJ{4O-_eyLvs>#J;`RT_#fNexBwpZPylrPNkGG4+yUuqMkHc-2)N(}3?!|1@I1E{Y{# zAT~39>LTYyh@uSVAF#`+!V!iB!>qQFTd6n~ob3y9Dl}jWh13iG7B%yiXx_l{5`{FH zJ6d{wZF2Cw#{LnkJ$!>M(G1o*^(HJh5PI$R2aD2cjfy=P8cQP=`3La6nh@P$Rj^F-m|B%pG5rEz+h2HfyCtIl!6b= zWpTO4kN1RQEKfoEBA+-LY&j93tuu}QEXwCT@m?sX1!?sdm2@YDhf!4Inmf*`#?Eeh zi8&@5wuXH5kr%mRU}SP6Iqug$xl9O~4PN4rgU|Aq+0UY@$&IXpIhbKB9x&!}z&b&f z9;Tp*fPo5&cEx?uru$K&-jBCX|E)SSssx^sOcj-%@(K5Y_P3$hgQj|Pg{rXyGqe&w zCT$RuRDUG9Yhtn^gWhSX+9Macv$*CV-j3;EH0K02b4=7Pk(uq3Mlo#d;fC~m3QG2O z0A694h`3L%;AygnDyNzNCmkc9SIV;tHRc_!az7E=O*gW?G_N|7Ehpul%aI(t@C#i* z|1eolgj@oLr`q8H_KQIhsF-}`VF*QLt&n0U2|n+E6_>c;iFcq?BtIG5;+>)Ho}sSA ziA`DM!ArPMjopF1UaYd@&q6fHDzzGXd-|OH^`@c$cuecY$qo3ce{6PigE+XqE0&s2 z7WEn)jC@z0Mj}8rB#dwW;JAq*s}b(jHBnp{mTG z7Xo%}p|*l`Gi_5_jan#cw2qSZr6~+S;<`MgPxC@R4ggX}z1&*0>L)4%)w=Dwvb^k35SE3k2Qfkd(_&PABZVn)0jhI0*zuRS4nX~BczPox9Hrj- zauPbYmN3)rxf9&29mIp^yd(v@MiJxx5i@`EhP3d^#?)&?OJLQ*Il+@MK3a!d%%T!ZA}qb0H{M@XUG|yQEg^wP}P2m6jPt zN5b&WSp9WZFJ|kaA<*fR%lALtPu!4x@kazg%1+LNslw&x0vfIkYKIOPU(1^-Q+oE& zj(@&b$rx0eW}=l5u^IPs#Hh?GB#U_Je~O--Y0DSB0nb>)T!3EwMc$i3;fV1Vudm3y zC*)M;tum3_q2Ut31PWq9?9_lb3wOxvT?Qo6Tb~6S&>!w@^b`u`?t7SeX&@%kVD!ZO z)nOu;Q0y!ac1t{rxt9*VL8bpWCQ6<}3{$h14kxK~Z?f6PZc()*PQqc`@jt}CmaOEX zayb6!g*lEWTcV&`JC%sQjJoU~Bfw4{_^bfkkf$;I!aFE*MK8H(as2_)3c-?thFJ*d z)X#;pz!H78ReFJRnf&JeH>=I2jc5bKiE%H8Oic(HdJ;`sFf5Hz(oEu6@-;9g#s zNL&1`^jN6b`ymc2Jo*dFUz8cgT)op)_&`-aFsNR3iGx(&5CgsFmI@I(9uK?;QCe@& zf==ThiV?GSh}!qAPe4Opk;W&uQ~f*>t8tZ#D|%9Y{RwuZ(~>M($(j=e&GB3=8A@Gc zF%8Ew#QB+y_y;EV25O3@9iv8Vb{jc1dvrLq37_?IL3I%(`0f5@GI%J#6@kH=L*-(R zug=k;YXr~O$ko%`>U*JI+E}~(Xz4_2Q@KVY8lH+>-OavQod{=a= zl(j;dfE5gRCeD>Y&_h{MvJi+y!YYlT;F65F9t`W9K&IMK6{N2?Ayf<~kR)Zr}>+@_TJzr8Xj% zrZDI-X{B4VWa>bP_}WckN5x+E*;kp~4pJdBuez;vg3DE@k?tQ#!R7gZxJ&QPi7Pfo zShAkX*>JNIy=f-0^Gng1?2iU$@{1towB!%6ui&Uh%^bt#o8qrQxBI{agY)uaQqFLS zrP9we%R5n3PedULF=AikJ=igJT<0KHYB;+eKaWv9UZAtuzhDObB~Pj0n!v=lOu@$a z9%U^^yBcq-upw1CZ2S2a0C-xee{rJZuecqcd@LGs?`#Jcw;-K?8N-YRU$;e2eUQ62 z+}55a>Wc>4+ESICSIz3dnv-OFjW659T_#e9M!7Y9!U!dyQ5Ze__3Gbg|KRghd`Zp) zjY$#Js+f&fGid384T?Ay;g{eDJ*(ouht}?2<3=Gso%M{U62;?6DLRRb(Fu$~ii^Cf zG)4!13lP~d?zs7JLN{K4-maY$2-JAW#Y?5Hd*ej?C1_lN&aBLVOzAeZ@*|YSyFlS3 zK~S5I-Q>fp)qts#J7ZLkU2J?3?u4b;@O(4M^LDBLxpFPAjDSmukwV0xC=pt#&RYSo zEe|`OqJEq26_d)V&js>}{x){FpsrL>m8Ks1v)@x;7e(-AY2x{0?`*SVOqbukqaTNo zpL6@r=$2p{iGR31e=8CG?JW{1_aD<82X zi}UNM9{d%I+c-y%d@}b}n3rR3tdH@9qHy*8X3o!pLo4GSU(6DZUu1`4i|kqs zw|7(>JAQJ%3e)cXa}vJ248r|A_Ta1p+%!IBz5_ZbK?=m3tVS-)>kzEA7j~Aaxqn`2 zM##$GPbzb(t{w$;8i3LIQM zoC|nP{N;Jv4(y)v83K;hUcoH}QnNVW8Zt}mnS-RAG}Q2k7U>7b8g5+{<&{>zA?f2O>&p6_1^b2DhiZCr^~YKr zjyGWBXZugk-Ct)x16Nj)xuY7T3@CqQGRabK;i7r2YDy;x8gBJz{&rjkJn3bYxUTI= zXO4rxIAA$fsUPaxQ>~IVy`U6eWWR~6AEx8Uf~lZ|o_WmyWEC)%57|qkdpI@U{BE{b z!7Dz*WOT<|I;ISuF#q)JJv%M{d8#X2NeZyZrGpX!!$YvVz^1#MDNt~&jNNKur@kmD zn{p7At)jZE%2A4^SWRAU^LKrx<131$pTCNK8ZLpRdlc;gav5<_5Bv;tNJ?P&o_>M_ zTZ+|lq*wg%?V)580@N6>!k=@!L5|DPX3y+qaPJb6?8q2E!W+yJ1^N_(+c+DdJF4{T zGG^)kjo_K&MbJvevqk5!G@cho%a4M8e*f?)pD=A}g@jREE^W32ZTZ{3%h`@ z;C7{OW)qSMQD;deEB`WJ^(ZF-efiEmldOD`RmKapTG;EtSQITVKiJThI{Y`z=FDe!L?l5sBF-@i^E;Njv~V6X z9j~oYNF0dI10jGETgpAEf$qw`zUfmd^-!UQ&(qM(dAYtK9F7rf=c0@QS&eu5vs5|k z4z)MZq>7Bm9aT~W#vIg)|i*>Mj4BunVOS7icr@Ls{+&8M*9wFgct=IBid;5;sDUg_=PLa?zE zL)0+t=}oCIG94R(mpAZ3(PLQ0FU>G?>jFG<&Dy`ujiE-pD9E!8-r)DrIgD+lN)S~Q zqUoAaNoMB#JT4+ z*Nwdp$gzdeej&j@rd-`mNgAK{c<1maR&e)j(k-1v9B1{1Obwuz583nef(^+H;%CYt zuW$MW2}#x+^7!7z;>QcYsED0xLLq$^5ozS4I!j^^U=o3QD~&uiS?HcWh?SYdA`~H| zdGcj3RQkcKDlQyEiSn`E=#V}*M$u+#O~q^>(bxzwFEKy_IivQ?d;h+eRv?OH$~sdE zHUMcM>v(0lVh(XhTS*$}BD!3)aEHarfO@af0^&D(aFj6aLSpLE2H{HDwJu7^W`|@3 zSfKy{;f>Q)wo##+ZS7T-uUO6Zk$O7a8XXdoX_r{ANP~*I{1B=RJDwBH_gV`X=9f1uO<6jYY^!FG zPIk%e5iBQi?L2{caROV*5lBCgcqyE(G@%0$nJ8cEE7~=rj(kU}31*L*ION=kj|s$` z7Hoq>TjS5FAGz`jqf1UZr3TVZlZ`bZ@rqLkO9@eS=KbE6vf-qRLOs(SYe)p`B z7gFDwnuPi}l_7Y*B;p1qa9L5UY}u#!Q^@Sh{}$~#rt&0l z-WO1?)Wp(iwa7yGtiD-V-WRJ(XfSSH_PG()qb}^Ep(=Z7NxG2ZJ#^KxPGxy|qz zWdmyW%+t7=%K^HD#g8_dq#07Si)UANXEimNui_4FZ>Y%|pKJkSzShn28MA~DSYHpf zf+^CXk-suc9dJSMKS`$ZF}}u`P||dh_ALE_3*hmUUW(RL3jb>`sSOCy)&Ayy?O~|d90}LmAaz1kl3J=`$?c?=Fzqhm#wI={|X7nX3(N&DY{uw?bIbEpqN$Wo^A6X7>9^m3n3@06+5o@4>zeFC#q-1C1+NzQi2RgE^ zX|pmx|3L>P8h-p)>Sn_i5N#y3`1Rl*Tmvi2vw!y1&}ku-)@{BzQ2DFXil46htgb8+ zB}2S31;+bsw;a2%a8~Z=H(rwA89?03Yj;;ypuHTC)%ak$y@YUaGWGXDc=q^K?&>WF zSVQ+x93-w&V0Y4A`UgPi2$^QiL%J~Z>l)ys9iZkHG{h)P$RgEM#@Md*+;}PV#pL#t zT6Mv`3O0Bx7TG3IAe|}L|Zu!Zn z2y?u6LSt&wif*25z@3bB7N{wF-WrewRtypAf{C~X*KSeSpzPR0DEt~|I2QU?{lYX{ z*=*f%rrLRsj>OH$wT{)qq{Dtk{^saYPgHIjG++RErtdbWP&}b;xZ|aAaTEG5X&wX| zph>swIl^0EYpM6+sDo884U4Fw+4hF{4cHc1;lBSOW&cvvF?qWX3OaRlynD9maP==&L_CtT(;Z7Y?{t#P0^0PUlLuE1UszGGgrEmFT_>oR7$@Z}Vt_8r6`b_B$1uN| zPC}(Z9lj#7adO=kmv0`MkoZtshW^1jELk)L3xYmmSwQA12*4g`(#B&vyUht~#8F3H z>`3W67bD1+o&TYWx~}l1NLk50nC;2?3e#whd1MAFdWUZ&6v1aARQWyb&?)Ho39zAB7h&!!~@c+mn!n>YO6ZR40N~$aB8N;<8 z{w@5Q`uxlHo2b}kR6VMJ8*%g2e~Hz*&rQTc&93~zR4iB6Uh(kY!03EC4&K|K#G~Is zcBmDvm(-Ke;klYBVX%)M>Z83Mg3c1ksTOFV6(Fj7ywKjqPcPUEg5FKGhq?VOiDMj( zbnY9OejRBVg}de@!SB*qKyGVY@${z8E|`_l9s!D(j4uc<+L#s;9xyWAJS1e61F6yszTx+$nk2lmVJkjxe8lHL_ zOmm29#IW%&*gmPKJR0~y@;VCXPa5>XbfC*c(gkBZ+65~`S!Di2p~Pt7FLS$+;%`qhCZcju8%_KJ5G^;}mP7cw4YM0@f(1uVi`v|x-E)t%dtyh$XM-tj^&rJjJeu*pQJN=UfppiJR4!{KKER6 zi}^>)TH(#Z#BCnQ!!fx=5u_=#?+^2okLKr`>JzmPQ-v!?bVK&Hl-f&jWWUf6^$h;; zVLvd|`CaZEk5vOo`k-yeAdO3V-d~qOf=3`A6?inwa`nDNH6gzn5Nj=3Y~OfBBh!0Q zvq$q6^a`IhU0Q4wqkWuvdzl{3a1G5JF0u`2>X`S?8~zoSDVK1zscXD3zD`{~s`caL zWz9LH7rWAJpa9fovL!eGhElK(7Hs3e_jgPspLw7=K+O~ zc}uv7j5dAJN9V=&%3j3|gb7}!i(a(*k9O716h#PE|fVa4IX`T0dDVOc2@LK(~k zXt3s?j&RD6)BBt6!biijC`~>l{&L)J8;P=aB1AURy02 zsiN=cbL0+pB(;4(EVoavM5$=HD*aTHrmsRxqcErBN{npqwivrLjdMKZZgTy|c9 zOOFgtr~%JP@*@vN%6gIU63;|T2~&PGEHcD&9UBRSM*N%P!1U*1xlWJ=;yAZYG-`8D zvCIf+(dcGvXpwQc=v|>z@e!~ZS1v(})E+kmO_B5|=M-%(*+vu&QT@P7k*k2%aq1Z= z!Z)4oShnbr_8R%ADcA^K1xa~g&+m>L#YCi>gUfPVz+T2N>*%gtz(yR6QxLCuP91$h zzEg{ph#EM+jA`!}Y50bR9ykK7>F5nI_}LO|ZyjQed7D_rnK2Lxa(`>iAR2eXhaXS%b2A=V&w)S41c?{OuL}3_&<;&FBF8(xksXM*1eMJ97CY zoTHe6*fc z3lg8QNk~sZgQ+VxishOmTS|p}s@YJ-IFUF_xM0>5Gbz374p&t?(O`eihmdi^lPmYr z%H^s(C+80bm)%xu)6IK$j1zP@cGuqIyt7Ooa?2^HpD11_20=2}8^>=vmi7eSMEVx5 z)iiW8Boe?1gFfg3IcZh|tz2j4mOA_KXv4JaBQazkwl*0OS-uI-6kbM%pbmYcr;2Z3 zPKUloxM}hZ+-RD9sAmMODe}5y**zT6{Xg(Ya^aN&0U1X+#&+5>Y^vM_ZCOlr*i|ae z^x=GTPtjR*9jPgSwv7GwUBo>&@(la-U>g!+JOwA0J3y13l=ZWuHuHQKg^PL;j0mG2 ziqi$|*+BN8Mb3n77*A>*Lu*B;CW2emDkF|~+;-fZzE%;+=#*ScZJEpC zZ4-?v>`)DgjgGj)6}tG$E)pbsB?s_oFgnY%YBa#mef4rH7XrMI7_>Rwv2>wEsrDlS zt2gStP0fqTo62LrGP7B3g!2db&!*Q;oocOXx7sVUY$bnDHLVpX1VtbJWW>@h7%C=tL?TA6wgrGqLgCGWBjkfDj`~4@ zBz-P0PUdhjA&C{X!NWi;;`kY*MLmQqGY0y{9f11 zg}2H!YEgh9^rQ-l!NU^3^7XFNiI544If1>fE#nJcOdzQ0jo)bx7dbD4dr?v$EFQrL zVJ8)0wZnHzlB=hr?B>~`yjw!Dk^>#Eerq$u^ZKT87|z0n2Az1DAtf=De}vgu%m@}( zety5`3PE0v30h5hT+zB3DW8Gdg#5%vn|9mTRR0+0S$&^G?W#Ir{po4LJ#!) zq4Y8jVJIZ&OY<9*lR&{)!AMTwJ#D^0At zE`?^fV36di%ZD=n{_pD}Kb!5@Wtde=2>lxjEZ$1>9H;!d=*k?ZxHP-(kl*P39ZrlO zCEL|eQzAZ*mZuRLM(&%-u+J%YD=ZC+q!}MWoIIE@k2#RjU>ma#jB^fmRXQ7rAwP*6Sj)xg{=50?~m8$@`@z@dgDNPh@?#Z zl8jIX(v3V>^*L@k0$B85AAJxjaeHjV-n`^{_!JmZsmpu``!r}SOHJkwn=!2cqe(0k zajo~9d=^r9l9-k1v>-?tOR8&-H~}3*eIUUYan%8N%gNOpzDTF93T6KNffhfhMRcQ_ zZ-Ur^P$Zm=;-=L!pC^}!ce7LQlFi8?hk6g}fWLa)$W2)|$8p)+<><=lbqSO!qO@Pk z6vx-~4>o`2+~RbETQF`T5!bxRiJ^vqqhS%>+u*OWL77I+HfOqg10*DZ=#H zQlyXR;1)Y2!RgQ5rM_Y17T$C=O)N$F{+BHxsdnF8(Nw-dVlRZZqS;IfVE0)u9_OHQ z01c%OZ;x0U!~K;Ju^HT#cB}i_GQOG4KBTPA$IC5KFWS?U*IG5@J9vn0dG+qvB&3z% z>r(Kz^fC1#D?ka$sLHs;C4reiKq$O0s*##=5hr}2NfXi>Ta|l8L8Y7#yJ`xrH;`2D z?PB7(T+RalCNW{1mxSGU1}_(pMGW3p37L)zOqO<6v+RmnFlcpX{y!K^7J4Jzk~U~o+|ghIw~v55%f%-vF#Epe5vW}4n>SsqI_iCQNxyQm}r_B7kGB- zNgC+$(<8{C=o8Ts=6~QsBe2L3+U+9QA3Q>Q5=_+9Lr%z8wKEQS?&~a*J_iQqEA!*& zO0Tzj+#07Mo#V|G_KbbaJp2#Ks(tOU_9>e2XmD`OCKX&&o>>UfPM;G=wZ^I_$7;6b z5dAod&=gS=(87n^NrILt+ngir6{n^`3x{*uc@=1F1aN>}i?@?$P=nyLKWmp2 z2!ma@X_s?Ih7-Y`=(6-oVZNM2_(gPXK?hc*{K6UW^agsiU6&y>fBsxA@XOIZmwZcz z)?w~=m5-!2nn$8NbNd81@4PV`k@hlweZ%Do^XDsQHnU{K++cQfaJ1ae|CDkylzp; zR41p6U-?-1c}iJYh<{_IhKWMJx-#LedsO^DZ`D}EQEfe(ej2k*oA+G!1JYCYFrQda zT&0`j!Q*0d3Gw>{2rX^mAEqgy&p-&xzqBi6db5!}V&&s995<_WSl6z45W(=3?_yZ9 zXG{#NMp@@=JAFUNXnS2AE*j^KBS!BZpdZ?g69`>!A=IQZ3Y#{@k3BV;i~o&t)bALD zdRVE_vcHgi>8%>Q!}vVs{3rif;*mc@3r%7RN8?S|bNE zA9dzxVUp$tMIC;w2N#w(FnZHUulty>-8(j1vgxM68%ebc{+YuG>eC9QsE5$MVaHiO zLNAEtc^x3mzdfpBK$baoq*BBv36$-!%(Z@09MT(C8nOb?4@156LQ z=H2iz!qh6sDpw&*zm;)G!IG$6EVVr7U}W5UdL|jn$SV|&p!R~^1b58eq{m{!aG(w! zzIlbXV0^jz2ZuqxDA)2GfrGgb?b)U2He=IQ3A?jPW%UYmtLlK@K5nAUGEcAYOP()&`1@G{A1H@Sif#>y_Zmdh$c_MSOW&#|R+5y62gJpg>W@*E#+D}?GFFD)vN zp`!g>?jq*Ff>)N8payz@wPu&j-6COIUNW5WO3e1&n4d5;dyO3#-ZxMe5<)YlV_=_!HYAuMwvP$XwH!W`7{K-uPmiHoCvZ<8sEUHXRX3Sp$3Se zDEd~*YZFDixh4eFpAmLO{zqB8@(!rq(v5X= zW|rBVP5dyBCI=Q^_zQU|cpGXpbNnYMpr)Mu1}`^zHmGMbFFHt&4F^STa`91z6l=jp z#uYFR&}ecHTmd^x+K0d1GD1pt5uG*kodgRufq$9nS-2fDT4e*4N~@^=$UNeQ#-s<2 zAqcw&z)O|7s1@`R<#Vx)dkgbHvZy&|pJ{U>ni_3{%9;(qJ*KCGuevwpZ5D+Jsura2 z&5*ktmW_I#GMMlm=%mcx)?Psd7#G$2lQ(58JA9LPEu^GG`eljsYHX1otL)gmKW(^( zXjfRhoGM|Yo`wB`2dN?nJu=ey_c9&E)6`Vq-tY(2M3{-Z{GSgxQ&N!iowl=i5TYMJ zg8z23VKZ$HK89&UAojDUF{l_Kng#QSHl7xJ?Tw)^{g$8ia9kaMav?tP2@Rqh#g_3Q z(GMq~j@QfuxI_4{>qGZ#J`{k`dv`yWeEOg%cOLUsvy{rRv6PZKT&*F- z@JKRK@aD+E+hJg9h{(gct39)1X_6E-Pw^^udLt|F_NQ>YB<5Jy|2=#13UgyUrpO;c#UEi13k z)tE0Zq#h#n5y7_Dib-J6N~VtN4Ec~5VH?kK;r4kXZYi;bN!{1d|IQYvjpO^jX@8@+ z8@YTOeXW?klfy)@f@!@%#+KS9bQX6AgrEVgBXk9cq99y^A zOI^{0VJ*6SUD`B1Fbi=`WSAW4d{-m>){pJawP>g=4gM>y*qiX1Dv_tB4RU3Ii~l1) z6lo2p(~aD8kC?PUXcrgRJQy**TnKV$`{_~cth6`jg%^`Kb_N_3%;n>5wl_$7nhw4u zTwxDFm}QjmsVBioX!8uMLo=q};u=;QRQ)H50Ft|+5t{$C`z&q{&C7P%AJ;rKO07{Y zxxeciDkz%XYVu5~zz45*F^L7tN}P#G08*6hv9~adf;~mfX?A&H{~Ef&HLIdM2^)FI8t@@ zUgwWEGNuw1dj;p7qcfn}%_l%(S6$$~p!UcSq9Ax8*=hVnx*U~E)Qdmx^5Swe1MCqP zHf?8nXr&UcNlQRV`M9j=Dv(iJCKhR9{=Dk|zQ?=Iy&@_4cGGU79s7ZkfSKPBmsX*G z5p?W?g~EqzC&U?Y>NOo5r1zsQ=2}Stv|PCuGVN7M?m6cxf`NFtUwUYjT37;>xMwV= zR`4=Es)9{5K>{St?MeB3RM%`NDwLF4KJk35iz8+v{_yTl{sYV&`TB${nbdtlC%-po zzC4b>?n}i-dwYbfe*}J;%DtUldL$;xdr%wJ{MOON$M}Us~89xu4ERa zQEzizSCGEz>ny%*Bc(BFVp+jIsMACe2A`9r=ot)_sL_`f%8~GoFDZ)Tky_1IQ|VlR9#90Q`UaM# zAb~I1T%f&!yS~Fu{HmY-7N1W&5Ga7@t;1e4XH2N`yeE(|7#9inhctJ`JlURTzC?k- z&7lnwbg#4avN(0xD{v6|kB)BaLm{wasyq|LZH4>AVs}6n1S_FivD6Pr58G-tEf}XE zF7O*uEHj@CrtX{;vspTp`9D?_u&nrA9?`=usYOY{j~PKoTUo|Xi90fw`;k|at9G){ zu`l1Y`-4H<_h$*ldPLDN0c*;{V`hBLk`cwd-O3Mu-NEG!{<)`KpF;jA^}Vr@A?e;0 z(EGln2YNUlQ#m9vR-%6~*CpkU`s@Ba&Uel7^(!|6_{&wU7zj4_sb!Zw0u~>BX40C1 zpRZ#3<@k>^2rF)UewcNkGe*`a*k;7;zV(lCGx5=yQA5TzYoURz2LFV4u=VN}_wh4@?HB;0ep3jVK>2 z40drDx~h%O*zRrO*@vI5+}EY&R*-}PLYb~DafBH!qsQlv7UXrcSBCd2CFEQ#>AlNM zWTM-@#R~eS^3ipgxeyNvLicx} zN1PfGH+R^X)2H*a?*ig&tMG3fRq_^V9-J-~;NE@c+5A_)#Z>CLF#lJ(QAsh2Xwo3o z`p(E_gu}ufKwmk}n?S3^0n8NIEf(+o#M&3th~wBTC86y`$~^~e3DRSG|CmD-!zXn^ z5;o;@EvOavU?+UtB#xY2g;JTv`{=3V+PzX0m66P+5ZK+4sbli&=Z_PAcxyYK6<)<@$bKSJA)cUz_P-!6<3TxRBXv5idrC-hLhz+5wiMr&;Q`Y3-Vd ztucT4ispl9&;3SZ5wu*H6xES;$*|P?LT;S*(SfHLDd-Ux-S09n4(~9KyU@;%w0V$O zIhc4OU;jOFn^7xB{b@_Kjw#Z6Y9xo^23NwAYfzxH+wfiW{ZgnXZxg*1O2D@;w;!(t z09nzf5aJTpqFhx2(7@sk1S3bxMB1p`*ALk!V=y6nu99K^W7m14S8>eWV| zbID3ZM|6Xp7Lzu`1mb1`u+UmR#ug`+854%rBWzoaZ`N{!%wj~`!Ipaf&Z^pAC$51{ z#`0TLnCN+q&db&GVL8?8oy#b;;QhD1Q)2-QELY;uf4!DGKKYa$-k1N=T2&f8ITV}P z5wtZejm{>8z*87W)GYIKL(OJ#WS?Ra>MP9MwHc;;B7Y_2CO!rX!`W>V_I&p@#+f@4 zM|2Zm_*7*S=@xS0E^q$PKUT%rP!z;|0x|Z0xf)g`N@7u`)pA}O1wXrY=T=3z^}!H$ z4@c3k{7U5tt*I?n7~+$fjaUQn-c*!`wbIsxK4!_Q(%2T(kE7Ep-s4IUW91sp{Fxhe z6NV9hVYv2$B&RwrgpR`lca#y%<}@Nun!g|fAA=AN20^7ZfBo{%x6OC$3%$Bk!FsC( z+muE;Ss8vuu|*qV!8qwx#jtkltLVjq?E^IE_2jZ~42$X#e%u{Xb!QBuDyF`GuXnaVf2-Q3}N?GXkq z$*=9(i!QCGymQDWy`i@d^5)w(3Yo+2UlNvNT8;xdN?Vc19sDl@VVpiyK;0R`Avf7c z_Xgyo;KdZFcQ9=fm4T&%#H=;&5ocSNZ?E*5U8*i@{wxjC`#$}aY+BbWyNxr6l+SfJ z6I$ouX?P-D1yD2C@Lw43L8g8yDe1xJHnM(ZTG%$1epUwzaXFlAO3^yoFR}3c6UtVX z&py2k#%7k9qcWGd;*;T~Puy)S5$ewG#@m8gD5}Ljustvk1#ZNCK$RM-#>FWi(j3Xt z32g@p(Gy&K%+G8#GdS8x5b@Q!s^U~nFuuDblO}w@Qf&yN+|-b%>Z-Qwm$xoVK8FM~ zYs2ms7}=f(79lfYcVSU;1wA}D#zK(3Z6;eJDk?9J{BC#$JHe~1&+l zkOkp^H}VCl=8W9C#K=v$UbqKLo+uU5H2!Ie(SM!DlJSJ&pXztXVn^$paS)uc<8X!h zdE(&S8%@t!L;6a)pWn2DlDCV(CYrygDW|qPwATt$Zp;4(9XP?|54|ml@hRD|C>d1i~QcqdN&R zq8FawQ~VU(&byuYK<=v`tW&?WyPI=ecX zhXK;eXjoWrz8i<((7s*FYyhvQ(yCmMziI8fJ;%1;*U^Z5zQS93rMR9P?8I^Ec#yEh zFx+p=OSc|k!ld&w=&a``*UMMNJp?>6)wR01%-|RTK8@Uk@iN{6xw)@-BDB}WC>Rs` zwA1vjuO=ENw3R^#@2Rc)^Jjb8wk#5(SF>CkZpG3SD_5$EiyX5`==8#? zV1Zxf{cP;H3bzJ^Q?F;3mO$XWPLu^;JW^iBa&F^ovnovHg*K=XL8}AnZs5<3Y+;sg z=bVR=s~CG5eF_3Q^A2wE*9rv9{Vu)rx^OVC$ti_u^Lpt#Tr`PG&R@MZ+@5v05&4xG zdvG$U?c?W)DOsu89_D&|0m-k!mStAgEQl!!z)h*6e1eDItVy2*6Z3%r_&AMbS}AX; zAwAza?#4zu>P0e8Ota7S*QJzL-cuk_xfcSF=^pz zog7BtX#6Ll42R=l{Lz3~Q40xy)aW#qShfv`Rc$-?Q&h1<+HV?qze0|QnJ95ohOWu_ z{Nw!oNTHe*QWTg&v|(cr1z5w-h#1r`%BwY)78j<|00!>eW&tCKXA&yS3DAk@^(~px zbzHOb5$R7r=)l*IUoG$X}|~D&#{}IUaTP${}&X#RqK3 z+v1!#y@p%@ZrQ4aBrd!mH~gOE6Itz>xg!N|2`_r7J>b{{H)D7+yYARmrS-_J3K7qA zp%db7gZBqw`U;wR|BSD}xjD9Y#o(!o9sk!sUI7C);vn*MK(zu^_5j(dByFGSXmmlA z)6RQ}l@19wPH*?q2ek$tWEl#t$!qus<{fq&;1>to%aK===Wagbe4n~}ud-Sa&Z>}# z(6k&3JcAme?4=p6xx{$fBZl1W)1<~D{yy9vk%X`)RS8;klF+0lCpu=OdP?s6U_3aJ zS7?XGqjktrF~Cjx4f2MXRKPy04V~-X8>|ncVkcY?TmoM~>Z&8(Q1JQGl<5!EG2AN1 zTo?^i1>SVYKJmp|^N?Vq4?4yYq}(_LHgb|#E+wjgqV4xVQ(Ls8BSh`#P(-68_^~a! zxIFJQyvSB1B^donxb$tqo_ zDC7;bOc3IsIZjjeLP>AyQL>3fm7|6=gE%dLIY>Bgq2BacpIY5WbScEBL3s#?v#M;J zg=@94S3+G%I@Ug#!ipO(*Jq)?Q`xQ8r!uiC>UA{3Aacw*hD~yDl$fonW4Rc)+SMhw zX61%>pPfmURLN?~h?Y{gxXS!vu63zqX33)nhMH=52^-$+tGn@bi)L#o*h_|k6L<}t zSyClzD%Og*2RB8X^qm|s-DFaq?hvrxu?u>9OYK0P^ns9t_{GH^B$zfp%u6Ze0w^jx zBtbSdWvv^)&vmL`wKL_r35(R3J%5;dA1Gn7>S~*4K~2f+JF;#& zbMbmpIh8{#{U=fbA(oFNmnNkc#e};W&bD?*hXJLVXfs#_0zXwKK+=MM9_xF_nPm*y zq0h-<|M1%eto4v|lFNyy-ESfhP$G1{qEb0Tc|>Vh$MH}92iU!D#bAQE4`Xf{MmzSW0$Nvw+! zp!j-dJs;T+Y9g5U1u$zdkU}YgA#1gK(0y0Kv4IdCIuq~5&0i&isvV%ld|87joT<+29}Tr5x@#$r!~RyeQbGZ9e?7{}eg8)uomV9Zc0|;a}d! z4?t8e$<+pV3HvQc=v(y8xHd?JBP`<^3qSdb5_31irxY}tm#%}X9W<^vt z0D@$*dVy(B2~p;x2=Dny5y8Yk-wm@ZX1U=lveIsE4F9NE*sT{Ciby2dh3x3MD+oaa z*FBaSxKSlG_K$coX>VmzPOi4W{-_Z{eiKX3|EYTNCld&M)~0#Gom4F$z*66{`>-Mx zpB(Z^gQZb4p$>ISE%cC>14PJlGb=fOip$JptjV~;j#aMQ$6@fGxK$0U=m?0Km!9H< z8#U^qaMQzHX~a2%kmYqSBPd&Hd z-VXL4UOJMEkVsZJd1KM}`*iEqiVL|AvJXi)}M3kX(_p3!6nCWfbc*7(gq z6lK5NzZV$-wcU547fV_jVsT`XWLYir7kX{*%c6TfK)amV@>Rm!(YEdFX-(9Z6v3>)DwK93Dfbf`FSG{2R3t8%x zmB*@L8>5wbISgx#uPI0ln2yxcqNl z%)Y^!A zan4y|7gmJ%ui4)-%8rYjUZ;>LgKAG5%q5-ICW$h!@a!sqODv^s6rj0WN5r&ZFdX+5 zLb^a4gjOZYoaWXmfxCqeraCvQ_yWv$h8SXX=5KN(5-T+2^8q4k0iu?bVM|0F?!bwi zS3*355nBuSIZu{b#gRcOw0lm-clY6YbL5)iP@KYx#1IlbZ+EIS%w!Jr>RXx5*Z4~&6CU0AE%tw2h#R}MtAgQ)+W>n&%paL|?5BB1d65o0t{$LkuB zKA+UVdt#x1S%hoZM~ZDL9;F_8p~;?@0F-PnW#RS2?B1-ox~*3#RSJNFaTlgvPwISrf(D}va7)uF_&%LJ}MP5+a{>Pr3Ke?HbPax!I= z#sj`|MxKSkPyeYHRzL>e5BExz)31$E!c_Bi%sXMa@N@FIDpHnh1ZMN15q>c*au8eT zt&1fu!U(EFU;O4vz&teh>F%T6+2U#3&E4r!IH;<9S`ef{uQrhPr)qn<1D99yqpD&% zCW+L)1B*J&@K~;rA&S9Xo#@b+&HWHOp8v8t`v>FWY3rRXo1Uz=-QNpl3$QDYkv9Ws zS?OiEw#4Pz<{0QPYc-v=hKm)%f(5v&0OEqxBYXyL@kRPmOT6Q4Uc0MC3rJU7Ybg0`nqbrTfYk0_IFQ?hNUqKO~3DQ1P`6YE*xfDyYc0jb|L>2&T`!9)ItevG*!srF|+# zFua*W=W&a5Af-q{N6IOGbh!%>s7e)&3n^jCP&HW1Zb(dazmxo{gpU1{A3M)&q}S`2 zBK*P0AlWz4ol$irdAjbjOO6SCv@lK`B@BYW$Tl7UkmEF+b@+CAp)IK1AsYU~o+@E( zMGAkJeSl`b8yvvcE1TGKJT@@uFGX~Q5*u0Qg`7Sn;&LNw!k|b;zPxOgA0*y$QCzT- z0)`E@j0)B+dWvBI!~yql#UDM{+=2CPUvYL_N1oxk&Y-`MQsnN?(?m_sWQ<`bdTmlf zfVmikWTc8Z!oiGLH!t3f^$1Tzd?L~>KcJ;1A*Ba&kIOnUH6wFWcIaCpOEWeI(1DAjJ`XgUbU`0}{Qg3(xzvJf(J<#rQ=8 zIx@dMCKbtq39;)H>BHjZ8DC{m!Yi0Dh8K0&!9Mut;|PD$i6Kug+V1s?U#^g6Sc(L! z1;2}cV?kU-V0LXFR{-|cl=6;uLIff;;V4QPUVgdHvSD?rh7|NPrOjj42bA@hq)ygM zaFd^tQsiN|lAI<|8n7~icfRTI0@1VQNze4<*u^-8LH?veST{ji=Naf`3U@=M=L4oX z+{oNaeo0>~mG9Qd^?}2;wH=sB^31e>FN;bL2z51PE6u@(FOVC+E(D3aJ~)_M83|}JtIdq*t>13SZiKz_C%^U(ZB0zMdOKzv zfUa4(Af$;C`N`Y4S;?bd!*-T?2=JG=;UHL~ZDv^~i0Gl;M#ynnxH`1P6e?PZ2ERE7 z32OFtp_Xs0iHacJ23pGALpdBc`W-`oEjc-&GA*gh-$f$G`avpF$)9vu^kci1c3YG6 zW7eP{eeME87V(!D0TDf13wbDn`c(8_oHJ)m!E^d)#U1R|L^e0Ai+!sv!TX3h-=sdQvj<;A}`G7 zgFz1pzpH@5yL3dBh0u#a*FQTJ(Nv&;YINi1b~L=BkrTSMlBO?)teT_Q)3*v~#LIaf zaiF7QY^(gz=_`Afqr!Yo!y2m~sL)l=Or3bc!M*~7T?mxYJFShZiL$p7Ntp`0p=E!{ z8Eys~hryPS&Fe~ETC9uavM`JMIYIpMV=>C7?J5vX`phIcP)*!7>?J}J+t z0KJYIWpToiF)we`o`015klDa?0PU>$zDx$bE4^-d&+pRjF|8jZ#^Ug#xP-=OVY)a4 z`sR)w8=co2!ezNImryGH+?@piEZHA@npZ+(lU{uCkOnSxTArK-fr%0|yf1qex$y1&+v1%#k9GIJv{wBd|K4?j)VY50 zuHbWrFAJ00q2L|VpIj!WY!Y-=ff(sbeG_5cO?-mI6bUShilbh?%-aBN`bakek^w>O z=+8L!J-0#Kre$;(5`RBam`gM)^eGe+M^dnAZ4^Uvw7pyy>9M0Ii_pm*oCkDzwdphb z6;tdz#u#mdJA8vrR(3RvqKvU%=2$^BD7VA&-Y0m`a)+Nr<+eq&7egV~Be#mA?WaRy zL1stQWbOn9V9)e?L{{IS(`o>x5so(*!4*5f>>T9&bHQuz0)A+D)>P1f! z=Z3CoHxEhpv!#T?8F`lE3%@<2>D+!&6j?l_B57&ZpzwPbvRrs>`0|_!(t_G)VQ=OA z9f|5En2W$1K0X^q)B+4U+4DA*!dD)DLD5-%TPv_5lH?Kz+CU2~Q`d0b5avLB#NIR% zk~W5oh(@5r;K5E0`)DdJx<4t|4IbCV*8gFSfJd#u*>lP`h6_x~+}F5nY<2bfemeoX z|2!80XECvSN+cNH0wnfEd5dKk3P|0pH1JnJB492CvIr^XPu7GaZrOBtsrK!Q7qg)> zQuCqaTL(GFS8_$A+A!bhE%61B@997iMYD1gE@e)krsrNtg28kKxv3i$U*SQkNOz@I za1MO1!k-_N26p!RiYTvw8m1(1^LG%I$vp4xeh<~x%K5-JV(+O#MD7d-lm~!@b*7P= zn93VjfgasMXJFTTMA2&9f|uXfm;jN#s)+xmDt)|njuW#JBLniUUbVdN3Cw7iI`2(A zASCN;qol;h*~xF8ET|}6fHgb&wfpPuDTq&J3TzF+wAD%YqM?^^@@#Yu-$iCt`h|AJ z0DWCoh^~RVrHg7%=812mAp^*;ZL5Ec8z)4n>4PN;Maq@V1E`T)NKP87lB{zpb}q$y z+d|U6YJ7gxh!y{;$uTBAgUmTAlamQGDDA=*bYgYcngu=Km2pN2vHUn{kz%NRlHK0C zPO2aiY8%DPq#kMl1k^u7C_uG&c48nZE_2YMX15JxWH=88II)|l6(=9AqA_uoT(bAu zXWFA98WxDu^Q)e`s1UNQol|InIVP$q_~kSF^40#w&&t{q%EgB$IG5k0#HSr1K@Df+R@V$1ONa$5X{6B$qWRv$dG|F=Z9usPIbU_$dLDgEg!U( z5r$H_xKaugwrx8LxH7{!czIh-9)o{GkJk{_hVieK$?k#DF^Q!Md}uze>rhLnWSZI1xE9w_oXHJF&O9Sn8H+7I`SC1E{-EFKiX7 zgRLF|8!fiTk#5Aoe9O&o39OB0^$-@Ny5qXs@Nju;Qp*E1&0(sY@0CnRh)bxB@4$C> z+dM(lE3Soy!e`Jlr81gTeT2ByS{3TWjJ%<7f^sr?GzYgFQZ7yn(fEPPw?YRu?_BHw z&dFa6Jw1Cz(gzAoiyOJcZk#L>lt8!xJplOAZ1|qb2KW=@IHS$>ej}O8jsOF!L#bPG zKSQrTmL5c{nkTtPF@&LFa2q#(5=VR$FX{yMG!~|aXb#^u;i>bZi<@FMA)zXJ11Zd6 z*ypT`%8Ti5iwpdI28N-sGO~(eZE3NAmWLF_yG0pC4fGfem3Y_6+AgC-b9du@2Aasg zQ&v^NR`*y&O;3OvKQ}l(DCoNn9VcwT9qlWK*Rk$$0E*XD;=S12Kaywosn@=eUQSh< zk!D0Z76s=zjUy0D#nI+fqW&*({p!iRKt`6ftbCQKz@em?5F_9>js0%}Az0Waa{h^f zad`vD;Y<-{@`H1fIQil|C|MA@#cTN4(2yr#BPP`pM}?;UOroHIvPw$&_AFI3FeS3M zJchS)K)f8kN8CzQ9C6dh2S~X}6U%`-TqgrriLM2}hegp>HHfw%n=o5uN`r+BfiUqM zKKjN_Z12C&fJr=<_*GyJm`mX_4=Lwgzyb(rh?ZR`A2t&qnS76rZ&5=|&c9>sBIzut z8@s&Pl%*TEZ=#`Vu@2M;ri!!`{pnxPOJg}q>kJ`LtMSOK2cKO~LE16WK_auaOUOum>G!C0kVi=I#8K7OR6&pX?A2JLb0TwQwR=ZCs=hR<`F zJ$}WAl$vG$!9eM9e~uzKf=tftX@8L(i6&0#Lw*M8^9_yK!lvU+61xdGFL_|QI)nQ) znej*CIWy0NFy$Kud*>?sm#6c~EBqfXhw?{S~)f*T2cH|AznkV^o7vZMGMnOc2;){KGq+8qly0Fa2clo-JT2R)7wIpKi`=N#z zBVny3{EgTEG@x%mns&kHTk5e@D6(em9F|E><#M0cbjM3sBfUOr4^~l3R*kg8Y&9yH zm-0gSE^VdeK?i1d$7oe~fct${@P(frx+zJ?2mM^jUloqODxUve1^gm`%hnA44sLyC2jv;Gh{U6MjmKv!)k#aBbt zKW#Ik{&@i$v<`RqV~L^jp?P*_2*#j_22?t{Td~F1GOcfP4e!~dU#K2nE+yE1P`W-V zL9UR=0fL&vzm=Yh;w!oRK@|@zFL^bCKSVJnBXB;ef7|A2;Eify*zuP#wqCM@@#ql( zhB%)1zrV^JWd{ae3@WPrNQZSHHXT%;_5NAGdwBXKaQqU`{v$9;dOjO>kiD%0l3`n# zf_wQPU{XUEqlYp1Tyw9P@Ta11qo{1+JfL}*EaCj%8nf?pf%UmLdn=Y^KLscztRr*upc((3^N zJ$nCWd#_gdIAdJP=D=`Q=^uFcb(kE-n&*t={l>VH)k1=wywrK zV5|k4YgW9RfdmsG2pfEh^A>eJ5T!WefTBDEl>fqKf7+wu&e-p(*#23In4ta{*Gp!5 zv{5u1lpkQrLKA+SXEJL%4p$+wXj8w+5)3ZB2InSI|90kkW7}2kX^-%C{pAI78QnCZ zvwvdcnz#(%kIV1Dmm|gCpd(+8hK@AqvBV2UjLc=Q)!kEpDxu%FZ#XRlYHH?B_>-H6 z-OLmlP8K>u=GVbx;9c2vHQEu1z_43QWOxHHvsiNiIzX@t(kHEUA5fJBw+a`38QQ5)zjt-d4Lx=Tk;{~V|| z1S3&c=;s7%Ke%6ngNJ-$sSsN}i;NEcMbP{rQvXAY-*Md&rRUb+&29U025V&3pdvjT z@SI)U0RS)o0YFi(0@?q@CZu2{SBO}?fVQ?4nKA&7<}9?%33ROjN5XJY%BzJpAaTQV zzKUe)sq~WfH$}{2Iej6TP0~k@$P~7z5^yONSDmI$<0_X(ARlwuf(fT-)$ks%IXZiY zE3K9ho`Oa=+j|yLZi&uqcrAVDfIhIHt+Pzy3_kz(T}wVYj0(n^e{r@GEm9&LMxVhq z7BPy>hT;E_^_F3EG)>p&#@*c=f;)uZ?(QzZo!}NAIKe`KySuvt3+^t#-Q6W{2JZJe zf1X_VMXjn@(_K|9yQhbQwV>m*-s+UpjD}L+zUvDkr`?9tSf37abNB@=|8{1r=Z>49 z0VD<}bQ?nVUXoEs8QX)}^_RrJ!NO7HI6{kmr9uLmVmulG#UNgz@b{I2mH8aR=m1NL z;olq!D9TQoUSIqJ+4O6a&XXi+7+77MppeXN005~$%lSLW$RKpMa@n#cBV&3AS%)b2=ge;&(Km(M(ihWw15!- zz)0V_5q6~)eX-lB%DGFjh$)|$X9&_cG30-(Kkm3^8->REH|YtbV!?PI^9aOVHn_f_ z#-hiLlp6sSga8Y3?-tmyBs`(-5-J5^DIq7sguk>+hm{EarM?s1^+nmV_WThM} zMra@1|5Vr8WNC*M!B8q{OaM0M02{k+Hqz;sFgs@*X;JVHC)yga2Ew-nJ^tSHH*d5+ z=p348Pzl!qXiflq`;JyIP1YLl9C#&}cMDc?Nb@#Z_;ZyI_l1i6Gid`9OaN^&XUK$% zZcMAf%-2ppQ5-Bo2Krr5Sfj`3oYhV>QM7cNwJ+J94X;1p{E~k$A-;_9^e7eK>`d{? zS)OMMMAqX!&iReuJ>Q3xj8hr==j58VrU#x`hMN4X>DfI@^hknIEI(M!-yMR1fz6Dd zE#%)F9d^~ph^3BAJ%djzdeNi{U?`WLm9WAZV0b&fww?ZYBO?je;QG(T{Eciy<;sK< z%CD!~)}2oLq&DKngjeP>2YrNgcvOfu2E6V*g+D6Ow!SBZytP}Oe-AE?gFB8`{3Z3L z!2?VIgPDxPyD26Q@a_eVe}?UlJ+PyB7f_Sn+C{a`t(eiTe7_64QYKjLRI-jlI61uv zN1j#ffjoXINHQAlx~z_BpJ*^JTwQu^w#M&h4aIucE5D>caA)ClbLSFnIs{a!QxKnm zURmSPWcD=ZJ&CoeuH8?;Rubm*oDP{C) ze?aR&I7Mb#h9&HA7XdmN?WxzFaVOcz`LnkJc@EGGBX8=w5&I_VDb&87d9b6f}Y{ z*edIvTNJYm1-W8H5=>=3q@{zj0|r?gSk?T^q8LULC%#b%Qhe<-eCPtyXu&dc5~xsr z?WM-k{LayThJQ>2KUxToX)gq^WWv`9ht_z2>d8RHHs=7C8UPo(gFVGxsn$AdF^!W6 zewTGZet)Q5s!divOH-ns8Ds&FK%eXM(E;I~WKM8VRgfHjMC~z4eoaH3g!fs%5=Qxq zXEpZ3IE&5;UOy*Eg?bQB0Ww@??oB0i@cM%TLlLnN1uiU(_t-;Di6XD4pMNX}1V`qt zNT8HM2B1rXQ*?XG-~0N%&W3m!R-E`5IMG?5zPZd^dBK1j3`vzm>Cr8TX2^C1dSLWe z*z#TVyJ?+boh5X(Bt)YB;@xOhW}>g=3M1XLv&5gRB#KQJ!yVVmGYx zI59u<_*op*FZ_05F0qO`Y~7wY0R4#0mFU`$oZ>@p8=xu=S>4D9?;+h zG_c<_hzc8y>r-HNWJiohx;>U89GxfS7uiu36pOe`wJh0FaxgRvKp=FW(;z?=oq#F< zpi2Fwnob9zs*yIH{`Dq`W8^Rbs|Ca~fSBuDtYWqjt7q!y@oSc<@r#Ka3k$}`8U;g4T4PnKVok0C|YSgF4!yDIe#by2q7#X5Q;P)#s`dq{Ac7o z{zscHHjoI6j2@97FCjn*)K!~=cPWRnNY~Q$PjY!ux0&P_S`Ki7Zc5q`w+ee4vC+L> zFOb)M5O&gGzdZ@?f99<&0;y+H@UF|&%1!w~#*iQI$xM8tAic+zjxVmZ<-7y%0KmD7 z0PtI1HT>rY#Otk?9q}qN`kk$fD66&v=1362T&{OvfMS zrbz%t0+!(e{pqcQ#3?#s?Tx8l9P8(vgP^rQD9U1>KmZ291|Zn)5Kr;0{wp8=fELD5 z1|(&|DZUU&q>Sb7|1f9)Gz1vK9>Uc5rnk$4d!1}C7UCmhRIa6<8xb1?UG8a}^^*R- zaF(Z1cbju!?DGmv0i1)s{qn@|TjyWD=0~OI#CbKwah9b>_V-6~+>94>)O2H3alFv? zHn?b4JBe;r#6xkoniu1}Hgd-t?WfF#)1XOE5grI{^efAs#N8@#KrAiORkx!D)Z1JO zlQ#*GLRHV{w7^$Z2r#b$eD#Ghf)WIjgpqp`{9-uD%o>^O1Ztsy8(d9U%GL4%+2Uod zwbS(O8nlpWAbZ10#`)EqRDO?v3$Hzn(au(NPdl>ST5bqyB$Egw@M(dc*Jam(AoGBx zlE1}6<$No##9$ebTyL$OjmBl&YHK0kAClnF4O;}lKn0dI#{Y+qct;SrM}(nex0Hv& zo_r)&2Z00W2SWrPfN>yF;~l{P#@)BYYA_D0>>ia>%N^EKjZaW{usxfNvIA40so(nn zb`em)1ys!6RMP2agnnBDfj~&!LWGBbZxss&gh;n{nTpvM>8x%POxS1%{K{Z>)twSh zZF)M%gCM2=94UYcdB-Uht0LFq=L%gzxPuL}%&LJvdmJDzcK`znW|0MNk&w;4);)N! zEmst&%GnuUCRVW~g4qdbj5E>{EsE;`kU&^PHoPO**t}B)4YvEUOgH^OY!E$YsI{2$ zqyU5nfb_jXnB4ceuftHPHS>UV4-IKyc=#V6!rsbAiI1>nPg z6c3Q@zDu#bXjVxvCJU~; zaueTGi^z$7?nlGe$Vy&uPPfRc@ZzLq;$?HYNQpj@>M(g=C~7@q>lho3Mf{JwrxcMj z$9E4nbSx-8RrKS?!A^1vjfqmD6#2H5?}Yf#Fb_zWW`EFr>~Aaylw^Rmv~WiL+*^YK z=^c+~!dd)io+y^YC4}XBxIgr};o6j)hB{56S(%CW=LnPW(4BZY#P|*I{ZZQ0Q5`~x zMWC(5dlNu_mjcFsd?*ZZyEyIhp?TL{Qrls2QWYjmcQprHm#KTN0`lb z5nVPQ0SZBR!dnl$6@nqiM^hdB{5;LVtarqFRmB7l1@HL=Y~p@+|2y_uO$CCYyy5-t zDjCDKinm|!)5}}gT&bL0J0Xr_yu6{y79(FBviuq~P!^6p{YM634^RYBuDtJEQL&&~ zo7{ohR0)Tg%)RD62-pe$d3&b!oGG@7fy0;7*nTh&ZMa$-cY6;T5H?T{-miHX*{2Woe7; zV?J=m{~u_3a12X z140Gil!~AK8{akcX>3KwBwQN3*FwBUzxBNRjN#-CK?VYO1d za+QZgSqMMq#DQ{0_VzHi!Wj*2|9^toAOfTB+tYv*12Ul0wQIb!X5w`|V{SUs;guL( z6gopYYUq=2MI^8b|Biesioi6Z-TV!iIt+7IZ#u`@TNWLFsKLCZt`$>zw^}+tqNjt0 z-1nabgcqOz1V?+w+hYPFIH9UwG&O{%Ftt=gg`GpRt(ORMchESr^<(g~ z+?u+&R<@D9OQcFEwp51Vf*>@JnoX-Fh3uPweys+);tOZ=?Y^}~FHo=+#T?_W^cdbb z!7cz&AlS#=12&tDlt(YL6PI2H^k26Dm3-_yWV6{c6rIsYTS`s{?Xi4m|cA zj;Y-l_$sz5XP;8MSl&rdt^;DA(2u{zBd~MVR{q>UTAHqX8@|-ydaE0vOD5Z+Owt0X zm;EouNZ%B&0EPD`O||R{=lm~zO9B7^&?)2Zv6%obOWOd_0P2$zBWPx2mq!AoEEZd;17aSfLO%T)?>D ze(JR)eX$=uow*Ff=C63i6(hwJ3#?iaV)Mb5$I~Ou_rPsnuuFa46 z~Ckd-tQ+PRSR#GHPlr_V`1D#Z2D*;B>l< zBFgToqw6WI;DxzEaK9+BL;Nnnmkd)Zs~4n{J65=}LRkje5ftUwBn1gy^vEC6hpvLms&0D1wrDEbP+l|eJZxz=sb!DvOE)9R zy(0>P48$mN(8ATH7fts7F+Bv~ZG0#@01Xuqg$F8U66C0bIdFZ*(P=FwEX}O7s2BRy zUQ9|IK?FUtikUpn;_ZXFgc_@DD;B_<^$2gUkZ`Ty z=PUD?d4kYYJbxY&6Ds+nGFHQ^4VNzzfX)jhECk-{Ky9mvDeU`e1 zf}Vl99eE^#qZKOXZ=uJjDZOeZ!(dov*$TQGeeil|c@kkL;o@20p0F+hQ{7xjYmeQS z1v-NZabagTGSAkZEGYTSg!(h*1J|7jH1?mZ0_->NF_(l&4;&v>Z58-;4!^z5b&R0F zC77f6wADY;3{U-1#HerJEeySmN14jWk#3P=aiu010sR0~9;cT_Gmf~$i*z~b9Hi~D z;LCE+mQDDd2}WlUstw;YqIjML4vKHrBai*DTTxjWqgX^h)pfP_jFVaUeRXIJ#rC+f z%i1eCh+ra?n2;DMSStS)Z%pg0?1JzC++3wZ+fqUbd@eCgwgdBz}>LBU#; z&w?rLQ={D{&rHu>7|YRWQP)C*R5j2)44G+>{+x>IJYwio=J@7RV9>x}w$hj*t!I~(P&Dj1LJNw1en-iZl6?P&?6Pl%jvLZbhS-am1=K<{i&{N;@Y)_evD z>4aW4I~j15AS&<1%M4mdS_fR`-aYLWuXahY+JUH6#_hwAtwHD*4?5+ZvKH^t1-}h$ zT|;&5BafBe_JYUQR#5J0v7F(OUa2zepk+35&(W2^Set@A3@Rvp zxo*F&rksS2KD+CH(t%h^NhcFJjBrS6`$Do^WHJmlWk7J#T9uZmWfgb~Pe+yioaQz7 zcl%a!dsx7jKrdKq&TPZkE5G8)(x`!ZjStLZ#Oi?EIBSs3W7J4W68Y69;f|e??3IKn z5?K0fUDD;Z74t8 zkROOA57Sh7#W~0`k2KcepiZNCd~C9b&--jJ=WR*sDQD4ry&mju#ZP7;yUAph{uKog zc5492-H>6cDJ8q@wnme#Rf-)PEzOr1kD0i5YCz?zhzLeI(jhHLbH94X{ujT9pxoyi zV`#-bk_z?(Cp0Fj{1j*$O*fm|?e{ z#a62MiVx4=M=ktAQAD=fX3?@=Q)?mQWcmD6&_qUW1du%_bKyD$%-|EmBeS%6D<`4& zj41umEbb_q;MgXiOBSt$RO`eiR@xQwhs6B`7g1+h?b02}n-TAPmca%!1p}CZpH3|a z%zwQY53(VIh@Re2ei&Re&QM(}bqr+BWPPQl9uWW0REl1Fr&DH|2^C!XLZG`a#HU8k zkEzGScNbU^=dDkblgONJJI6^B^IP`!mZK3_G$E|uuydwZWi4-2Xk#6X3xU+d@0zU8 zFy?d>QMcm}i6!!~J$tHiXVK*mpIKHlw&?8x>^i-@T_RQ#-+05RV^IZ`F$BHVc2`IK zj$XZ4m12xyQ=68-yu2bpLuBfu1xJX}BT3qNe5FnQsWLXLu4z#O3U6Pd1bn^5Y~FBO z?db(Pvl|GOUbQ40*un8nI}hCk(K|DfZHX41YF_5i`PpfL{dIk7>Y|jZ7T@{n_w!ff z4)GutPt$pr@2#peiDe`;tpamSXj>QdviYqwXuuyfn`jofw;q_;gepoBh%gNxW+Eb0 zCN5j=B&ru%9Wm1VJ*W*POcQ7*KWyQW9BvS(_vPHc@G*GdDrBZSKrQ$Vd9t_`Y7=QW zgFJ(b&FL5?4#=+Xk8&A2%cPdip;n;Bc4@r*7EvUNN4WIQBRrAwo8Y1Ut!}`%JR_N! z%oj(N;F1yY54&0XB2FQAAZF6Wmm<=y%zUn4UwXtFyF5LiJ0btd_}M%BURF3RYmOZL zw#RnkHEi~E`>^|l2cmtnf|N58iJLj1>b_oDlEiSK31Y1s`WrVtx<&FwdnbKX)ShQ^D!HES0&IDh{ zQ8^L)JuO=XB4-p5|I3>US4;Z^Zgy0YGhUSn@Dvh1Q)Rt-68J6VkkK1d_wGc~V+D0` ztd}y5q-Q1YO_XiZJ=!$3>HbeE5CPmRQck-}Tg^}|qLMPuzD|#1+<}mi6)AhloAp!7 z;G>x1AhX=u%oS_Q9qQD^QsyH$TEf!Qt-kB{lRLH(rW+K!A1Tt;&5mA8 z!&a<2tb?N%@=!8$#Qm7z9C14|lLUr1)VBeMwgXdFd{LzXD|gW}RRM&T7|a4{{QibR z#Z`d@-$g>#3(jISW8g^yP$k3XOEWx z*930s_AB`cX1(8Hm!mrm5xfB-{mk7w9aWyj8r1%`1Otlb4MC6{XgdzoV)K1NWLi(KuROnYZjNE9-HUafEKHw`B3C+a^ebCGE? zt%)4`KjL}`f*swI1~FR;kiu#a9<}kQeRgx7SQvWnI1a~I^7<@Pu+)hqITY06+u%4G zyUbLHv_kHad0CDL$-23^Fr+C8yV}yN(Iz~7!P7z1?G~xc_lB;diBMSes3uSG`6S4? zI+r`vPUw6lo0AG0VR{D2=j9FS%JT%X|H6>8?-sp6MxjU#w2T*@7w2}PYDialq03M* zFRDME3m#?$i&y(_?;R|u{wsWuV{NLbH)%`tcc?2TTX>Gcak|xo*#!7m8R_9_55??AqsP{W*l=!94JVt#LRU4t)YhWuU zbt6`;#R5H?N=rkpNMd3)2q}A|DMW(EispDkmYg6`!@q^-o8we5v+S@?DOawZ7sz%Y z;Pfng2eaMKsY^u@?t31!#PwlZEe`Ik!MESR!Vjsp!xQ`HzL#~4? zS?6Kb&L83VzjWEKBE3e1T|PYs`8Gz*h8~yQnjO+(H}gsEdnVM!_Ybt<5gP^4))?v2 z#HpG{Q^C~TfDkG7f~jJUoOn&lJ93_Mjs9S`Jw~$svj5=faTb?}ynRZk567SrV{(J- z;c~^S9-a203z__b*id;LT$~5Ys@3@voiXY{$CgG2A;UI}iN%S&r2%QR_woDJvGvy# zB5w&Jm{k-(9yV($FJ2$D(i(Y{G$b5X7vM|gtPB_3hP@&uxFQ>v^RzbXQjCIsa1+qN zYeQoAEq^rm6s3@Wj0Plxqi}~&k2}AYWO5Pr*WDb4*m_vwx{2G9^^{DXAxJ3dmb9Dw zD;b5zbfzomGIDNuhW{b0Sxly4j7~r_FMvqvVH@WJi-63)DxjQNys?l6CKV-dw-O+y zK&TPK1Ic^Y`PU-Y@854v)RgNY93N3FijwHdZdh)1vJ}6DF>BZMAo+(c$vv|J!8xV# z$t)3nI0+p05-#QXR-D2%84PQwV-Ni?o1wn#U@qJo=Gf!Xdn z_Zr5yRxIv3L@fHbr6DAjU0pa9i8S~Dor&Kb)^u*#UWgxCjPbw_D{VAl1nlBl{Wn?L924mT2I^G~TrY0f(T8Vw7DzfrlMRgwodNuYPvBgKns` zPJa|4QAPH?ebc-6J8P3)yAF6R0zAKOXl1i07esvvqaQC5QSCV|QwgW;d@dd{flXw< zqCEZ!&m3GANpw=ke<8<<(zkaw)C(&S?Q}xECxZ{u>Bhf&T{QAtH@?yg&x?a^;42ZNs_VBqNowB9|O%3l~ zMDkgbHcixy%a}x7tnm;RFBQ}sYY#L2=iZ`4oNukv0C0WZQp;x3%fvz@?k_##9m6=Z zV-*`?XpTDe-W>`TB8H#1R79i9eeu7+8Ar5Rz$;lO4#h>1ND5_c6`0;Rywg#;mtzud z(q}zHRa7h;p%d66J82sW1vfO_hXA|5$cvi+>HZv_bm5KL1zi*z9(54)_<5dw_d*Zj zu7u(cYtC7jSm-G3R8FeoQHVYXwa{+i((Dx>pP}9r)-21dW|i$KYe~5FR|Dyw z%B%Tpr>hxY?)JW&1?+VFT`ZTxp|dHPCkd5GP`>RdT7h5KHFGqK#Rzw`B)!?s6fE%R zhTg+qC!{9TsA4a${VujAMs6y;=ow0HPVDlLF-MkvPFXEj&3|1@&LrzT>GDv$nj>R5 z+7+`N=g(%tzV1ZOqWbCwZSlLB_O?%-ys#*$BTeer11;JND2xJtt1>SNha~2keOGPc zb_+Pp^|po+O16s7JdZmuK2kZXu3ee)~F?jNiR{`X!0rDYlwb;7gI+V|8`}M`7%+a}~_nuc#nzfI!3hZf+t)c*`X*6$d_)I%WsT$ohQ7 z44W4WCO78yr!$(&;y;aIu{l!1^`aM7Cw+un8!i$%RvSV|S5=LF)TiC2yzsTipMTIU z`*-~m+JJ~!w#*WW8#>k$K`!`a-+NMuZHnShq#N*n4m?`ByrRJw-1Gv`%-1oh^ zACgiTv)gt+j?jOQR?L-1w_WEmmDhbe64)ZhgEqe%x-)txJ5?U>!@7njGXFHAg!x?s zq09Z~xjawC}3?;rMdxoaMzTGSlcY&`gMRpe#R9cLBJP*L5y4n6DpaGdO~<~0&X3jrNa#g2l) z5VR`o(U|EXv0QdQxh(qO=RaGwHAYdcEFnk`Fl zRinhyide9v*A^YpyHdZrWRz(?jr+l~Rg$4OOTt}wTF|rAw!z?Ol~hMA+q$s3kf?c*`D?l~R*URflla{-nf-)~ zdfD9pxb22O7JK4Mb3-MFI@Q6YH0#~~qvFP*3Hqw&u7jFNdyv<=Z2tNh-YCf=VtMa{5d>I{Fex zZNa6F7V07iWn5HDOWLi6*4J?tVae~GP5&6hp98;{$RqDcyV(ozAusg%MYkp`*b4A4lvu^A(lv@13K$e^*uK&e8fj7H0W8^Xu*ez6!m*k_EHv@MTFu> zuCu3?O#C*5E{PQZV#cl>L$4;gC8i zK$tHC6v1ZUjCGCw`(-%>T=t7TJPLH=xkgoK{{!lkZ$sV}ttvF|O5n2#k8OEH21Z|* zy_IIcnL>Gvs3TidR|^CYw=Vd-AuqB13IFKH`C3-~XAWQ1sjoMM`or1}sF3fUn{C+o zZi3Vv78g;2uzjczvCB*0ZR)Z3`H?I`Ci^NaY5#p-V7+J2^f~0n@zY)ZjD%278jhFF zZY&DUGyS<)uj*+)gUoqTzoc7bJ0?`t+4Hpd55H}^*!tUS>K9nX+3kOG5~XjOTShqi z#$VLAh64Iw8%7SO#Bln}vhBnp45r#Y_W1D+Z02dqB-lbONaIQKt;V8r5*IK_852N> zxONx&A=HiZUO>|&3x3EG&+qU+BhFTr7p2P_R?po22^B{7>H?Y?A-*I#l#Eb#rgEsi z_h^#C^b;TFO&T&VX5?$mKVCOk&r``DEiwcS8-N19GWMbWZI!hd=43Dx-AI-U z0WRORG~uP4ts74UYN;ddX=Gns1Z_67S-+MA-PtEG=1|tgnYpay%RQBzQAxcnn~0pR z$+|$OIpGE+oK^o~ceZkX))m7-VOAL?!Y?nGs2mwnRaa=|X?S4+mbi}k%}dCMkXm@a z@1CGwfCTn`Bs3J=8UmFG3yEFxlB}<}$iQ$|QeYg_qE6a&L$AML>_4Ly%&7`3scffC zZRyAdChkkOdpzCF-+q$EeEr!d&32Yx9GmX023i+}&@!$yXGM^cD^ANGK+!*a<~fI` zDbdTmQ)!02?xXRNou0qqviA;P)5Vw{@F*V^0*FKcM5y10055eZ%U$mXcENE=BpjEx z)=|zf_MRXUe#us&PGUl7SH`^xPS`fRhi#i{NOyn>t0AJQ;wsnH?~m(L4|w1)C}-0X zDMu*OaoEh(Kkf$ZJz~NHJ!^kIlV4g6;a`;oyn5O%9p3@KK&ifkZ0FXqEeGV)CCC>)S~OCY8a$sqZXT z5_Zt3yw)NzlERYM2#Ug_{4C7PBjd6B*zwQQA@pTohznL%!zPfZ>emw|SWCbB4Z7sS z-$FSCASLlm>g}xg*#MW+oGWCJ{z1!<&Cp>8?T7i5jR$DHut6#6tRxKH%_CQcS7>Kj zf`n{I1cZ&K<1LP;mQ%kbe?IP06gqYKiWYV$7GJP!V%Un6D-IkO0R03gnZM1Cva!Cv z`8*qTi3vIXq8?NEtu{v?I(;T#8Wfop>&7JJOg3g&N~eSEv_s=nR}*74wM1c&Amxm< zTsLh^?RA4Ku7AIS>z-oauQio__s20&ySlSIj2=QFpn!b4{h#k=I3ko7PEp4QcM**~S{ zpJ2tLfj;aS(eQx=SC>e#^vfOffkU-ol;boCNbAWLyv-lANE+-_^&26Jw!fQD8^g$M z`dSTp>#_7+ z^je*V;)fbcXU>TV0c5@dWJ2D_ydCvg9oA{TnN{MTPKl@VcPO9$efRk)Iz_iTQYp6d z*sX)9#G>=_yZvU!Z@bQfgjwVlEuR_3pOMrDP$7Jz2R@4BJPw#vJud|rg){+)>}0~T ztb&>wW2H3s#jf2<`8Ubpg-&GXvzX(gn8sz|(gCs|xa|bwLl)3CQDJvR?CSs>Gk{LQ zI~_J9rKglZW1LNfZ>Yw;6n}Yz|Xs6%+y(tHvh&dYw81zi~vUk|L15$ z+Mr_qBLDA`YaFruUnJ3$z~qwkuT`viEA@Yb z-*RN_{p=rk4n&bd-)Vte(b+5KeE|WX`0It=@y`h zvGWY9g%y^Lb7?we9cPLg3N@jBMWlS7^L!!+NL*Q$PRMUO$S_5}I4_4S(8T6Bu-d{U zz2L2$rEbIWMGKym?l(A~a6npbbsA~BsAkVky!=P>^&=IQ(q1?ph2OWOiqPq~Vnrf; z;7ki-kZ{TY#sALNVIF=2R$F$(*M_NwNa_;rX!cQzkvCwsFAbdY)iW2NQ0F@TD4vjF zX;l_mtssgyz}vWqhcxOwr8_bv038n&swPl`)NjpG+lxlp+tnI!3 z@;+!x`K^!JM?9)Z8()aX@nV~`W@w@Cxsu#!Nc1~KKJO9MDjmZ;vit*6XLOS!j=*Al z+@+g+t`IElsc?oxQH3DA%Av62gx!sws z;K)X_-NWk%^HoKtax`b(wf*$IU0&k=%&n+H4?2eJw97h1J3QPyJB~(H27iT8^VHw6 z+WKp+z^7`aC9%@qJVuhs+M1eP0R(d4aIQ7Oo*}1TjbxwC>3{mEf7BtHffM~Wf}dyK zbhSye$YiF4!>S~4wRLiaSwtFpKG2MK&>G}|Bk~DWFuNh2c%10d#X?Ae#cDst2l=cZPKzOFc}wlbJ-x;x5^Dx@MztSU)6>?`OtTZ`iV5UQ)&7{P+e- zY%XtWYaeNuxn0oIEQ|7$en#Yxf0?ywTsu?5YQ~|%Nz&V+@aW>NTcY__dh)!Aq#Pmj zYIL0VLNkf-9nJKX^6R=04L*sM)|CCEY=x4{x?M_|>r#RGO-8K>v3G?tC78jT*1@^T z$;3qF3J5I8fY}AV?&b3na9l3+O1we%Y=o%Xj45CN8?7ac&q|?TsVQ#2buS>!T=yCi z^AJ3$FBIp~)#{8r;JML63?@(ZYvFT5`*6U=nAjec z6f!(1N1PJP9bPvJNiIpMWZ$0UCEi3aH>nfPPhw2MRrB5DXde~RfvVV2^fD5}pUi5lw^du7E{ z3d09K8YYfmw0&Kp5W!%rb%~MiC zCgSIMNrwN8RMh)%Rc<3!Mk#QFCJtw{2IM~d!23hjB(ZQIQ~=>O zxo+tBAY}>V)E!Gh9GHEA)g%|43H4`scVSeXz3q%`*11&}61^AZ1A{n9ELrAY@`I-} zC!v7y7i98vz>No3#sl=*2$y6|LRackFU9?>O~5c{(>o?>Sn8Wif@Z*1oG#8KUO`pY zUiM1WayrIM&q8mh#a2~PoH1c*ckBDfEn&H@@KF5uhs8CP9WQ#|ecVt+ufJ9mzEVf~ z?oHlC3l0kl?Ila=zNBp@hUg{8K^63dH+2HOMF8K}Z@yE130_i;8twaB*iKQL6CXSy zs|p#4n6-6RGb#;vO%frxLL^{I+7W)RzbE}lEhCmElhBt=`$6Zz7;8oSjBPb*gsYX5OIEH8Ty3MzbR&96U{T6oTOc_v%PK|xk!b^%Ucf&>@~#XQQgSD?s{6ay8Bbd7S` z-`=!a5tL<)S2jLpi@#-}r-dNRu$VMBy$Rv5`Ug|OL6Q=zFH&zJ-LYd$Ty1xk;>H|1 zs+&zdD;Z|su>*MfMB4q@ALu3@;Y_giUu521x`3f-fF%0cE`{KvL|OG0ip~Kii= z#aetK9$$Kvd4i2M2`%%aDp$$d(=fW5u45N_kPRWZs;$aTvA_aKi-8^mYr4qP5)Soq zY_r;Yv~KV*g}1ll5IRlyj0t|@Ve^Fyuq_GLeqWDdzs)3*Vn^>bpjr!HOoTH>Q~X_3 zc^eXAqM8y)<8)sVQu(fbC?($cy78>;(Eex$(yz_RFcY^wh&Iu4HU~^e0H!qF5*9G^ zZ6hhG@w;A*ZRcD%a?(ppwI3ne=!qDsdh2`HZS_hR;sDa9#ImuhEmoUt)Gua%5_-d+oah- zM7_U^#>*JtUqUIq?P_+~uJr;g!vL2d|G7+`>v0ObE7IS(c`h5U6AE6p4~i7CV#R(; z(O1sD(riL#Eg(FZ*F&`2YJysX!!3@I5@(m?-$YrGI@zX}L?7S%{UpcFF$nWT>Kg%U z;El>(NzP*edYDL?ucKd{Hsi=C?Sl6WB=eAZ_J4{_EE3zw)^W4858HG3NPY=iehUH@ zfXjcgeD-pWeapTjPtlE$#Rbl72H0mrcH>)~ygh-q@f9;;9Co+#hhDmQ-wNV;j2l>f0XNt9ij%ENEmhBE8+f+!j98scb?G9fn0+$Oe_M%` z@mi*7&(}V0FM?SCe*bUgul5s+{2TTDm#A((F-?70Oqh!U2D0M4udXMOKW8K&jV$_ZTQG5m;YMKZ?Y(y>zF=s+a)t3Pmyg&7bJMimAK zpDj{o+UyKoCWy(tl>(prEcXpZQJPq7t`h0L;}g9jcX@NCES2 zX}kMwo=u5ML%Ol#n~@QE=TCLbn-HPvW+m{Tq*|q0()Pf>CY&zusA66SsT!4@zu_v) zE#S4{GQb5wRFF>Dn%XmfDG|Wb?f;p2TT2=efHCkoE$fk8AYGY9@W3d2dex^*>(5dM zdgQEpe&V_;gmo3MK$G|wCD;CsK|x7<6lh(rW#Lr#&;L6J!90M(TBB~1dV#B$_aV-# zI#4E)E=zu%|2|;s%J{lpSR|YiM|T;O(JcvSN=T{p$B>W`gt_)RT~0^jc8AV|;PZlc z?ux(i1V1Wqhg)ob8+d+u-YD2!F(~|r>eE2Q^$_gb)0zfM7u+n0ZET!^<^WP0qvw4F z5{fs7JXVm|p+6Y<%4=Lj@-W34=HO3H6pVjg4IdmhSk_q=BPyn(Y$hMhR&>k{48PKi zpTSDHO-Gxi>=OBozx~?Ox}oC-l&NfgZO+!aj%QHImP*?osdzHlwVDlEpV%gl&2vV2 z&@+C+wMh#%LmJfK#w^VElFQM{ShhYgr?T-emSaf;8*QqviGlJp#mj+}o`CKET#BCB zR^eknButQGh*TPa*AZjn{wyWT6XU;2r_Nequ^7otRkC~IXf=G70+<5Y+6uejKjd|t zSBuZaqBUu3IQO@86H!k|6PDAIUcW|5D=;t9?=m`!k}$Oxmt5)bs9v8(DHO@C1vu=} zuPfr_16)P&10PvA^tZb#um9>STR}aLe3D(^i*>t!X)@lm7)Gl*oL5z% zzVx(nO{8C_@*X$tRM-AmiXs^_T8CeR77!(B!kOq?|8I6GonM$!H_8moSeFv|=Q7nU zDP66`B9|ZRi*6w5W9LxXI^Ggjz_0m?7S2t^ATN(J(fL$)IOnmIOGMJhW!>1MJ)k&<;p|XmWXfZ7Z_tG`3*qFZ)&1y_02L`c?e<@Ix z&1mTGnkDWJXi5W`)c^a5RZ(WQo$?5B8H2GE>)Bs}=Z%L5)y~tR!MfIE;>B3AbG(rh{ znXrW5*{1)=nL=TT0tFGo2np87dmVZ4u}-A|xU!ms@w+IuG{{QHvk$+Rei6|bvwY00 zLzlYjF7WLQXFR~J#=G4FvTqQDIh`=2_qLtDeIQ*x&fp5C5{Uk9&LDECtd*|x``fHE z7h-g%GEpqq{H+_G!DTZJ&wDzxH|ficC&I1CpA8xB{#OMKFHP@QivT+?rACm2wE--T+kF#0q7f1bKaFL1)>}r^)dX9B z7k76E?(Xic!8LercXto&?(Px@?gR}QG(d2N-~A>>o-eLeC;qBXiMm%rX-`c&u7sv9+Tr41CaWGOR&4g7a@`d>1&HvDE%Xi^B z4=-bA@sWG++T82}!6QQ24@)FSrSDy-zi@g5<(Z?r4ljN{ciQV%E#v^%P>`L_e(*8* zyHOW~CZ-|0(@#8nXx=y0WY|m(&EZ zTCiq1hQ;+aDvu4v1lgQ<{2fykTMQ8-RG8)CSxq6N0y>`<9_h0tQPFgP7dFYc`1d3l zg@9H`KNVf?+NFtaJvp`#f6K01fphyu=^gpYVjh14?casqvKHNO9&=}Hfkmy1Qq`WQD-RW24 zkw1;7ClhjmX{cYo80nAs&eFn@-%mR!!L3=88DM5DaX|__F(+LD8U?`e>7n1&J*F@` zwX0xe@wkE~Y=K@QCdWJ$cIV2^A*31^tl?GfCGF7sTGSh{P=u1(4nF){5>SXW0{Dyo zAN!3@E7QIbUvrcs&s_&+0}>RQM-Od-t_2by`yB|k3WCnFvwwdF2($o!>W%Q0?@Pxl zT&tY4fe+i(nIQr(uZikZffJ54Mnk$E2!QDUFxMNH1LWeu9G{@!8qe+CFd-qk1|!8M z&eKfn0r{3h1_1%Y-e4r6+4TQsYGGMCvH|HNo{;ujyUs`kLElQQ>mJ0=+Aog;>=dc`A0<9R-t#)|`I^j3l? zsUWYf1~$~9=ohcOOCPp6v!DSmxtVyx$4O%cUD~Ctvaq zp|am?apMsd!PxLz-{ygSx9`92eRu2Ab*+T%JoXr_gzY`w#xI5p8^kZ38c`O>lIT6o znTN)t5rss~CS)bZ8VSEG>Z(-Ak`D%X;cYzidk3?vM^WR!xCBiTH_(z_O zVni-48qaPJ+jNRg2)BBSKJkb0PdfFtYb3Ad92BDY?C!5FWdLyV*d$GzE{Pb9NEyV+ z){V`$BsqDA&g%$38Y_qrET3QVbtYt|As#>xVkpA4K(Zh^i@~$vLO_Ls%-B4s-;2Wh z2Q>c&M5SwY`~s2BqNr_;nY6JO$SDE>eaL950ExcNEfPRu_-kkWzj@37Ip4worvm}f zgjFN~zXdSMqS*rfN5Uk+G)WA?&rIQm0y;4NJ^fm?;g@Ycs4cnf%lhXrmZG(?%`?!P z@r`bqug?_`R(!#P3SJ5K6$k&mh4$Df>L6_e&Klby)UnB-*`v6Dp{EsK~UJh-?1ZnhL3O@1ZS4 zP$>bGV-n35|9|r`_tkpRv(~&~dEdeOJ>}mJFDL)qhb5-+>%Jop!V;IH3g#!kAOOpk ze{*?-Y!t5Tq{1xaAStmlAmy@EhZhi20OB`4_nO;GkHP}REW|wQ$K$Bb$D~YxQt{fd zMz3yz48Xm4H6Xva?Facir9UC=t!axrxkUg10|*Mc07?Nskpig2*Ny~Sf7m#C9c7=c z3v%y=z9bL$&P}jc9&kkf!~}reJWzIDzs&jpPq=hix!QivO6=3wU*Zq;=U5^z3DDYw zfuJT75fD)#z#s?9S9tR<*=f)nlnpOq-*mb}sGOY{WfLH7K%mw@&{-e=!vfQ(KzF(EXMhA1m@@7HZB2+-RDDs7_K3UmKEfG(dRqxX!!|}z1DZAXnD`~->IpSbbm~T)K#2K5A z@x#AfsLI8wP2dG&zkS17D`28f3=W=|W= ziKA^b#F)Rszwz2eNv>)3ubQc^yBMgNLJ_O7goeKs`zyLWIy16*+mzO>!8044DYDqSN&Z4$h$kT_uZw)=1M z5FeSZ_q8H;R8oSjIe-Xop|-bgqPGlfl6qHhhfgfEpI$+n4}lIM00ti{-wyg821wGD zVa0$zfCYgv0zq(@fE1XGcGz!HR>!22=g+Pm*P_IpKyY;z9(^!fje-84^*{iI3&5ye zVfkl|{%EUA&;leNrmrCM20#Y%x1H2mi+{mVDfz#g|%FwWYpm0H;`v@mHu-_~tn*adlKRfe({RiEFtNe{0{(};1&h@gXRq77Et!tXsQ=5cib%$# zlQ(6OW{ZO?MRD%;^6C;s`jdNW7P|hx;-9%eDieQliJ96*2o!CL_|V0icqze;iy*M<<8TR&th}GQ^XFHu+Z7#7H8$-|A7HY8MYG`FBO|~X<&XWwWL-=XZwE#Q1h^Q| z`^=|*k4OQv^rw0gGkHud2EHCO<7czqgNPCUtH9{+=Xw*eDX&RQLWLS5C6OU)zBPl8 zF#rH6>;E>^{+){JhX%gN5MNJxxcnBa8fk%_*M!C5a=in5CN5p z3x5*{(}reJ3Ra#C&WQj`NEN;%BJf&L!0*PDy|zO3c>78NQ?DjC-Ply;JD(z1itB_= z3p5PX)>`XP1_vf$qpyk~2SLy!01cRAO6yC`ya$sHo79l_|z*-JDCYl{z{J$#? zpY^FVX!slnFFWTc#lPeMPl+$gA4N{CZEueeL{C?5`{!sF$>&9$b+i!aE2OY{XX+1S zmQ7|#czl;fwpM?+gSrogLlQ|1u`t5R-jQ@R{cDO4Q`jE96fxgs;QsJ;ZqfJ6`{#ao zh7A)Ta5%dXQ)Bbc!Ol>bqIl*?3+FAxZC%l!j9GBui$I6=y3G>lT1aZ-w*F0EjQ@zW zmIQ}L_hzMS^Fq$4nB|V@cl8Or*+h(y6Chl%oxyi< ze9jTknxTje6LF9J!5f@?pY-P`G zHC34+`Y!|p4Tjzi-L|o4q(8_)UPkYA#TOI1adhXe{2O)CCDsRW(-KjoQXm8C9{$n? zG9p4>(maG=WF!LrEtDoP&T~V6T5+ZFGJ%+~YiugH(zt*3Q=E({(Emba-1y7TxiO*7 zT|qt-g=`V}9QgLddzvG!l5pzlLGJdFvqw9g(A@>7_|caG_3nL|dSk7xXK`h5S)9;j z6f-i_@z*zx?6sOOqtuXuU`6Om^IqKr(y-9D<&3kUIqUbx2f86ldfKg5LQJEF0_`zt zDdmgD4*~dLpG5UO&$})yn>S+yGH)E$23W)&IbX?46Iwo4dWmH@Uoq?$ePu4tsy!O% zi%85v-dml#O)!NCSiayk)iD{liurT#*E#nv(z-2#Ht6g6yH9s~rp*k}sPm)Uq=6FK zUZ$RQ4JG*RCKMJ91tmVN^1GNCRHbU0?M!^a+mjB2a>UNou2N3RB&U`9d3uzh{o&y= zt9&u$T)78=^OSAc;Afqe6*f)}-h)i0$?aU5-ykN2FQ9BJyj>FF+bgxNngF#gc-uES9%m#;pBm*gN$-Kf6 zjQi+Z@2LX7gPn%Vy()m~@H(+RiV?DQ_baL_MZyHNWr1i2tD$w7q4Q)4q7SM=akc?G z4$<7@H`R}rh02l>gW})ZX#NV+{K0y(!|Uk&-WO(dn2^i$bf&ZB@Js;_TN1Q5C(NK4 z#9}FpVJ{5k;}A)tYO@r9OsK`UpEpVRT&cKsuX~b_!Q7Y;ZV6>V>})3&K97a}D~t(J zHsFZmW|q>^bn?q5BpV9iwpwIz^H$QIHB?kHtTf+WkS*?NhvIy z?;4UBsVrpGh-_|*W++$k&D;jp@Jz`^c7;wX{*>=%4bHw0$7C2T6%yFV4t<^J>N0t);@&9Xz}a$TMyz=Kf|wS~Pye6zDIOLXm4v?ZLBc*rn|QY;n~6F<+t>jqI6xyq z`i_7H>^zx)N6Zjh_@<9^csqpWVg0EBLVGCu(2nV|nL#s7Zt>B#&K^yPNz;idbp+6+ z9Q+@9IFU3ZULLS*s&`{%xCQDQlg0A2ZM23vFwXl1?YA7iSS}M3SxBOuXUp9jg04As zW7O|){a{7N%`347pK(dQi19BBkSX%Q(9h&=MxQ$#ynO3?pN+ZVAh|zBYzBYm(&j(K zr0DmXol@6z(s?p|)DNhVCs=;o+e-ae_4gb41Kd)Ni z@=U0TEE@AJifSk{=x?r;Y!!u_2oh2y{;w(u9v%p&Qo~y>zUU3P42*_O+7V7VvjGdz zn~#CqV=1u(S7WH|-Da5fGgLKHxnB|JdwL}I<_iJaz%FmzTQKl?Lb<(TxXr_!6ZFLg zOL4MYWVE13=;vTWjThvy=;j3&tepX~&SQaatzeWerYAd9)E`|<>G{t6=u_e#eV$}h zYqC{G*J%D8N+Uq88ld;~b)9?5OpE?3LG>&{&KN7B1#)U$&`6Emj#7 zbaAQFmWo%CgNniJ$`_$Bi}oY;ueyw>9TjtVXSELz;X`6J91Be!pcZJVeCW5>1=#kB zyM6hTkIir5&mqxXmDbkUR_t?M#}a^vUZ~a3LyE!hF>YIZOwE5hOxiQ;BlbAkcva4v z=2G(2d*>Zgk%Q;J`w+=R)B~MnvMDQuRk!wcpOJh&%O9LTv_Ac^c$`kh=~Z#`+?C`o z%vGX90&Lp=wz1!ADGF8R=yZ+M> z1%a$s%hKzEQo!zGKGi>SglDFe7J)0U8dL^>4ny|>Tf|Tu5TpT^3fS;H=tpI1&w@jt z%P>V!TD?`B5ps|#^7{r?bhhiFR08wT3-1-UlmmP{nqx={0Ii9D)_*b7>-&2X@z*>g z3H*=4kRw=Tkfe#ud!6^>OJmFn6>xhjZ@bhFfp?Y?(!;{pG=$7R;ATQ6P5TcUl; z`>;S4wSLqAjc6jWdP1J7QeQQkrWd#c6bd-_&HpcYQ?ESiZCMqNr;Nub2MvQj*cGZH#^j&np%v zIUJHnzAeJP+1E5`8@3-32-}D9i5KCi*Bp4qQz~>2BV!$?XE9p^x6(Se)JOsDGRx z@M#0e5(JdR{9lNgW5haNd=MY0I?bz6gxvCl#$b!6UlGaX{L@aWUlp7zL5P%iRjB0D z=54Yr!Gi2A4O**%`}gv$GRr$g{xo$`+n znE6C2a;Rb@`)9U4DH#ykdmr|0w>;6omF$CnLcI39`&%J6sAF9E^@cM!V%;GJ49oY@ zxt!KNz);6+#AM8Q&aqxFQC{dc_ii63$B0gIBa)(Ys7MS-iZ8-gMcqir2gel-tg_1; z3eFEy%OrZ=o|wt1W_daA78tJAVxItnDv7 z&g*L=w|fN(CVFVeC!e$=FL5Fx`&MD>a;Z9{M%aag49mD*jZAPWI5;* z;r<{oRZyk1IK{XIPB)JmFSG|ZZ`1HDa~E=(s7-D>q17LSjQRcf%NPE9XcPKf!SJ{A zLbSQ+JeEPf?38@v-}7=>2*!HxZklh*0{R1X!#O?nF7~&?t$JMCv3AGcZ0R4rvx5ojm@4%z zoOVzZhroPHdyIs!i(h-6KM&PzF6E=UtXw@zU+ zO}nZ&-41_*^|{kMXSVvM5xlczKr1q2ae!N>l@EqGb)T-1Lsyb_yl*F(N}50i6`3c| zsX?NX+`|ypI?lv^%?IKGXR5yA1{?&Wmyc`gOA;{e`-)B9i(W4ei5hn^ zH#O8>hVNMpN4DkE7cP!y+J-rKl$eRIvYtSQ+i_K z7m$=Beytzf8Pha=nf184LH(M)?c(qbDgvo(i|dbb(uc6B5JIeR@@ZECPhON&`j=(x zzu5dDU^!>&6=My4*$NmTDknLVOtol7LG4fr?@V<@pvgp5;?ElVSQLwfiyAT!$B$6; zTr7pe{kP)yy7>uA>$Cdg9QQbOWQWBd5Wof3uzkTLN`DJ1$ZJSuc=IM$T`xO2mVA-} zeOk2Marg<$`C`OSzIR+{3JYR|ub6m5Jo8;l{9R$hG=2RpcMq2&C(U zoS0AFl!a@5v#+z;A@#(eTy0axZ##q>StDt*&@gslfB&ZOy~dN~kM8WZ3kXl({}#!9 z^^|YjYx;$3iGUS|HUFp#lD{2ONm3V|!Kd7kxV<48AzaSSctI`oTPqiS)%5#enG*2UE?N zXg!01U#uZZeX218octqy!^9VRfly`!;p};3BI3Lry1B9Lfh5+x@p{>AtG6!%nb_I-;st;OeZaz7aF-2iHssEUovrxA zaf3rA|FT-+LRa82XlQJ|E!LN3oq!9_eK;?(9w`Vkr7F$SJnE{vdJi@(3Bh~i*Tc}! zWNG}Nu**M6B+zqv-XkDf7aogx$-@aS0CZ9X^qbRXU8Rqj0cQ*6+wC&@P@o#6EY#wt zQ%H;!(3r51Y7Kdz$bCyMcxSd2gwDF3iF7RBw)Z!R>mu8aLMmQnE-Az_muEF{ z{FtvRz=((K_m%AXwDIBkB+`NI6^_8Te9k*w^Tc>g&p*wSoCwssDIb21KRoIx!Hcd! z{ib?0V##uui?@$THyDh*O$yUr?83q|goWGv$$xFC+J0C!q@O+Z%kpaHC3m$O%xU)G zA`r%9m+(8=&L2#N2Gn~))%z5%uG(c+JUjy*FKn^car~HB zct06wIUEhMF^MdCqW;j4KLrxne?$oA)tF2W(xlxb3>Yy$Wq|HwH@putpg5R3s(sqR z7Q4-Fr-(llrv`U_nMGDlp=GaQX)cZvm-w3>NN?Z>^(AofPN#dkgQ${*my4K9EpFw0 z`l_cm=DL!{gNfSaSO6n6punP%0g57~l`%wYKDjhzd_&s;n!&7Z=i$^dVqt!!ug6Xs z;aO$O<#Z34d&A_(lF2+KqO!r7G>?)7U1n-NjooH$`OIN9(!fws8nzaxSsBuWo~ueZ zgAx@>IJObu<2|EfS-rtgwKYp4P5{hrwETiLT1ktW>uo*-ne>EpI57q^*@Vlp!hQV#m zAHr@^cg&BV`RDod<19VZGA3HOGToEi)Lc`+W1^;b;pg*iwc#WjeNL6?mWoixEz7Schl$LY_9QItJZEMfJ`CJXEAs?cEHQI73Z9 zx7o4)OL9806TTjlm6*iTPj8kE1xqT;l>~dz8^mo*6GxtdwKKN?^lrGcA2>*NB7x06 z&qed?25e$j+|o)_JMf_QbW$u|9H%%=mqZ;1Lmu+FO6{$L<#(d!Q<@UX>H?S~YyI9G zGHK^1=?5kwL9K*C{g}R0A{#rz^#Day@Qun+|2a&hHU^2`JMw!3&U(1GH`^5F-4W(! z!1*>sIfXhM;uwCtATNil9pd8_v_0HlwGGMX)u5TLsj_PBK4oRmuOBn@mnijwd1R`h z|CvUqm}J;=4J>1W_laslr3`vG5NGj)fKv zRm3%kRzj6{eVO;GGjbKpZ*c#gec7*LVPngF@B`VZJy8hIS1Ju47dNtU^OF8+mBYJC ziA{LMHTcflsKg*R@IfSHPl84HBq_&inx-nPaDi>|gJskyzj7;g#V|;bvQN89k#v=>m1S_n1CW|$3>G(bUi&W422ieSW|+3g|!JNid3v)X4q^{rRoHx4D^`Zf6>SJqnuEz;;#yR$!zcRc%wV)RVgm2I|>#O1IoBt_0%|b zS7KTeYHN!S*UVPAsDoH`>W^#KjJgGN_iyE-*N{V6?mdO!zJmE1eHG4`L{*s)7AN>L zyLG!{Lv1U>!QZ%L?H%bbpUtKTc@?_*>BRdV5Ue z4yCsfL`Aac4KYvEI>|GNu>r9ZrgXO^aUu<11p(|^lgSkp&5ArSDtIQ%W2%Js+5~GrqVV|~) zvlg9@AUdDb;rr3Tx-h=X02Cks7=!*t0seQPu@C81Kj&jnJ)6-t(JWFX==A}~sy5cs ziy<>LR?hH>@Z=fI-Q_WQQh+H8F#n4k^z!x_^&0Vss(yok$wPk+D>94}<68|C- zJ49W_Pu)@J{66^+%qEY*hE0{|v0Vf6mph<>4N&o45J7Q%XWR4%WQdbN@ppDDZtK_N z%uWBn@j^U>d=i@6b-{luskhJrIGVeXpcMJd%mTMUy2L=vvi$JVJHiu8 zQBxugd*Gb#^ImB3W(j2X>$w}yHe;G^tpEPbArK}P1jd0&9LQfPT!PcpIs!9b3qfFzhz^5?GN%onEUkpT_#Er^2yrb!4(O01PWxUWpV}07UQdk_PzRiWj zVxxMlhP*uWktb>@dNdm8qg+vuG4n?)4WE9LV!x}z3Z98r->sDL(;wB-?q(~!p?8@w z)rO0KDDqculj?{R@V8l(-A4w99L%NWe|mxm+zYO$I!dOc9aXqR zZlMg+!pbUn)=*(%Hq-Y?Rd*Q1Pf-(Ovqp|h)>McRczZtVhXoQ;z$--%kik1X@*7t2 z{z=n^eVD^1k0DlSmD@Q%(6)hc|0NKjT)X6M!282OcmcXV}jj$U*SQ+$eeImc#o411t zwD+Ej00lTkUS52oq*Kv`Y=X)`7~l0p@DK>Su=ii*wU%i1O4I*;cmaPg`QC!VB~W*d zxnu#%+`f74%e3IStXh^x$iJheXoSCp^*fbnLz*x zxXg9*=9^wGebJ4GqVFnK&lIwKD}054;Xxd~9ss{yE;xR3NB^I{v>=K5E7JF>0ywNb z#(r(t!vDEp0{sPRhRf(b5!IU;d%v_Pdi8eT418?7PJC{F#q}mqEn(eW_Bm=YEMKBu z+HWhuop$KXMe&3yaf0Zah>sHa2xaA=Y^^KuR-$WwN)1q@-l!_;NHQNUdUA{1_~=UP z^?uLlsp~QPB6>xF*nld$-cve$^A*6KDlm}}b5|Zwq|9?K?g4!PKp0;kuf>1!6WM99 zQD_%$0tnFC2R3k9%mh?RPddUqzyMJc#mSPc*;HR|MPlDNWizx3IqTUGG#b;JRnf2s@bQ&Krom56ILg+{4By>t-HN} zqgU6bQhFn+ITafV{9QYAwXJJi`BZKe;oZNJ&LK7(UG@VP+|k&=7Q3od=D^Bd?$%f%^!PNsBPLD?#p_n+Yk60TMQcUPTRi~Djlxm@uB!QdG<>rpAL7# zlP+1LwtQS*BD_poAs&q?U)UE6vt0T<{Z%ZQtuL)1<=WM5BGdg5f+OExb`zktJCNq- zT;I|^i{9)COQFX3MQ>f}roY9wZ>IYuo2vONy*8Ru|F(k6sV;dmqXF zm}a!O!uwmSk&jPn6yF~kGj8|@beR=NZ=V(Fk}Z=I)OeXmnKd4I%p%#R9Teh#?b(Dg zFvH>%lT2Kb%%!*gM!sURzDVTg-Ku4x8$cZYYS)p(Jjc<-fu_(lOS?kxXC+pyd*Z&d zMwJTId4-5!uCMFG0_#T&&JdR2OfZ#!_>4Q!B$RA4^=R)H(LX*vZ4$A% ztrShf31)fcbYOipHtc@*^58Op%QB4(qb(ud)x}0ro4kDAPD;HUaxpJB8UWQ@&E>3V zcM9Zc<9k;aTkw!z;QieA#S<#RQ8HYE`dr}bsgqBu`Hq3Hhc+Nc9ft=`R$PNtEtD80 zpfaXr?I!xsD?m5qxNQ44a2e}--EGxymHqhB37cW~Poah$oSyKh=s6+#e2hN%_**Ul z&P76#a_DYF&&zk>p5RaKN146E=CZEc6nrXsw~6j+bA)v1o5rC>hp!-cn3r^D}Sx-UuzSl*#S1p zAHv!!Q4RIM+gO|QMpc*TN!Rs54}>q16uVgsjkfGgZGy4oqweI%=SP!2e!?x~xdVbHC(31-IA~^A0HJ z+Dg*(sP1Za?d@ugNlE>nHx>}$fXCWTN<$Vgd6BV<#~ygXhY0N-EL!+pLHc2(Pf)vv zk?@NJW>hFirzR(jY8|}b0QYm3UlpoWEPd<#)?E4*p&SwDDEXRg)@wBKddc}674c>8 z0_ST{h9GNC=3yF#F!@gm0rga8aidFyd|Sm~U@zaI)HjjFVkH^%4Zvy@IjOg-j>*4M z>BuqaErc+<%j0_icPWk5U;0X{LWVwbVE+CZ)%S|LIe)^=#xBlJ-XH7i{ku5$>9D`{ z0=g)ZUZY?`RH>bp5CjS3y#~nx_WT|&wt~I+a|dLi;*m-i+6RQcc$0JI>s&VnvS`@4 zM_1~9%JQ@ZJ#`e?>5;6!xX#MXrrZs}KhtE5`&?SmW%NG0pbBB+OpH)U=ViJN4Yd*9 zb0!KY-%ekw9WcbAQ*{WQ6ZI2z@iNoovGP|WS?n%z|17zu{CGG)&=0C<8N`(B(=^VW zp6|rCmY&&5bqgw8Hi747rVXqt`Ou4pu%y;^n}f61I-THl?&gWdTv(*|CqFJTynY|m ziq<%QK|F#2q_{j!{rBgT{0Tn-A0lF*x~UW;@aNK((rlBptmPYSp~jBNFN@#YgRXn>pM9kh z-H%Ch<|JTGbd3DITq*v7_w#@3+m)rLrv*Q07KUD(ds>pGNh`&@{;5RcsHU8KBbvA~ zZ?}0vDg+zT!ZLqbe|S@~V;L}&H-8=c^!e z%@DYQv)-A&Z?%t6CqhACkM2k09x(1+z2gh& zSbj^6Ytv<&b$zd%J^= zYgzVoRp2h!WXDOWE}}ub`%z9Hxul;nZJfXRuEswJ>L%3Y`*F!07$J$h@C)MJ+~0@O zxS73tFwP>OkZ1F*7eiMtfPhV`7vT^Q;3*^2h5OdQbwT1& z6FU{T?NLiKPL}^7fQhGG)T(d-t;s$#l?k@vRYZlk&jv;y${Vzz6$4=-!#I}chD~#k z>)Y*Df407v=+UD;`z{mZSc-me{b6ioM7S^aFWUX77i&Y9=dIB98W=&W{Cz{pF`Z=X zg^eq0yAZCwf*Xp(7-n#he!k))0wm(SxN`L`e?;8{4+S^A(IAd4$>VWF6NruaR~?rB zGSXFW(kb20+RI^=)p15_`mvFSDg7keUqR~V%X-4pp7L=RpJOw48G<^bxc5|?=xZnf zw)jtjRYDIZHN|@GS!yxvIbxS~TZiw<#JUBjXwC_RXU%Fo?Z0BF3|?$8=r_Jl!{Xjb1(jVlJe^$seTZ{2cJUbU(o*MY?;QU}2Fiz#jMUx|YOtZ?3zPlR=2m68 zpf9~4*5fk>bh6>WNAt2pi0ZJa!9xz>U-+cO;`m6&HoJL*6L2ir&A3Nx`i-5jOS*pu z*={0pq%s&ZCoz6y7CANiIx$cZZf%`Q%lCI9kIWvr!||@?lUMrUjES9O8%I3&NqI-s zW9gjLh*|P4;k^sSJ<}5d0U=d(tNric5kFhS4iCO3hjKquon|Q%{jGJF{zWjjgPkPo z(OpxLGZFY1>2z}V$;H{X&}r}ZiYZAn$6G){lEf?77f#myQfrA?;sxF$>x95Gs&=!l z+NC5DjSJ$VwM)f;aID}Tr3ULS3msiyk+nh_v*^_bv3&W58=r4$^K%W}Q4lYU7UVZ% zP#3pnq};}=IdNNuM@<^-fAcG5TN$pCvFiNyLut^GZW z%4BLGY66k#w%xfWoj`qVg#az?R3kW20g?|TrXd>+n|>k5Ryf;-E1;fn7B#zx)Izin zNw!?-yyQbs<|mzx$A&k&GkPnFUt{UR;H9=zxK%2yzNmC$?a{_DPIqkS_flV3w0Gml zWUDNcwdYoMJXA#d#L678QrB{To;htZA4?6qYG0>KM8y0PiEEq|;|p;crZ3vBS4~_R z$I~7U{@g|I^pbn;35k&eY~Wi=yaxudVd|sbw@ACC(qTG>bg3eo>7UDYIg7QM;OgD zD#hHV1wC2iSDL~xAAcS0!HWwvma$;IqKM}C(1|YAy2@|%WYz10m~I;S(pbFh+GKCx zHpfeNE#<}tKOlRY$$zE+Mo0S>_d~`k#r5$XcOHQ$$}nAn*6J|JMyWP?%g2-9`>nGb z$-n{xjfk)2JD+W@*4T05B(meAwyX4v?1PaHlPtyil>)pb%2RiJibI$O zRX8{w=C|UJ3sP_ce-J?qx6JYn30fnGgtnM3rl=M4KS8B#%~bQ}59K6)soG=+6fNT* zxjwHMSt&(M5W^%SB4WFU?QW33l^iZ0R@W*`Y73s@1TW)yC z3vyC<6qN(T!Q4kBZthL}nrhnYNqqbYmkvHx9efw!@UnV}&}jYfNHX(Np0ugN=`vY< zjJjE^PfGldG@AI&Hx%J`QIo-N2cevGbiu#Z zyR-W_3Cf^TfnHkK@GNKm#canqYgz~Hko6EvS~N=^_B6{rw)O*J31(~M%P$JsTBpbl zHw`i0a9prdPViyxIu4Cq=C*6S^=%_Qt4CFDgp6`LY03833LLLQV>&AIZpY!y?<`uk z={=)4HdPz_!2ESkTW8^cjpnD=Dr;}lAq|bv&bWCY)SQJWQ*#^0eVv@eU(CHr#IMt>BP6@A|e<|CkiS zoj6HoL?m0Ei>xt$f;fT>;vfFF=cKG@u(}rvB$HoSmNWQj?hjqw5xI9?lbvEGT3Tl_ z{ty`?$HCcFw$t*%#Y{KsRKLlVI%T?mgr$uGW{;Ya>T@L zZNDPz7AXCM_Jf|s`bK5{+gIWflTA5A^!3HrP-T05Y?299qLJh;A=!x$%ngzo)r{!i z7KjOFtgJ5=V0$dSDA`I*=n}Z8UuI$;ECMM)u%zL13GhR(O^Df3XR~!(Q5sxhu;A$f zR6Z4(oYqku32RCHF3V#+!DE?mEHY15o?8_!g01MMRG>E{o6U8_f^&axl)C@>zPcwY zC74%Ek(cLvZ^i@d`^*D$4Mz3B>w7opeOik2$s^ zB#yt)3!8PwLH91_ze|%{+-?zqnH+sPZ55rZ2FTm#OR?=Z5M!O5a$(7cQE#=|(D5{<=bR-<~LB-Mu z9=hcR@2TgQIS#%cS3fdD?TMsy*PHmzWViEKxNmUeAFJ5ntyf9qvs_S^+&_Y2JEs>&fK+34Qd4yAIo zgc7Uw=VQ%MMYnk}?@C>Zsne8UEu!s^rztb({&w+d^s)CyY6^?eyNu?2a1L_S*E(9{ zA#P05O3G`ne$ipvZ*a9(`o1W~!mSz09*VyK8T2vBTZXuxJ?LCl;d-|JhE7#>QU{9s zk{DLw8joTyyOa=}!{-=Im0q8{REpoA|3%q#``uJ^ULVI83O4JLbDm+p6q87cu4L~G zxg&==)iR#lEl-TuD2!mIGTtt4xzr3bRU@ygS+~_JIi15#C}(b+FDiRocVxKEUU?fgE&i*M!3BbZd-#B=j3weUo^DV zZk4jubW|A(DKS!hRe|JoyLQ%hNKD$0se@^bwQrm0&YQ37I)T!r&zIADKGb@280w9E zUH`sSI89U~bfUos9osx$1l@yD{u5$*(+_5YgPIOFFzj2xAdeQlPX8ccgpM@@CgpcF zySbcG*SdZvSFvJKx6nto7Aha2Pn4Wi(Y|!&5nUBdxH~g`jgIw+5#}smpymn8=DAMU z%}^!_Kxdy26SGX!MS=Gyg2}|C5CYecp&{mI0A+SQ>TEbz-p9&9JAL z^&D8a_L4lVR5nUQ_$i}t`y#VwfcK<`|GWF885MY3IfNn@tor-0BC+Hq_?X0y*gI+W z8e~r0Ci%r%dKeOE#2cMf**02#SvYau0rL)AOIm`T0q$eL8qw8=^UJJ;rHrmK4*KkY z{J8S53hUO@b`7|7W#y}Uf2LV?)9QYFpNC$+gE$v!g2f##$wNelWORMM+3$^V(lp;Q zqTB`p0%?Rh%eRjaa3(L30EEYCW0*|{@ibr)LrDrSl?BpGa(9o zejrC9F!+pdF}V~*^x`ii#o@A^^28l|O5S>;FRB7u6#nHt40`wDB*`D&#&V*cki~TQ z9d!UyT;kF1{JZ!{9c9}kQ7xHui{VUMCQGIB{A{94gpO0+RVpNfid3Sh{Mw9us%y6f zAF=k9ITR`<$lDruP8Uke+$dY~M1j)Y52?j;+;Z+^&Iym;69^+1wI%0S$@FG>g7xvH zHs&9h^NwF^kZG6pI`wO(%RJ@N6@v(td?&Wj|Jbr$Iv5!V{+8O+#%l<1Gsz$A2Pud# z&hHcX#y3gkBMMf#4eT*_lr$t18Yjq0QjXajffI1XHfyzt_x}7zQ!xKAJrp*yXFTCl zd)lwoXB9zTxVDY}C-AhJKB~U9*e$^t?WAa&?zqsy$;z#`I zc^`e^9G#+??Pfx})+`iJ_?FOts)c;e+Wqw#gEY#VGmAlFt;0;eTe2{@2SHBXYS^fe z%uHxrS;X5eD$q#Lk-Z($)8oPizD8UTX>Q63EtiUcCQu3mf*&YENV0(`$L&Lb>~g!d zQqC`*TaV87FXS%`78KFb)>oUU7TK@j_#L#w@o>Cu9t4m{URDlJ%vP8lKfVNZmmV4L zKnnFVT7NOe@Za0`%VF-ZpoAS)BXn2Q9=KVKA)uu2k=CQT9YWNH=)llMC9bDr?)FQm zzUc<(3RVTGi4UF2a0{y0_xL3$)zwV4OR^z1>VGd!RyXeoh!%}z_|CcU& z0PGef?RnJl0!h{e@#~HPht3NLh*t4-@%?Ie_*57yvox4BLhV@tLIQRjB(Na7ED*7j ztv^BLKy%TbeN9XE+Gi+c0^AESwxv}5b;fL1cYUd2Yayqo?-&ty(51aW32^K&w0!%n-)c2Qle|J-WTN1R zKRa+ZBto}fENpzZ6|82dV!_;cqfz?k_E=@h~@E$g!cyzSgZ-Vrt+2djAcRp z0cd5BPdI4-QV}EpYyB}R{;oJs`)4g5aQ%6E_P2Y@B=5cjOH*GJt&3LrF)p=p%6E=u zHeJmb0ebV`COWZC|Jn=icajN zU-?wqWQNki8qg%QNZnF{c4QpsakIvbBfQ|_smC;GYOBTirfrXLs2x=RH-0U(JuM+ z-X?31(wBxolUck;kF(r{Uq4}Oj!xQZn$HeICHt7vbR!8NmM|b`H87DxsN`--S#oKx zRM&J0O@)++;CUva_!{Q6B{%60-_i)T!jvy-5wRxlZcTxep%s;;@+end?}n$>WI@m= zXEH=<(>f)JHLk>vUSI@M7fYS?bj#A!yZJ_6%S2D!C zqNWU*_Mmn6@lN8%MND+}BK}|)&|Jm8%jhU3%-a;z#&vY}0rl`U2D1UF=5IMnb}r-E z-)fm;=}FCVi>W5o7yFpY^iaDDav`mOB7);$4spy6J%Mcn=pTU|Ijzs;zaS-;nRl{> z=AKo|8paS0{c8UHO8I0Pnb7u7d8YdX5*`Bfi%QUTfgJ@P&ozG^gT5~fG= zeYN5o;`GD&3eQRRz6t)yg~%|rrMa#3}lN5Bu- zQm_4Dim|cJARZ3yE#{yDFEbhfZm%OWGxk zZGr;qSK$Fur!H4`xkj(HRpcp?a-n6BvWy_%>~CPncHC`AUd}uL~v~i@^ zSNIUg^B7tyNx^)`@QY#AoiTY?l!ZEM9D4Y(-1pQ@=L+Xr13f?mI+R(X05;oI<5*h0 z3IPlC1xDy z49(IxH~~z_{np~aisJ_rL&p51%mzjXO;He9e(Fc=^P30)SIPRA0m|MU<2!OInmMW@ zQb~DoUg6%)fhBZJLN1Zu3G_aL>@Qdfzwd3PX*nY7J{H0TS4d`iPjN3S0WkytC5dGv z^kb;JaE}|hK%v)w^fn2~5#^EmvOt40!{>qbE1=mD-7a^ej45sk1zfC$TJLqDK&NH_$;-6V+HDzh)YwmJl3u+@r@#kNpI=?X>R$4* zjWS&UNj4@T``Zif50OqS(MLhK2jlb|iNP-fzy-2S=qXvk&>xj%&~+(O z1=eCNJk^d>rJnE9QCtexa$X8IN@(VLCMAWGP%TARoE`W#4uNdC00cH9Xx#a#gFmm^ zK-wN>k)MzV5oWK=dmo|&IC|&Sc?j#7WC;6zvRx2ejPCWYb`7`b0$+5%8wDIkL)li( zxH-I4Yy04Go^ksa|M2npu>CVk5_3{twmIR$%kFXl)Q4#ZY2Wk?c7CmMz2Rgp%5cDD zgW=Z>yTliFgBR-sl#swhD?ts?lVI(Yh_Bs1LF@%-j!OZBuW!`SA;}Na^m#uD6g_~w z$0arxsEe&47C%hae(0ILc3@%PUDE~u2-E|icj){jdy)Z)AA>^??NV=qf2GFX_nC@1 zzO3?@^W+F7R&@c`vu5lHsvb-up^~p={Ex)Shvgm6$Wd$J^<}^G9ARW(a|Z%A59k2y zQi4uROc+u6+f=EddMy1i7NDl{nGW6Q+^9I0N-3Vftn6N@#-lud*Gql+vCtY1jjAn4m`!yz0iNnwcv_Lu$~2|wc}F5m`~JoH`g1PZ_w_6 zy>=NAa8)rM1m&5^{u#Zm&-(lZ5(=%LQtO^TT*`Mb;1Y)Wr@^0Z=FwQJh~B_3L;jDi zx2UQLgxzDavb>U+0<&-Htb(6}wgJ&`gX@33VH)n+XB@aP3BM4Pz!naM&i(&x21Xe1 zdf*MPFZMQdXnu`up+N4zL}X*MY2(ped&_wuBffa<%lfM(*Ld8 zF8lO*!kpK(t{X5pl1CH@UCz+fJKIb))IHID0`@lD06KoE7cvX7L$@nC=fDScfJC+) zhGEWZ6PhqPbJEJieojG;i~8$6DN`nn>@ceS8FB(3Ca|zz-x2X!mZ7GmRlSymXExfI z3p_HRxuNR9$?xHNO_4zJvbsKe8Z&GN2WE!PzBO7ApX#`R5#th)nuNVm;zPg0!0pqu zf2OI#uY9G30%$kjHn{NBA}LQ)nB<5Pj?FSbL#)TAjc}X-aD|?BL%wPx>%|)$QOZz# zF%}aBM$*-355m~Oaxr^S0z3Np{t=~4BWaF*I5ed4S$g%l^Vf`LU{-hrWT7P4~e5p+{7xf_z>pU}dzedH){fS%cvPiEGMnv`l zlHx#C8Iv+3?g}X0eybK;^Gl@$U+hyiYs)`s$Z#k!A3JS9R@~CzD>EZxQ@H^R_0}uk zWq}}<*`6M%Fh+DNknP4!sZCbn4+vBbOH1 z{4&|K#3R?Rn5^pGdswuQXT0|*4vxAohfYTZ7G~l$kIx0Q7Tp~$o^WSRH3%??`_+f2 ze;dYFsHJ;v|47L`8kB%0_!gbOZfcb4h z%EQ;(C8rX1ID(b#G4)bZIq8OwUQe$vVhskHF@p7shRaq0toUK=F)g%37y5a@sqk>~ zVk3|;ojjNr7OkchZDl8^QvVuk2y;Tf(Ppi!XYRE`GjFm@@6L#%tm<3HzsAT35X9(_ zz9g8Vr#Z=<2}hL4K#qle-A@S@+CEl);nyiLoGZB=jV)r;FsPMxkgvvbm-k;i&Vjg~ zl08cIezf93VYxwc*TzU>dS`62+Fbz+))kGPFJ9(U?xxx744nmJF1)9I=FrImSkd)0 zElS3;1`c|PN{+JPAq&2olrkiiNm{_(i9iem0G_3A8iI+rg|J`qJYImLp`Jk&5C^~1 z$P(P#(f|O7c6-tvoR?`**b2(1?lxWfxdVk@(+kv#rydSK>$eyB&=$;Kp@wSgga|U{ zNOJU(T)Rp~J-Xci$job9I zvIr6cxvctIeq>n8_hIt*aT<*5$ZiT4LX1fO_CZ)|1&)v0=e27?G>y8}zIi;h5hne% zz6O)rGsb`^x1wy)5jzYE_N-bLknR;n%I~r+ml-OALU9iZWtM+?mBq^tsCg6@=4B(s zTL&&0{`bYhi8z0lwxS}>B?{k;i}?PErn62$${RDrevC;)bZOibI6R-bj>Mgwk8_}I zQ_Fe|<_xa)W%Qa|Z-5wz>d9#Kf%DnnC$h5E+Qv|l;!-jb`TQ>SIW1qqLyBFtV{6RG zl&aV9FOEpBM6%@M1*KG;=u>%j^P5`UyV-FMxw)09ro<(u1h*-hSZi*<%W~iqMHcRu zCyycaSkrz4xU>ZscBJ)>>b9T!vU?!==EIo_JqT4nSmeNGj{ zUTsb4O#&})2m4}cYO*|0&lS&W-s)ohX<=+x_szo<1?i05lmxA)^_vI(^Y@0!V+7U| z$Ntwhq$0cRG$w1{4zPKm%>%cEL$og8 zw7nQE4n5_gRrkWQg`$-sY4|i9rC&4A_w7XkMV-ChPePOp^Qw>r#Z8*7_IAp`YL3rM z%F5k0>o`lGR~I{02ipoZY+so?A6mj{=6f{@SVQW25|-%Z$ln@5uGJN&3Rz|{?yhfe zn5;kXCCJUz1o&Kxn|Uf}LEwAl3~B?!3Y{Nuo)7gu(i1N$${^pJ2{-%v@neOP`dU=G zKtdYz89faa+|Vg4t-k`_WExxXxh5z~U|LXy(OdSElQ8nH+pF$zsWM zsWc>TPt^!MQVY;UO`urw!I$CU7$)#tY7anm$RHO5MD`Q*aX^FB4#XSG8 zR1p7qK{495T8rZJt{ z!5h#{F@Ggt{E`GI3gKI?LP(n+Uw}f*S9lJ;@sg@U5$1S7_mAjnU+~Q!DVYl16+wtr z@gG3rkErF%HM3zQA0L4L6h652P#PcmQbW!4febg_4IR=V$$n^^4JE#hk*Lz6qYD zDjXGz&*V5EM@{`>JiVQG{RNU;YJCXWEqk6P(tQoCe1|qG+tchq)=%8mo@>Z@H;8v% zJIC6u%YxiWzaG!5KO{>pnDGj4NJH-F0pssHDChG z)0x(*Lwr9=V*IB6T*fZ+89*UgwM@+_3o_DK3u`E`pP&xZ4`})TMv2r7eP+e}Sq`7BBiyuE@AId*tD^S)ORvdj%)bFX31v7~a$r_kr!Qp4~79T};h36oQoF_AS!e!4nq z=S3jKLP~G=Cr400JW-rnLLGP()4W)0I%S6a5kk_dzb!CzJ-|m$ypH8`i-u*0K0Z#a zZ}li=EX3I4#V&6LYwsSiDHlzjfB|WcJwI@3=CR;Y>@$TA6Nv-(cy52T3hRPDa)5Mg zsCvD4at?~t^76hvdiP$lXpn19D3ZsJ^Zx(k=bd`;*~yDXrZT?6+B~kCkGpkD)q4VX z3hoQ0R8mP8yv)QAL6uUU_saFEBrjL=+)PcWaXwXR<1n~lM%$*@zdlbI-Hx=)EZ9Sf z6;ollFC8PIeRbt-I%P+B8p1x0gxm^+#mT2pD_YBFNTz&ZM;nq9M3o6=HF(D9pdVu> zQkj{Q$n*7~w>9HHy3IRwiC0wo0eQb}x--^c^MsN6G#`$5ph{+WK)kgpX?t0_O-pdXpH353yHDp+uGUxCQKKKP;H^DV zhZqz}(GOhAO~hO{!%V(EeCGkaho4{x;s_b z=FECLY0}7EqLgaNBatbhTu_d9fbBjP>%M5%!Grn zntCXj7|e1YqotV|7$?|=ofudd{F9Q!R{7aO|L1PHYCELWSBkS6SMS2$9#TkO*~_qY z)g$z065n%|imX_bt?rRw>rQA?JeqB3OsUJoR5+0sw>?UAn))2%Gl7 z_q;fQ;z9D<@&*}wW4p1KV6pZfnd)*8c547=ol*zxV1}X0rT=ZLZQgr^$a1hE%Lbrj zEmsmVzUKN)$F;#hV#-kAdVKMZ0FkQ(;OJz_Z|H8rGKvp^_+k)qetmE@z@kHMSDJ%J(9V@dKWgKe7CMVE_C4;R!dO?XfUldL%gZnx3R|fj1B+ zi%_-n@n^Vb@Q-Bw1|!3pu@i&igQIQ;+*Zjm`+NwV=nIu7v84rqr0@2?z_8`cD)F_( ziF0c1zV_z!z!@CmjC=*huI)8Q^F%TM09PIeF4oENs6%S)do{_r@hK(hl6>R)HCSNr z1cNl&J`9AY(;p7T1fl%Ma+3{(tKn_l>~wX-Hy*Zs+=_RV9bV|kxvXEv1s5b1fT1gu zL_@y(2pw-%62b>K%`8T7tJ5z0BFsIKHvdhzVTLf0+4t4N(b-<>21 z#-_d6mKzOfrJxyN;zbTG(PEpqPO6iAM?u}vMh{mzvT#NeD?>6~MrF5`d6C8WfGGuIs@k$4@HsNxcjS3~L~I~+K<(krxi7R<0YI^%m{dG z6h&oo60IeiG0T0rQUPV6@_2pL?XCA|?GdPj@%U)HS3!anqO4?@3=sW;btuoUNlvC= zIix*ytyZ|UejNSf*Hli<0|3>fMJJg%J0!6Cn=h!%xCX`&6A060c0H1p6<1Iz8}m>F z63h<~T{DPGK5*p&`CLbDD|s4`1Hm$glk(0u-3FR+dt3@?-!O=D?m#`&M=ICVcOmiU z(Rs5AcH^tnQgqTp+nDxvNY6%9-B03u#X29KG|_kB6{3RdByJ@EzBz0?Pz3n5#qWV0f@~;xJyIc@9_s4UXdK!C;Uu$sg_Wr_ZTpwge(l zPA=MhTFiVzySo5_8H=p_dedx}&gxMOeun_SNvx#&hlYikT=(bBu2Vaz@X3uiTr5Wi z`)o#u@hNrFX^*VV6>T@Xp&bcIM^gnW>j9`WV+8#cha$?nA|>}Iptd>~YxMW+*>P#L z9CxmVM_(hHDf!|(@{j9NX|Tbc-Ic0CAc{JhBb&I-$0r(RvZnxwfaXv+m7?=y{Oi>G z-p|xthtpBl03?zyuFI+?@MsU+uDLZ6o<^~O8XU6&#C%+6U9yXV32TRjP}TpZGxic) ztHRszFuOrP#W+xj@bWV_blhDj?5ggOTZ;?qgd2Ay_PFvYvv1|zN#Y+ush3FC_ctrm zwoR)n&J>`d=E`-9D$tgYNaHRpH;`laAi>#lV($BNp*R|gh9vHfy1IQRJMFvs-6x%e+1@n5D6B#wj zzflX0+tO4}MV(P{V*J=xhrQ{tc6&bLavpwe`EX!;v#-i(%fMQWeNd zE=-y!f@eb*n_7`4zqQC|oG-@=p5RA9IDhAw2t5$ugrV-b{K&c$rQVcK`?eOKwOZ@4Wx`oX=M&UQ{R`0{h;KWUUs`Ok2p*6(&P+qj`aLmwQm#+u3s^9KUv7Bxb$Eage%#-)Wj zAyLMWcD3M{gUNV0z^@GCl&%s{flNHyD%U~mT^=JZ4pi&zG%N6pTV%M?WDPpq%2JE& zC`JT=n<>b}IcLC=CUZK+#e8XN0WvPdb-V@dGN9N^{EV6RO9=ud#@FN$c9w6=E+|Dgq_r)?8QDQ5S9rahu-*o4wio93}(QY))-!UG>})5if1JeRXG`l|M_xPLtA-3s^S zL6`w+0ZhcF)k)DYrKY#$5jTYqoJaNgBqC>py6>3W&vAE{K~tNDZB*Q=*Z^FjkY78V zOmxE*JfD}Os*C-O?4EqE3`l={bH(zeF0ODB5&IP1yjv8=@O_C!kWyX>bM17(en?fg zTD6V{FIY{v7UtMGzrSVl@a8BiFO)-wHr&rxHPKbQT$?shnA1BQ5U8S1@w~;e8n$bk zwi4vOgu;SoNECX)8Dd`rwM?riX;Q4a5~7jBg>8qquEriA0skDHHm>NTkUY~R$(dxu ztF)MseGgh%)r@}aJJpCi#2`X_xJ3bj?X-|~LK{dH(-d3Rp2rai%|Ev8VA45Ug6qdL zJo;+y6i06U;OlZ&z?=)9eLkitA(qNILqqJJmO6`);^i)UdoZodyb6y^!ygk26(%eb zR80(vd9DfXIzWcZb}&zCmZ`-2$o`AENMII#EhQtI`((48PUrgK=42Ygj}Nb>_9@{%S#pf|z2NVI4EPJMe2CTZ-uf`sZHM4^ zHd@?f>U9nF{$Z_H>=DjUSkc~6Gr`EWWbLn=8J;++zix;fg^$$+NLI|uh&jlmV&p78 zNo|J1e=3XQu+ABwgBoyT$F!JZ5(%Xw-PU`w4}-9Kte zK#&|fS(Xp>%k5>riNfn<%qU?lOu}v56KUzn$lyD=i~WO=Q;I%{@A?{{rpE?UwBLoN z3L;@_{C>k1QjZLxv96gP?JEN3Wek}`Ulco6GsPD)uVGyJKSzbI~eQ|4L$G%3i@9IG6kLk^5tOlqaE z4E7hX6cSIeN$SEgO0MX_(@u|-a8n33u^NhiRdgKf?eRrhGIGU~)MK+~G#m!U><(XS z7!vV=8U>m_oE1Ha9sDA(BHqGdR<3B={?13+cvAUr&Fb1tf||7iG}oxD;!87S7}=l(C=9AcTpEAp84NbT^$AT`@t4*)i4@alyVV|E zj$<;88Kpm(PNdYhMuC*GUV~FO=7Cx!fTLoXZAc+M^DUciZR@mLza~2MuR=Dybp}p) zorH!Ya8mqpZvw#8YXl|+3@C=s8!6HioB7g}@)8T^!Toik31r*H8&4YGCu}x{MWz*s zbP&ItP6fh4OZPGnYQl{vQ2P_6kUyV?qB7>IR}4FVa4S^`hqUOq<;B~U$8lXD0Aq7pDlo7D)+(mbYbj|eCFFOA9Qpppsex(-2WFs-4pQHqLUSQk zku0DLaYTAEKZOR2tX8Js=lf|?%p71rEaVdk2v3Q-11?hhzoBKBQo_wVQxOVqu2QK} zUIpF#Os(ln=Kc-m^`cWMvt+61<9AeNQ`@V`mH)d_FA>+(ik?C!mA~}WiS0A}1>}Ab zPFs1(?8Em1o$2QXCRy-NEAX0X?cnh;aD8$L^Kv3G?*~IvnyFBT&8wiBvNVdhOVD0A zb0l(cjE8FjM_#<+u(glB6$azAhKZ^sX7u4)3a19De%m8MuaOkqPYy1VYvSu5guaF6 za!FP!aM5#AurShV?qmY*m}-%o${1kJE!2l*9U0|+=Mgy_=z_{7Rr8ylV1Jfpizf22 zU51GNuMU5sNU;V9y8FkmMZX7F^srhxQ>d#zbxQ|36h{k7c??Y_yyXJK3Z6WZKD+#KKAk&IdZva{YrO!B9M-DV5!{SrTd98+ zf^yak$H2p!eP=a@;mvw#J!Yrpn=@k^q%^K=7&o;T!#D?=wrBwdzt~)D$q9RCohMHL z!k+ZgU~$e2kG@2mX+E-%3>k6ppr1FzP*rP*+XByg9cji1JtvB(ILuOs!-2tcLmN}I zCqyG}GPGXrwW~#!!CfiEBzpfzq}+En=|ZYYri8ZT_AV@Yc2h$P%$@)Gnp8`@2+;BX zRo4UEocX0aK$u8cs0qb|tR%rDEDK>Vfwvp;BLa^`)t2J22F#>cH~!urCPMe6c4P}k zSr0Eh-$s6xh4Ufl5gG4p>7Y<Wc~OGD}j(YEIMq) zk9~61uFVlT?PHzB#%+Czh;Wnl--nfpp?;K3 z!vu*INJ%)<-@zg7v`jP&=uBKEYR1GT)CKd((v!G!Ks9@5MXqWvYH%QiYD1s6GkTIf z@K4o3E%ghf1efJqanY~2BV3qn) zg;4y+LCG+`IKLWL@EBm01ImsIb=0u^*J0>rgJLg-shzY>HX~9g(%g#jey*Z568)vV^^3uJu)-3MI$2#7kuSt?hfmy9L-kIx>o`Jj>t=R8ZnSuzq z6E1#cTz|uo{{31hxXlnZ-cydpS@!$mr`NEzD|J_4Jx3K;uUfx8p!drWo%IjLl1J8V zZu%^y3lMfxQzNMkjxD5G1a_a&K&Xo#aUwd6aJ0O#KO_iz?66MV&@Ti#3HEHssTD(%K;5?Oz5__KWvdpDJ!}YT(m@YFtDcT zzQsSPYm~&o8rhu>s_f|{2U9ZgC^)|Qzu?PPUMlswdygHio+}K=+oo+}p$59E%q2sJ zpm9=2-|7Q3R?DScLJU`6Ps+^61?F!rB=#V5<2TH}Sf!XVruSvc2`?Fw6Ip5o)q|WA zotKob!dAUb_wcNcM?&2wR;MtM4BGf66K8!i_cHf&=w@;CFi4q{FbE-@(^Z*{krO4O zJ@A-Tm%CL1>oU88Q}^7=-y~+dE*mjV?EIhtff$RTBVGNrnY9XO>Zsl1#pL83=#qNP zezngic^NrpLv`TS30a4VE3Tofr2z^Yjlbyyr^4>1_@~luqX^adoSGPbZSe4eEBjri z=%+u)H%!x>Zze_v4>CdQ_R{XhDGq}Y28h?>5-~$+Tg<#(5kIsT_|p?p;}RASsj_-IUk!$jE6Xp{jCnoucN@g}9L( zFUG6;xp|A+B6He8$*LP?sonn5w&o{DWEW`esD0GatDIDfs61X=`s}Oyd zkCE|9Q7m#2N*M%6Q!AaOZ6xF`w1E+a)++&D&Q?2)H>!U7S~mPVArP6uknT*`%d1=j2rD5@QJTNcfu z)?cJOPF`cNFYYV>0`JNb{W27Z^^qbcRX9H?N@BX(u|s<6;erauiL*-h3H?C>I?WNp zO2D$UxHSmWO64IBDC-b{&|%T9#VAGP6sennHAR3u#2x_)B%a$KaOjJaRUPNuNwInve*gnn|*XXTA7akpGb~x)NM^7`a`Hv=Hn2*g1cuL=V zBQ>ti5@+vuC}s)%2uIzo_>-X4w+CD-f|O14K8HQd+)0&ft;=#e-+6c@XAhi$K?wGA z5lW}zuGS39yx>rq=z|JDt*K1d94keS-C+4g^0;Pdx4a=V_Y|wb@UYIo{0GkA5}JR$ z=zv*{i}aO{M*eKRL}?r}y~`4gM^AA}qI8W%%Ro{y8MhY@0dw=pw^zfVDdsUZQJ>e6 zFVmZoS~tuYD0uitc_heGCj2%{`X0PRrl2@CG+;q1xLdN!9A+OTta&#mJRo~jgjqji zZR&C6>Lv#h+a}SEzf3$Y4gaG2RJ6%FO00`N{hd}2wj3MN@pK%7h~<=%n4%*Yj2H_qYmT9BEr_(WVdl@#-nt$Tz5XQpzx$6r7&Z>h_r!kb;)ABl!2N zmWOzn@=iHz-=s=&zTs6}F^%u5Vj7?VHWdpAb7+RN8 zBuY`$%5?%;!U->_ZiL5(}rIA~K5Zjn%| zpZ~=1$C%9BlfFJ5@&SzONtFLz<2~n-Yz9}8eIvj8KiKL|8HxbDhydR_9j!Tb?$_;| zD&t2vgyV<9naS-+#i&Es&N#8F$-?US)?@Y#7$$w9Wh=uetrCg9`=1)Wo9;=WmJ?rp z{=1-9VcK``4&Ls2fQ7T(_7lWIez1l28~Nm`Y(`u|VWlgO)1BC_304x;f>(wke#+`Y zZ(_I>^+wYh^N{r>LA6;hG)u~VTI7>L-p*9~-k?#?VUD$Q35N5G;?!D zJ>_)Y12XlAZUE1eqF;+rOM9XJ{33Ui2i9;m5t?#NCClIC(mv$Y`W=I@A@TfWy2P1Q z*Aj$8g=edhsP$#OPoF(It>FTe$aIC$Z5BUD?ezjhGP&(7H%I0;)lSiuJvC6+w4s8Y zRyP$CQ`H7bc5?fBHtrg4TIt{UKH~{APu0m=hodL!R`=}ETOhZShPo!mW=-;E2!`N? z7|D|>*4Q;crV7uTd#a)0qF5bZdUUqbrGSm0g2SbnzL9r7tyq^ZmOE|V$X^L}vbjlP zyGP30T3JHrRZJS=YT@`Ii*D&KK zDA{Ts+1c~h04wC zx9k9eko0}FQthG31Np_LU&_msO!32QWFtmaal4c%f4W5)Zn-L;-3QcaXK_RdYWN*^ z56{I(UcoNLYy+a2%c@zHvkYGY))vEJwUoA zFALok#AEs8G;N zGpmO1|3^8%*eSFm3Y3-CLFu?Eh_zWUceF3P!%4IvwgP)gW%S~t2XP>0s>pWX#6ZmXe2JcDIOq-AzNU~!X-B8CRf-qJ0Wf2Soq-N5fww^^FiRS9 zE1-RH<_M?;0SD`k={0bDAgygI#9u6uy4Y>!9KHQiu3_%nRb8etBN50`dD)WW=@nXQ0iIsiUXl{yK6X`$U zgR@3)R?aPrnbvW;@>D#{6ynJyVwel%q>xH_WsQPWkQdB=zA^HwC4P%+T{bBEG+Zj?M(t+nJu|b zwiSKfYD&}3`rG;&{N4qT3UOZfk>@KT#*dCr_fu(n+C`$$tD)s9k_tJH(iFx!#-DY_f8&UM`RG1H&MMZ}xvd9Xp9HPayM{11&~j_G4%h1@M4ii# zHg#3;Aqo}}#0r$%Q^Fbx5WCd7lVo4%8>30k`kZ7u^BGbhN8CPBi5(WM(_d|b?u*@b`&a^ z0Hqu;^gtJ1jzwBWR@;v874n5Pzc|n@%A}&3xAOOZp$^ zdEyzQeIJO-Nb)7%4#f`tRfM6Vu0bk8zGU0FCGrM{8WoL%Pwir)f3HqtdOV&v^)2We zN6#ToC(P4KR6ybF&xlR-V^@vh;b?%J!NU?7B>pmC1id}e<^<#VcMWtQwvbwooq%No z+ps7a#DvukV;LEC#Edr#Y7Rg(3CJro8^r3K=WuF`IfK!|8!#BZrqO1kAHq+ZSWmvc zsgd%#HOgje+W(yJwuKtuxqpTXNfO6-T%N!Z+ zZbsMF>`(A9I#5H2lj>`G`ri(1 zFLvlB^Zs&imV#1&jf*EI7E)DuO2e_ScaAoa+1^U#QE%}*5L>|Omj=& z3d&!LSv)@bt5JtvEw^|Qf}~;=2E>-G0?uKDVG!ZvnoRzVYlMvkdUWY*w4>6&?9G5 zpH~K6@rI9@;5e}Fie|T()$g$+Rel|uOq)~BE#>0@CX%A?FDOa}@MFMYN(zAsjIsqrp$C{@$F1}p8K zF-$;dF+3f)=^@d0Tphf)P<~jG&+jHh`x3Pa7!psiYxl3d11o%>Z|upt11QDHvHseb zUK=9T zZEJVnlNx^BMU-v$C19zby_Qf&`kxhu>!$F}d6qBa4fnmhvud8EYG4Guaa-k-FNdjZ`!lH{+(E zw6xkdMyF+S6L_}$u})H@q3c@inR?&d;mt_Fxnsniy(ych}ClUJAOKXo2%`6g3a1=YoSLnM?QEAOshJtKj3(uTOUs zW_poql)(H;j(@eng!S2rK#FesK!CL!0`od?G5@)&Cnx}4kyUz!7V9TEi#x$0MQ~Z! zA{?X~b?LQB{l1tb=-+D1KZ!cIhH>Z_%(F>wrosbD@x&)*tM(fI7Yo31TLX&Chp^i9 zN3d05Nqmg!VFJn(`J5+cMSIMGeF{pX@{=+MS}O@xBKbpg^x9Pp!~a8=D;~{m`J~vC z%URz805{NXA76utW{k4h*jX{J>Z}Qyp6%(4ZfcG`22KD!GnNsF7dG1xIL^*)^j}hce8`fJ*UCE3L7;s`MWMDH?vw+mUd| z3x#j(qh+0tj#SqyeN%8KJlAe*+qP}n_O5N)wr$(CZSUH4ckTA{{r+>6n+KVdHIrmA zE9)l^%z12PJ=6GQE1|?Gu{wiZ4I@v^{JPI)AR_wRnpntae{M#GcSgu8!>3gnV)(Rl zh{^gs5lKa1*qk+;^zM#-?HHBFON7eT>`M9$0OctDQt{w}Z}@0d#m)M*8}zsqyFGxo_h3A^-Kh4XH^ARL%3I$K6-CBC?SDYNVce4<$ zXpzyWvRE7rUb7;p-jMQo9VAlcP=j9=z>x83{RqTeY9>|RmQ@VhDcB~W zQL>MCFVI<96%@8Uy1R})G?XqDIF;2NtkHVrVB%p;Kr+n}6_jk7kRF%EE*`7C-VI$I zQ8ytVH9cgx3Ml(NPB(u&?6wHsSb39Icu=8*9?BS-?H$@}^!kO^gqvf7FN@13BHRF# zT}|A1+)-9Y%}FcllvmA*0#mBk$u&GbdN5T|uV>?vi7`yQRQCGxoChBH(;Ycluhx&7i}3df z@``-Ts(j4E^KS?RDJplnRmirZQ`bv|<~q+U8S~bPl^Z8jt6{3)UBcPPHw`LeUVT}C zl%7rYxr2fAgc5kwR^K0|>Ab_6EV(@oxaZ59$ts0u=;4vp(ns}n69eg(bVeLik%s25 z2PciL6r|vu6h1I~m;DpJKz1#qBf5% zpig0NT}$ZlpN{Hyhf>|5Y}MPZj{a3n1Ut^~e?aN~A{KE_D)_!#2O*i0yvR9l%WKow zlI4}`2f$jq^&(Ybdmeyk^z2J!t4=2z457l4F1x;dw6xHuXh)cd%1^!Rm^si>&VAtngi_*_QOv|FYWy~OfQD2cP?UNC{ z8;r*{((VFE|0d#4h=b||oU&oR^J%5(=N)vWwlwcfqQ=;o&sW-IbAC1CDz`8Y-iWz_ zbDPesj69Iis&T2WXz%YM*Gm2;779GBe|hM*M+DI3xCM9*qrMIy{tTX)6RZSK8+WwVJq;Ul_(kr7EbOD>0S2@xk&zpWsm>S+kLC!oQKxCxiQwfh`;M_Lt>~W?=Nm+{e z4zrNjyrsj=qEx3fnpk~l4md)Ma-mpFtG3Zrm+`r)@}GpH&vMeFw;pnvie{uTnVv7ZLE>EIF zS+P|Y3dQnt97*pEdli_&xs|Cq)a)G5Boub8<(I&LASwiHZ`=xTx-dTW1ZnJ+$qFk= z%j%hI7)eI*Ryb>tBYX3Ko{R^Ws#=f;&yRTE*_&8`E&8q=6_21#$lohb9|lsU62wDJ zl5a1Fcu{?jF4KsX_w~Q&QfIoq`*fWz*{tVDw`^@z!8Bb;L~|vsW7kt51K&i`-`{Ri z6i=8YN;dZZp=087DX4_yjr{{A@7^G%Ju8qJNWyCW0H_(b1Yqf;zi>vCHdfd5(;toY zcsZv{c*AyT%II&zdlbtZDQqPc!~9p0I&>ijz9SNaE$rlO3fP|9q$=M7`ohew@R%39 z9u{{@dtB7ho%&UFYDt?Lmko5*Urvlwi53-aJU)*%oq_;4F1I&04zr9%+xRR1Q``?c zIoUTPm&@?I=2tPp8=3pBxUi}9eM-&TEme?6hJcp|78aSTm#z#^y}u0|429V*@AL`} zHox`C*oXPl8$AZen1k*po_C-g_5vLnaqt9EISlUB5!|HYS?lXI6)76mH4&aZOD#&3=K z_wR{BU;99wU=cbA9zmHoa?#%XEwU-mHi_d;duCR}EyRi|3m!ci)5KVZ55ny-SOD;y z15k?RXRvTV)jGCLvsTzoda7VtWEwL_qnE+5mL>KNWT@vRS)Ps)vrQeF zk{Qw3^RQGXTH@WY`D{sj>+VD}{S_E7s%?+(70`4nF!Tn;U^I5{al)6q6yUO5Y^(}& zDlcuRqW@Yh8f$7+-dC+npA`rx#sopRiEvmNG^x{XT z(zQdTsv9x)OpXdi3GldpVvNh4jbwpJ_<>vaL5!vNm)SW#DBd1-<88|u7XuC?3xAGA zd>*F^IC`sL3%ER>5h_}ta%PsVaWC?#I%R(G_5zP`3jPwsKWqDcY4Hht2!eN#VOf6( z@_=(r6i#P3ur%w!E@@?>10hKB8IZ#PT2sY;pnR4ktMPgLw5Qn~j!f z{*5o_K-gZ>O_0&ZLdKFRyS+iIn{eIVqTd9uojIU|p<5-7DpeUp|6miQnpe@()9tFF zbs)tPhEdm94>ZYOI5Nk~Ek+^ydTliZmGs@;=Yl0U1c_to0EcZ`K-=SAm&k9Ni@o9U zg$?Jl>!RU^PA^a!(`*3`(to;j_T6(0`+|>bM5Gf;XYOura2Zny;vrsk8hR3k>-K?e zNaq*}C0*gWh1gfO+aLzM%6co%l^#c9+hJLkg}jB8QsL=X`S$8GG;$BJbgw}G8}$2X zOI)~2c&IbbDCeLRH^&i9igiqsbd%16x9g5;5PCA>fM(O^fT_vTJ~a6@!e}e%bpXEy zC6*!c-t_LRV9l{MCf?)AC?kI$>bt)$s`)0V*RH=?FXmfW=#?F)bi**@v=@aY<;pJ` z`r~5?wiCvto}oNvPVH+2#t>X^KArg<; zw;AOXsX^BwI?sgZs^gIny%aQvL!i`>sG78EG(r~0AX#xx{KcbGWs$2faio#+a3d?0 zjI>x3+wKb@pmuR~Bd27t*ViJpyMVlI+Fp0_8O@w~(aO7lu>GB2Hqt%LaGU@n2{b39 zVMIw4$+KR$*)Pf87qT5pXI#Edq=c5dsgqCbg)%@}ExLL6z@9tObM!Ok=-^V>yU?x( zp98jGZ(N}&_MQZmdP7wnxMbz91rF6GVq;CMWRaBv!}Cgi0i%8bhODqvn)g7LFf!0R z$Tp@~F~|ex{u*ueutL&v?Fd!K6|aIF7br`R8KwBARAsiuq5)HR0i9H9o>34!T1o%I zNIuK-B_$+ma?ltWreEcfl-6FhkA7@|s6+V&qq{b!<}`^rR+BS~IhzFh-ILP7dm(O5 z(jvd!$pbW8Aw}>b@d;y8v~U&|<3(7voDdJq^{qE{`H9!RqaN6am7>!YT}=hEb08}Y zgcjo5H$duG!j4=h!rl3*1Q@r&Dw5#qR?BFOJZ5D~uhzQ6}EtP$$q-;8hE+i)g-wdmIE&k)@Q{14f(>mBMYDFqm+(i-*z4{U@-(fv zctLKyr`@cjYBhKH{m^SUzRrp4wPS)lFuLQ@kGez1AvC@$d>@6$m7b57s}DmR-qN)a z2nBfkAjqK9s0&lAwa;Fwx&eteV;6Npy{?w)nE7AsA_6^6#75hdH*-9kaZQI#IO(pB z{fy~rLwlfU%l870o@9 z5A*H2n%nyW_qi;S{ z)shHPC}RUKf(~s@686fZL%?B9X`EWa$-CvWbIm$Xg%30ArY#N}ChHF_4<4oLSo!>t1CpuvQi4 zfUNRc*;=u$dH)MwwHEn+f~;q7{u&32Wgrd6hM0EL>dNsoJu*Dn(2V6YkAdIUm1~40 z&t>{>OMl{XlBO{GI!CVcsdq4Y!)TmI_Vy9^lusaPiWYDdBzd-!F%Fi$!de3>)w5@Q zQ81XVJfvV#;X$*Iyn4%N$0es12k-^pl+x$w^{bAUMM%T%xnsb6{NXV^-VTK&G z+uUm)S`St`1={$WdMnJ^>}`Pob1Aak~Z#Ayfh~jc$sgl-MW@gh)!HG-+P% zW{lDST$x&Hqu``bUfP?z2$NR^<2J)Cf|1_92D}zV-jV|x7um>P=)laMM1^Q1%-sHC z)R%!(HBZ&Z6`x^bwHS4l`$BV!jbjJo$Kqdxj@x<9zUP2bNqRi4A^{f#Ozon$4XZ8vXrja`wq z{%Bfn6p+Om$1V8KE$H2U&&B|`;()l#$J`{YdQRYhIDEVG9Hh{;cj|tB55-buA@Y;` z;V{gf3b4yD8OG=Fh-t7K3|H4=#dm$*7E3Z8r2>6UCzgew+k0!u-U1FeZ08|lDr-Ez z-?_o&K2MG8T7QyY0`>U!CA$;nin5Ob4_IG~)=8rFa~&JRVKg_lnYB}@ND-Hb>Uwk_x>D3ivYtsTm;!#S6-Ph}oe*KbzW{uQG!+C&Ei)B5GfwMz_3lVL9C^89n^9LXwRL_G;px!jn z$Pn0CgQT3~Sd|xG5I{m=sO`sWh`FnRQ;QYbh^G-VpHXK7cD^-06I6>W*sJ02(O73Y zgrs6znKU5egtJ)Q%DKd$seJ2OyPDx=SljEWhncBU9&1%%t9d1c5UFHV;pzU#ZJl~g zaBJ=85i@Od=>lLj0{3EJij^F{Qq@zj3`@hw>;hD9>ipnc)Gc)u03%GL zr-z-dJn0?XNR4p?>;H_`fFKaiap307Vxm!TB0$yHy|5y~DhtcM_C8V6aSuN~KQ+`x zb$v7VMtX`LgHR1sDyF2g2i>8XIzNpezrV!@$zh%|hXiQ}NQG-o@5fFPMqd&tSu(BI z4SAlg;Y4Mpk`OsQ@4utPl2j$%_jjcWU->)0wnN+j`B5fOMFT-5v1t>9-7ksWE2@!Guj=5is6X}ZxJML!%s&EXf2 zUXQ@%Zr;s!7F7FkzeL<}CKSO<|izwhfx<%-yuQu<>%c{os%dS*H2aJDc&r%~t zMG<)eV914~AbD>z8nZwKumM~-&9V4^FmfqV$WyNpEolDfi@|m15*)bzy=;_Y5!~-4 zdJZl&iU;yNA4wcplPV5;7|e}3NYakl(4u|Dp_7cLf(&oC5t;)E~o}ft+UWc^Rdoz zD{EaR1pWBhSt{BDC_6w3vUr3{VIZJj3H)>o;tx&F!=mdmP8-0U~6mXMmvyC%k82@wKFA) z7=KxL`F##`$F1^OPGz?|%Y6uSruU!cCuE^ztIK z`8kBBnJUA(3m=W`iNF`)Nlr=o;%>UiAOCO<`;QPYQA(&>B8!V0ybD1(LO;RJxnDy^ z!qvy6+b0dN&wYD#Ezh`5h(UtLVhGamlxb3Tu8m8zEDSQ>)mJ5Ph@Xb;WQ%*7Z=8kI zaO~eKl%Sj}8CyA-X*_atcyn^4kN(~6~x#i_R;!m@lhVO zJDy3)%#3G|olu>pjUiezM!Cn(W!MM%7&-!I@=3^{;{xhKwPfL~Gu~{VcPRJG=`IHoIgO*G`@@=lsJ&7l-usmy%hJOEi6U6`hcoppJ zj?IP(;qx;QDB{wmc`?jrleJqkmir{r4KuT}^o=YH`R5L(teQ|@58MJ(9*kWE2zjE&~F{rW$e^31)1@F%Lk7amLpEKzK0U9 zSP?03aZf4t*8X{bONypH)bXmu8W-SxQr8!c8ql3pv4* z18U#a{E)`>{vgr)h!5~r9MN9NHZ*U2LjBV2!5vSw*ZD}kHv_=8@aPK8Etx@tbKneK zkm&ZX{4n_ij|!vH2zQT9;jFG(6a48dT4Nz>F#wY&l}keI*Cfh005Yd2h2sY3T6lOf zJ{6pl=tOG%QRR8X);l~T;&kCT@V}lroSis&?5Z!{Pn!=g$&t+Z%xvMd_2M_z4a*0h zal&lz_k1EMCn()>QHwQq0ZrOJoJ?^}!?#if4`UeRMVqR7n#xpqT8JTWNcW9xgr?vE zi!5!v>9W|Tvz0CVxz=o$L_4YrLjQ0*XFoXK$^m`4xR=$4{H!cqHS$bQI*SgRErHZe1C9P8Ytn_S zF+lIhO8A$zJA|mM;}XUHx46znv{v@qa;|3S@iUKuqh!xVBgu+>tdxIj0j>R+MjLX+ z-Cb(wjR9+cA-bXH@w0mf@NdkiNk4#-KIOy^+5U+YkYxxS2n||5>?a@C{_KGG+zX&d zV_);XKh{n0_N<&w9L)g50?rp+EC?saNqHHidvktm( zAv&!+o`9PPn?WfQ2&u-;_IH88T!To%CgGRN3PW&bBp5L70*O!A5co~@|He>%WDpbB z{9ODmN(RjqqDIs@Uk$VIUWJ!zxCn$1R$0dPx7@Bz8uT(+07sC> zE-JKtOM#qZ8VRwC>yYGGL5$j+K@HdOBgofjej+C(KkltuZom2nPBpxFV08Ec@a4!v z(d4Zn-q}#Mk|`$?JdWC(m~hMEh?6j5z~nDHKr-YTq<;BHDFeO(zMncaWoh=$-Dk zKkPW`B9s8{I5?8_b!`~DXrW``V}<{`l^YW(U;MD?Px0*_R!=H*P4))NspBp|kHFAj zA4PPE9C0LsJndz`8Kl(+xw|c%%z?)k;L|@~G4Db<$`v%-y2M#Qr61Ah%SJyga^pIhjOK53q~2Co4R!RC%wyjXfH4#AQ2$)$9^W% zac=<`$(Had8j%HoNGvs#sO@hcD3WIlfMtVQ)KKm@GV;w6maA8Cfa*ABVMxNJeAppp zO4Ix2@u1j_`vfZWCtEZNxW{l)`6#>8$Fy_A%V)ArY})8~k(pl*@jCV?@6geoZvN?B z*M(4V{aJJnEv0fz<7oBPQ=Ql`nlCsl0Ez-K+Brc=4F##X*=BHO2Oj(tt9=g+p5n^PnZ5i*jOFJ7Gf z%PuVbfjO=M=FVnn33sN;S3Bw`$S_Vy^LpS~InD-w-ekhH??1m6pZA=K*O1SFTYLE*! zv#hUNkB#NG^Hb(CYe~~RVXa;HI6EpkMIx$G|Crtq`Yr)_`gmTQ9gOFi*N$3UmYRM@ z`XXT@xWm6>tmPjfqamYG+&V+BUYIwZod#sB<$u(!@TQ?ajAjD-6HNgf3&rPe>8fA4 zLOi}`&e{>DzI1-At@M<>J(4ql!%1 zpRgcmevCb32TluZk8_)YLwhm#Yh$Vwk(b^y`Cg-t@9u1=J$Ob^Kh*OJZ-2e zMo9#N@7~8ehnPa8LgoXbGA_zy7>r8KAsBp=f)_D53OB<7wzW;by0B!2J~t8HGZT%v zl0YwJX4^N+I3Ekn=&-h3a3L@GLGB;@bWurY#?~SV#s+U^{)Tuu=t}nzlO<`%w4>6J z6Ta;0F+-j=I^JGH62WfP+X{mF?X|Vc4-r&V_!OwsMP)G`C0~3Vf}0QJI}}-5up3Nw zds1`_vt;=t6O_69!6d~2k=sifHPT9P3mz2n9;s1_b@}$A_!LV$COB)U2A>^`VqG}; zQ!l;Dw`{_3ohOxswJ2)eZmb!yYDnK4!WzGL(vMdF#@*HC=w&*oB(t^69-dE;VY_br zV@}$wz>(lA&_>!|jJIb!Na|OeI(yQOI~9K+*GQ4G+X~-pe_)i&;Xjytdz-U~ioNx> zW}xz)Y$m@rxWGK!Y^6qHxcnR{32 za{32XS-IE8BuwNPq_OXkj4Cge%h116Fg|sg{WSmW=A+oz4eENRN-ixmV&3`c$1=7Q z&P$l;cE4N)o#>iA#3;{q4_z8T5HN!eok5y)jbrQt(i1O0;EHJn`T)uBA<>w$1t}8y zi8SnzTdIQR(HnG#*hamf^RTTc&v?Ph;Y9EH5qlRF-kK%Qs_626Yz z$DvFCNs$%_ob?!%EapA-auB;H%5FX1CnoQvQN90QCJPs?w?K$rvRQ;m7CN<6vKB`d z{eqACaj2!fu(z@y>YAC;gRCQ3R6;X_SvetOmF2O~W=e*ENanrA+;1H-DY?!zJYl&} zARZD5KxZX&Crqq=ep~E;`v{ESeN4jQl@V8UV zSiJzB2OY@1#pYI zZwiTk@7*Ubwa0rY{{~#VckwB@?&TPiAci43dd&B67OaHJiabl^GD{%J;n1?Pd;tB_ zJl12BCuvWKI(oNjtvkz`L4@COM0VDgH`XBreic_=4_?PzKW9VyT3_iFf%wADcOdQC zFPc5BX{csy0QO~-cF+FRB3z00+qo!htTi|yeq0yC6C7PM)HYQ@#V-$HR?+%Vs#T1`JUfk|{x>U`g*}2(bfaab8{6qeGDJS9SW#Dvx(<#@(ydUK0_o`zQvHj045<`MF z)GQ;`1E)jCU+M;|?v&D~GE%LF(yU5qs`9Bqt76++ff|3gIkhcR!js+Q!@04jPF^c*Tmis_YM*sFX%Q&*zm?39bc}<#fY$MW-QA?R#N@$Ejj6h(yPft(%8I|x%}ef z%ovAVneK}Gq#CW0&KgvkU8R5(0KyNA;BzudDE_Y(>1HT2vpQIt(Q2dZnI*o=M@i&G zqAi+~;Z*WrDtU-RxoUBQT&y_{z%>)woDW>B&zWzRCT7P=2S@|qn`EknMZ6q33q5p6tsNRQ+|D z`^{1U4={-#l4B@1mObFGb2C~eiKSWekaYW`;jHKPec`GzB*Iu79RAzPyRo^2~a=(LU2y z2%3vG@?nTVzsFs+T3Tw(RlZi5@ah5&fP^1i&b=NHDJlcR*9aEJeo8b|pRNX*25j8S zM{SPFeT5eFRVXL{l?3lBeMW9^f@ZPN9Sm)Gf7%*zppUUYBhI;`tMUad1>)ZQOXDk- z_kVWIODuE0(>yw&(#dEnjTiK_?hg))Vgo=!7ECeuG*n3oPdSn+Y!CLd3x6(f=d;-fm_Ve?6HBJ5vn|8mVsV~hZ-)G7Gx6flO z3!6o;iH1+Xr|Wii#UGjD$4tTA`AR#<;8l;b(8r6M(_XUkol0^@FO;+&sTgJjXN2UL zQ?~fj;@yOO6%7aZq@LNZUp`~k@V3^f`fa{m4_xPFI^fr0ggEO7GM0ZXO@!0;7b(-e zpx9&AP~G*AX+`^8<$RN?2Hb2r5)O;VIUp`Aj>SpD zdht~hHW20qz$gimo0Je_w<@y%T~Ttx11RCnw zZba^w$duVc^Uc#9YM+ow@7NW>3VOMI%6Gk$+~yTADj%GY*)}3=NahNFfN~G;&6j%lq1{`B|!~kNR2A@B4m}2fxp} zNwHc~*(21c4 z@5Dt&Sw-A!V;`^vi)8#k_yF>NTf+9L_YlwN>tzM(%i^{lVlkDnGDk*#d;_U4(oAQR zLBvzayy>`Ar6m<^3y6=X!eBcwzm9a{UA!Rrtg0`Xvc;>klL(P>BioP ztY9O<`xbUof8Rlma3)E=#E(c}l?GHGIRZ|E`7(Lkv}_16_$}|JU4uXfg7Zsa&MK6^JFv-v@_69;q3Wi<7Y_f?NM>&W)|O;2yE9K4J4%x#%;A~@ z^DlyKWB@(+D!XgTeJzl)0E9IDJfMhwW^z5vS=3eyfa8apbg|V;?C2B_(%TLM6EM#~ z)l-COMe2LN(JFYu9+mjK!siESqs3+4n~~xpPaU@A2w?FRmf9C`U@^_?`toeBt}wtV z1tbWejIdP*!i24;-Y9(3dnOQC#TfFEzNybM+>Q`t8=k?*yD(PwBL4Q~>&FF)&O=lKb%8kxkVG zcp`CdL7CB183e;EN|b}3VG1<(`&%DJZ8Db=)Vr^M&U2I>V}ySzqN4GtqbMhVxW1xO z=vL}u91PI2WTE4r5Adzw2#&Zp#vQG!%Yfs4m`IF6Qr$P+Q0)`)R%Al5XR`_68>6;R zrby9~5UF+`Az19+057yvqvibR#$R_2?BArlGCI4LdoiE={uvb-vkaQwq~@Ti6p_y6 zLN<=lO5#9<@kiOKA?6`CO0-M#j_kZUfmbC7WUo4iyg&^L2|{Gu&8`V>y`kR-=i!TX zzxxkG^;zlg9*;^D(e{B{ z_kvcKZbkurT$l$jbqXWAQ!EvoZ7Dnu_;+aXzdrP#&$5 zP$3BL;kpFm8=fh!6)B%t_a#Csza7T9m>)hxr?-5GnZ}DmwL`!nf`&x`cpl3qDmuMu|nRmZt7El=5rFju`ACKL21$#7-=Oi@{ z$|;5cXP%Y&1Cvi#BMQQ}y)2d5at9jr-%kkEj;hQV=mO?yRzg;giRcR{4mwkkiEy3C zG+BAdF@ICuUAj%^LIUUGD0CKb}i#klufvB#P>u|EN?zsVrP5$-)A(A#gU1uxqFX zN|48z#7T|;-r6l7e+8>@i_M1t5HK*G&!eLcI>Vq|n7sReX)3lHp~NQ1k7Jcf-eW`J zGw3K%O3^qNINKleqJ`a~!MHp5$!IJ_V%QJM(^6h)@&~UFo`Yt#D$IQdx+p!`vc^gapE2(Q zKKRyG0*y2w)rfHL{u{~oh-NFP62#lkVP1xMi%uq(Yja&#)f^^bAN`_2cqUB_ZtK-o z7V1oH7b6iK8{A6wbqc0PfQ^x>sPt& zHY%&<-X1!8FpCsmx(_1hLB7}J*p8a140B7$gzm#Z@mJ&;LT$zKq!KUr^s^? z6by@564^CMdH!%O{^?(qhi$VtPUV1VBl#_Nb~S^?xeNn>F+9U-&yyZ$mz&V8j&akB zs8BYXvW5Sa(V{Yt?fEOE5)f@ls?DX%=phn8+s(9w-}TN53%l@#|2pPtOD4mh5rT0` zofs2fMz3NYKuydArS8$CQ6_?h#PZ)0MGj(jQ-Ptuoc;wwuH=AYboFs535vbhaA1i& zwanXy-{r}@VhVdbOu*OdsFox0=k>r-)*RYeZ|H^fjsiY^h_5+uB#0y+>%5G8jkRf# z)PVhp8GlsYq}&(4svsIm$%k77jtr|%)efJWp8E>ajxo-{v1{USi_BRbH7gqLSYe-M z5K=BO?DGNYK#1^6*=e+=9nSGtGjFcK@9zRXb=%OrHu@E%-t|x}2z~6s#W`zhI z;pDgR0&zw4pbsikk2jk#lM$b+eZ95XLqWeQTM{%VD0PCDUlX=c^HWf)avFXTs<0Ij z+ex{^>u$!e2BM-Plas}AHypw_RJLX~Y3k>6n86#Vtl zUw#8&Ff;6h@rJ)9?@!Vs8rGHg8zw~&8qG;%!X%OT_VLn?H+nzvvP%e;vA1Zt*rFy@Yy7=JU^QlN=y zFUl)nx%Ka@_7}yFTNqNM-B9eleGItBb#Z4yeeQ#;8BB2*zF% zZGNd8zPGli2P0`=YZKz5aBd^KqZ{2UHB}G7_*ZtiMLbgq*uyn}@CJCtyueQdD_)&m z3v1PA+tT6ECASgUP^7e(TIJ^fW&c$Uqd;aR9$z#OyTG%yDw5pzKGhtF$S>`B2Hak1 zR(MY2R!z0b+=;r`nY)pZGR#=bry*A-&fDKPiivY79gl;rL!1rx(Uu)pwAifgIi+-u zDz%JBpr%2#e%cIg9R%p11b1$1U_>PpW*DPas3;vy%NQWs(&$c0IL4+3yeQ*#>7ML2 zb&+mARi>VxJPu=*0@C~HyT42}(9vE1J+OBK!(AyBp9-8qT}KWU@>Xxn0kHXF5JjxC zaZZ8otITJ*pZU!7BohoLr6(LcKDC;u=^h6dfTd#HFS6&CuVl2PG*R8m53W3{fv4{L zV>@l8md@gMb+78l9O?C(8UhSEa4u&&7J_|B&SCaC>V0XvsPU8%@k<>8#9|0GT+Y&t zjpivRDn54U_d{HE^9K5OaV}~DH@ePMWG0o$azX3=ab=JI=j{?nA-N|fy-OqmDGpTl z#4rYO1}Kq^;kU@s=W3pBJN{Ga#epRWK$o-&FLR4KJis34H*J&pdl6zI7&|QWuZ=Y1 zqZLp`Xw!Rm)lb(=MMYlsN#RGcaK0bzDe@Ke6Q86I>XzDg(uW3X1XM0Qz9A&SLb|Y? zo~PJJh($@(>?_#g(re&ieU04|EKa|KV(1>Am*W!XO~rypbYvC6jT`yBJ2ZW%7)2PO z?AD+_=#O&iq@0)@bjiD?Nbex9wKpZ&^wr;WK$%@8v)->yyV&Dpk(XV;ecLkOz?M)v zu|ovTZO4~fMBbhz40x=>j!x*YfTZvb}LSY!1#-SoUsLAqw4*Y?@DzPA1m!VgwtrV`A@ta6hmkttubuFRkczh^|xWH zVDypI(q}Tpe3~MOoN@M-4`&eF3dxNNj3!GJpG=Hva5x7=AWcbJTmXGRQVc7Yk~X=g z)TL{6DNE%0WG89{mC1%4Bi_xOvyk2g zb>ct(!gt}tKEG*x8ZriNw=y}AYJ>iI?fzYULhPTtXK~aA003we%!DW%Zpwq^e@J~i zupE}~E~3`8Earh8FEfJFoSAFn#IFewgRLGtnr5l!o?rIeNNmHyl3~81MCTBEJP8>> zOa3T~98wc+g8hgc2;DD@_;~(yGj`flRJ!W3(zOq=Xbf9svbOhea0;Z04#bRHewE|x zk7KEoH;l<+7-`L>M^@JLfR~Pt`k}z?^#Jh4fY5@Jb->(EbB?kvs5`J0yBl#H5iveG zR(!aIpXBLkO~SNxK>VG#gkUa$dU(ZLqM@-P^U?E?JB|cE2>)up!TpW8{nv`aGzZ7? zZK`<@a)xdz`oCPudhT$8L(@Yf?YxmgCniadVgLXa0Kg+~mtQS>z+4P;5mL^dtS*Ua zhT|JWbbu(Pi~s-tV8AB;0Pccc2=_09{C|)sGt+A2C8D%4yBFK&h5Do(yr#bbUOy?t z4?_Id!}i3)6Z*^r#gy$>Oa#9I000cX!~Y!E|D$IPme86=pf&r%qsCYPJR1K82}HN} zh4B44i2t8Ms(%xjk-2zvo{rZ|*t~YEr(!|X&64fOl*`kI(z2xbDOT-`jqCG=MD~|I z000PKMF{`EuL8xdf@$%uNda?}V%KcN*(hYeB>*>6`$k@B$-I=ne_oCW>vszO-_7-Z zSQZE7x~t>S@U$zw5$k2K+YXG=QN?U&;IgGQ>1U`6fI>^qO92j?$a=Pb(Ek)bDAA$z zeifL0-9rCQ0Tla^A{>2~oz>&|ie?uUwWg@oNndxOS37@{d}USn@BiY!Q<3+}qWWc} z{vQi~Tk!sHCaS45S%9gyo$F zk_rX~A|HeIJVKO}kLr%mOU)-Si%ex|zH>nVAK$)WWB4LoqPG8nl9E~`TdR~}tZAU1 zrFkbH&5=lz;aKWDE`cA*iJEGWYYFt-z}m9ahH7RfW`y8o2!+@c#MMs%`Xpp8(PQYU zTZ|%%K(FF|GZxGxSUF&F`iTRqyIxp0T#6BnPxu17q*C* z0yc-jxUn;80u=L@vd`Abgo3pZhzb1a0@g|Ymw+t4v=hnygr_{mIS-W1XnqSiB1h|b z4k~4DxG@ONUA;-fKxYsz>N?Ibj{b|GIX1#C5962j{6C(xs^z@!9spojHvk}|_J0YZ zCzwfjv=IPk^BZ4)RHq*p%19lL3&5nWQG21IY$oK?%&&(EmwLKlq3H9DjOhA+hB5_M z1gbB9A?(r_s8Or`$JSRsRrN&gUb-7e=}zeuxDt|rfTVPX2nd3NTo6z?qy!`+1Qh8M z1SF(Gq(wSJT1iFToP+=O)_T9c%e8c!@7sH3_UygS%$~XTK4l5>_82ksH^IDd?+FGC zwa96~HVPprD8uPtTpRvF5;UQS%ocuV{4DDt-YC|qsN2n=5v#SSKmS9C-tjuiCY|)* z-QmZ{FBqK5Tn6Xfa1KiSytQTeB=WBo>6a5$CKpV@s&c#q1Qxj>0#SnkqC7y9 z^HLO@Z0IpNCR^X)jiRXm%|^1YRL{FlTw@`lfxj1k3_?j-;$J(Zg1%Sp-TjOi)-2?zn7#Hg0>bGc-o zLGf@E5FB6vO&JdFaZ%W&9_pV0Ur2#Cz$2W&wC9NyJVRf1*eE&W}V!z8B>BRO^{2^ddnRusigZ7#Jn!I%T;}rzv zP%a|8hh7LMfK1#CD-grfBU!w&Dx+Oed&54;){Luzw1gblhQP~1A&v=!tpFJs*~DdQ zw?d`sbEo}v|2At5xEH@%t4+@HDn^gNnXP zM(;+=twJb8?!}1>$AppqZv~b@X5XOli^;l(Q*$lYzO)CrAOPsmvel2g!Ng`hQfVFI z6CmG@T%3Y&)ph`bP}jhQVFkW40!4}L#9qIe8!gN*!xLgi0R|^4q@cekezknGEA`Cu zM7fn7*YU2gUZL4LYlYS1;fKtpq-RT+FW6fZFWW|(h5%XMRT>hoY#LMYYUIg3496Q_ zR>%xZc0*PcR@_$km&|FaK^wP`*?M)HtXvB5 zxWx2!2C{mqe{D_A$K%~kd-Jy*CfyA>a$ob@GxCex?p`#zt})pqWhxf&=m^O(=N`~d zwWckPo6%#-98l4SR3u~tnyH{%DuI@5YREyFyq+h9Y2!CN@*#hpXef-F*6Hh5YKZ1@ zwQa$_+oaf49Z1Pra@Q04M&LoiuEhr=9WEu&neh9bJ3a{Z`CBxf<#fwvt10XkckLgl zl&7E>3+S&s>*-qqv|H3Y0+ZdrWeX4)4GMN@K#qXO zFL{yob#kpxgh6cx1YrY!m;sauLpm=f)H1uSMD8$u%AICLh{b@3z`&pe99F<7y5unI zO9e(^xL9Utegv67Ye|?0EdIV!)q;@QGuPG05 zvN<*a@0vel$-DBxWxCy$U|9F&E4;!Mwq`W%@32iV(Cz`Pz)EJ=my#qC5;um3@RzWR z9!ifsyryhgvmuf7T;78a)rLTjRRS`Y0W&I?%uqh{(eU8*V9*796X*4T4^v)T2FG|w zmI6i43l12S0?@A^Gt9yqU?077QVcj!WA3==ys1`b|H0}OJx3y$(V&b#;JNOw06_#b zGTYWrkc~?rP7{B{4RzU3gd1c%kVjp?mv$wuXQtX6U(3FYCP?AvG(-S%Fx>!w1rStW zLJC)>&^BUQg5`Y%6JPmVjW$?M2ozIbo#*Nx0>xw3!y53#SS+ge3XVGff%87?9-x5i z==u<%q&qO7HS}CUXg?7MbWdc48~ek{0sR{h6nJ<@&u(2t>&c=PRa45F7%8U{*O`Ln z4_0rX62_(4@#+(<35-My{R~$suYGo&x`$EHHTseQt!eGcRa%*k)L7o6q)Il5bOUk~ z`SN@s;RB4F>ceD~97xU!pLIoplsn2eC)nBT6&l2w=KG@cnGG8U%&Q#kN2KH24G&J< z4d9Cpt_ysy`6{KoYEVEPI_FE85YNLsCM37;Dk{uJay9Pcb?%+R>G|C>=Z5gpTMePa zy{P+=4+PhP*B)X&3kr|25R88;pk*VR0*g_n0@RQJ8OfSA!`i1SJ zZiJVxR%11jyDdhUcIMiCN}uX%GaJ$8s&*B$8eyFB@Z*#SmH6E5`y_F`^X-0&(7;y_ z27gYL)QR`!KK3O2$&!*2_N5(RADX{x(rQ|KnhVX{4v@4BisccZ$-z&E$&f$F`teOv z^_ihcUV<2Nlyh6N;OT)vpbUN3$K%pm>0zZD)kyxcBh$anZd#r$PU5_}*J*2Yi#KMz zRx}ztSSmgXsOYa|CJe|VZ+**5 z``Z^iplc!S)u*#}Xo0s>9=$5*jAaWk2$(E>tGOXY+uvx)eHOYxZv6IXbA(Ra;>n^B zfmOx~U;eg4>*pr^`QzP`40q||r$4Xe>DM@adh15ekHgv%@RD2%clp~`RviLg^Ws$1 z!@Bml{yN^W>z2tQ=VuItTQeX0ls;COqzoyHzs?QBBmTffV5?52YX9bN(R|Uac0kgP z@$~kFf9iJ<}9X*iQ4<;m7Un|5dBl@pi(7NylO2?=c-wiP}GO4|F zFRqN!N9_q?x{r?s?gU-(BQ~D(CpXy+;@+4~RUC=l%}+kll4%R)XRX1|v460lG0BK4 z{$o90K3!+CFIh_R=g31T`p)stPEL%z&>}DT?Y+-P(541jc0j5)oTP~{7(zI-3h=RM zSY4w?szgE?BX;Mi`N%Z1SQC#-U1Yw7eUzP*Vnm?bM=PV+OV6;HtyoI^S$MN;9{v4C z%?l{zZUAjXm)b~9ZJ)^z&8d$ayxa0|R=)>+lO<|;qH|ApZ2=)Z%TA%eO7E%U6wuD` zCk~%u?=2I41>*`wNwOW#;svzSU1}k9(OKctq;OxXQ}`M+$8zZQjp&b`-xGnz{*efA;e9#s+;6FVje`uve& z@UW;lxqz~o&g9g@M09QGBfXg|f${CRRhM1~A8wOZ_L62ymCfAYd00TPDNsxWD}JPE zPZ6=9gq*kcEpAog&qbhN4XU~{OR&kCxhN2dy!ls8Zh)Lo^ ze?EhiFS?AP#H*z!2Ya3%oKQG+!j?Yt!;N+X0?iSb5rm=3EKmmjq2K{S!9e3*Cos8q zLHXJwfx_kOvhTc4M-3fm%N^H@>vo5YDl3U+LLto`t%a`X);GWJm;OyrQkAgFoBKPN z>mA-+mvj)FO3_$e3S*za>rQJq7Y_~Yx+U$++1baUGP_2Wh ze*F$r^$>eNhu?cP!JdvRDj%L9-l7NNtYR@AZK?+`S++hIv%a{W_SIOTkd)pQn`fH) z*)Z|4_BAp7Vyy7q`Rz@mLY+@&AAN=IYo9+iax=xP_|CHIhb1vcv@es!YA~aK2qh|C z5;Y9kO3oC*<8HwiQY%w(HTYfFGX=iWrGpb^KS2dIe%O(5Nr~)c>@I!o6+_vkj6v@& zt(C9R|M=BBNNdjVY*`FP%2(6D-N^eVm-uT-h1IhNGjT^rTy*e zOljZd+=+3+!H`KjC43>mj9f=g9D1w#kW0Dr zbxH?+)#fw@i^q2{wYroU;Ypg_W;%s?m2p|!n))+q3C6$WwEeKt9;Quv^r8P%c%MI2 zytkV<8eNGL73J>V^hn)70_?L8TA&S8xQ(m6k8YpDUe_Lta+%XiQ0}C~xXbO*&+wOm z>yhFloxPLT^TMCHYX_30zMe0L>7+c8_*|9#*jsM(XD6ENP}*lG7(%Jl0_ZcmOo|9( z(6sp4MV-RjOxwI}#g$uLGv3#p(Ct!{eaiFZR?^vTufl0s!nZo}-ff{g-xTgY7h0Y0 zKU%(b#7$W0Vcqexx2ka*eLM~QwW8S-B>VJ@B~xtB0w_AfIKT;zkBWby_v(}5$ZMY8 zram)7(XTjR_!5Dy&;EEfo1CGUYwX6)z-pD}!%Dl%Kn^TPV;;hC>KAhz&1<}=E@-}V zyiaJzj<0f>ZC5|0vikH|uAKR$YsHwdv(}g?mjBxDEo&gD4J0FANu3gX;;J^HL!k%D zR~U&@GD_EUZd^}n=8PO&c@w)pQXOx&s;?ihBH%-7Q}Q$l^Vq18-Z+ow=uytq>ZMp* z;@^c?lUS)<<{Geyu$=D3qD;bbKFC3$$12AX-t6r zx=Z~cfrf?B$_IOEg~`Evw5F2epOZZ(#fFZs#Rt=8#~w+VyU>%$>wf)eBXrcSGFk^VC)zK|J7 z{kN9L?GWrD5lEnO0@nF&Ba($z)wZsBx}f2KQ#)BjZ%B9_k#$D*^mEEM_5Goj*XVz| zW|;^b)#2>7sF@I{jKBRGD3Jk5;P+S_*sa+02=D$9PuW6Zc&>z(NKuedR;AWaz3P&n zXK3Pd73-|}Y!<6q&pe3Utm|670HpPRH2g}+69YxSpH|sZY!owo9%#IeD3dT-W@6OO zU$AGgp(PXTbq0t&#(4j@mdHeh*x*6T7kp#tHS*x(g2LDcDpEGRranh9EX}wY-hGh8 z1(6xCw*NPaKmVUBj&mAm-H`mtBNXY9-5ZuV`*+CVT3;LPVluQT5q^RbkwppKS8)1Bw%U7rHi$R{I-EYbHV3Kvt!x#7hsEuNH+kiFfu(*CcIpfq76tW~WHV>#7iU-wFoB z58Em7J`RFzWGMk&->SsJoWEu?Kw zdqy+}?V3PM^CcA&wV4qkDOz4$SDh)7!btiet7#F4^=IdI)oyP#;??>_$kj3rT$h~G zWmqug24bKD^pX=6OC{xP^yoou3-5kC)+)4qEHv7NDfp(p>m0dVL3~2YJRlYMcD39> zveU#4%6!0wU#dbr3~dL6EdrnOc{_d4rA2Uxa~|-}2lSQZAuKQruiBuQjGVEySW4WF z=;$k8`#!icF0fBCq>ZS80s-vpUmC(n(w;BfwD}z^mVHtahk~|za^6OY+phuVJu)L( z>AyZj9Jb4_?|eO=LJ!xFR7#wP`r!k6`vAPw7v|`lEQntA@kWipR}rrRH#IrRKSe!b z<#~aYGEw2x#yEuijeXKWikL(E2T_AH5hdH~S*_)0k0EnIaE*|%d;z~p?RfJsB|>v)!m5tN_`5<}j`4p{cwe^hbq4hnMG3AIhTnc*C?R7T-Q8pE+su__y_~}~ zGP$vn7sxLhYIUBrHw{V$2q$EA;RH0n;BA{iXjAiwRKm8WuG^JR+5R)ZmHg$I2lii? zr8W5WPLE?L?c}8xsB!`{(k-YeZA}f7EO5fPClZi%gb=st8%8}?tjz7NPEt&D5o2v7 zIG57>;C9R+?PP<7F?&k>Rk7c!13F@?lCK%UN(Eu2B;!{ zS_e~gl04%l?mHA;D~{bVeh$hY7#IWxR4wQd%({yY6Zv{V6aT)Fk=klO0V!o5)eTGO zZK|b+EIKc08MT-nCK2?ggC9n1>vM`G>1BGB+W1p2WfiZuCWdhng)nbvo0R`Rtd`Kw za)*q3kK#Sh18OH_aJnpUj>kP*WMW*LL{;-4Za!OgBnR<>sT}=`*XG)F0!7l1Hb4h; znKC#(mN?(X>*{W&#>-JI+iRyoArJ(MLDBm{wn4viGc~gn!2<*vTJ}3^$c;;!{zS@_ zQc>tatJgrm7q}agy46LG#)hdQ0S$EF9TiM-c8x&Ze4900L;4OE^PmDzGcJnkA2E&B zWov46{FHYT14=|t7v6DR(gpmAL(IY!7)e5n5)jvW-}0cP;xB&wBd=FtG&QZ=`%kyT zWfvaVg`m`QB&FBDp@&s2VoP9|p#9{&!Q88xZybXsHs65JBKnXS@ACf}RFrh4@0sx? zbLgpDuAtLVVel8)k*~L_ifd(Q5hB3mIc<3G zi_FT^u2WHPNOP3@!Ajti0PdR`x~4n+fi&;_kO>5M-_xhqDgR~s#+8`k&MI-^5wo6) z!<{)+dGWrql~$rf>oryzY<{KrclWA`LGT%B^G`=Rn(q6#nI$dYp45ET`dXF8GOq9H zq<{iHN;(#O`(qZ;Knbftq6-?005ZGo;lCsrPZfqUaYf=Y0?i6kPz`8sMU@v8l-(R>83AaGyE+Awh zGg_bgFViHpy^TWem$T4$ITok&bYC4c$;rsAGTmVHcm+vcH9L2b;msUQ_(o3Fja_GY zNlX#>8XNQN6SwWJO#7;-{vW>%EP+p=;xYIRx?0RAJ*ODPeNhdWYx6-{iodV%f}D{jo=zxb|ep$_e!hbGAEPgMWXTfFF^ zl8tgB79;KKMLLIkiuGg`+tfj@$uDXJRyJKcvU7pH%8YlyNybq}$lN$347MN1%IY2) z=55Gd2nwSG+E^AEothc~S*aHlzl#`vau8QTaK^|JG1Pfj_k`!$5Z&52z9M*SDcWMB zYnopTQ3o_o*BydWM4pKH^_l5t;1c(kRk5?ub!5X?QL)@5?}c7;*f8t%H=GcMQ5E{>89Kk5H*1w%LWqC@0~BV>HVW{7 z2M)u*ohSO@A+v-3)?miWt5D-y>!|`KvV?h*E#4IPNI#mEP|Q=n2BpOlm1+z1uVfU~0!VD6nA7<001Wla5Qatc zxf<3HBJ zI&X3@%Qm7Ay5GKddFNl0u4JUq%tx|1tS!z}R`!_Q|eqC5YA&1M-N7FxmyPX6e!Ec`iNIef(Kf@YxS??Yq8S)BOf#s&zG%kUKLYvnT5ycm4=MmrUX< zv2Ll{pNAC)v@aySAJChK@gNRb_IxTd#hIyuV+Dh4&~R^RZtxfJ@;)XIy-5q5DFSDi zFM>E}`<>60zm0fW70f-?=L{2CK#-0&V^TA1Nd04VLpID*_}~(Ky@1^L>x=-l@{!>h zq!W>ag3I{f$c(A~B?;iWto?LBkEHz4hG#WNBVDnNsK51Ye1dc2&bOgkwR0_u5oJK|$k%j=@OG zspDrZPj^S*`wXs?(kC)sJFLm$oxG5syKKnp1qsMFU0|&`N7!nX?mV{bvSHt!528>& z^%-fJz#O0fXWfP4C{Og_t>!@HNNIfIKsDs62%2{3SOj=MBM=;b1V zXcX5QJC086UlVYsWRi18e?>e}a3QHuMBu2L{i3y!$OVKrWX49ve}e=M`3OVz_P0^4 zEu6Be`D%+v7as#8IN_i*8waPa=` zc~eO`Z7#vzho6R~@A1vz#)-CMWufsPhsI^Z$fq&Z!%FRL3>zkPS$=8oS!lXyj@sYUzRB8pZdJ zu>y2ZY&f|LiLS=>o{+S8>qF$htxfY=EbnZ7a8S8X=Uv>mvq~FG$d0E1@-C*^30f95 zd|?Kh;GWc7rV-sa)j_QAey@zTekcd`k2eqqerR%)kQt|J|1}QSQ(|%@j()W`Rz2|5 zz(f-n?p}66OUj6=?M9BApUVB^_RPK3e)LtM65-hf)X*by5J%96ppDjysÃZbfq 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 +pfT#nCFZ2 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 O`%`Xqj;9>#?EeSI-6PWg literal 0 HcmV?d00001 From bd02f998f2bf00fad5255f43ad0621a80d94ee83 Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 21 Nov 2018 11:32:28 +0700 Subject: [PATCH 09/60] remove last config access from main cycle --- src/compare.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compare.py b/src/compare.py index dca8a88..24c4a15 100644 --- a/src/compare.py +++ b/src/compare.py @@ -91,6 +91,7 @@ frames = 0 timeout = config.getint("video", "timout") dark_threshold = config.getfloat("video", "dark_threshold") end_report = config.getboolean("debug", "end_report") +video_certainty = config.getfloat("video", "certainty") / 10 while True: # Increment the frame count every loop frames += 1 @@ -145,7 +146,7 @@ while True: match_index += 1 # Try to find a match that's confident enough - if match * 10 < float(config.get("video", "certainty")) and match > 0: + if 0 < match < video_certainty: timings.append(time.time()) # If set to true in the config, print debug text From 231803461035b17fd8d64de856924054e7f5bd85 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Wed, 21 Nov 2018 11:58:29 +0100 Subject: [PATCH 10/60] Added more in-depth test --- .travis.yml | 4 ++++ tests/compare.sh | 29 +++++++++++++++++++++++++++++ tests/importing.sh | 6 ++++-- tests/pam.sh | 32 ++++++++++++++++++++++++++++++++ tests/passthrough.sh | 4 ++++ 5 files changed, 73 insertions(+), 2 deletions(-) create mode 100755 tests/compare.sh create mode 100755 tests/pam.sh mode change 100644 => 100755 tests/passthrough.sh diff --git a/.travis.yml b/.travis.yml index 2997d16..3e0a5f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,11 @@ script: # Install the binary, running the debian scripts in the process - sudo apt install ../*.deb -y + # Go through function tests - ./tests/importing.sh - ./tests/passthrough.sh + - ./tests/pam.sh + - ./tests/compare.sh # Remove howdy from the installation - sudo apt purge howdy -y @@ -27,3 +30,4 @@ addons: - ack-grep - devscripts - fakeroot + - pamtester diff --git a/tests/compare.sh b/tests/compare.sh new file mode 100755 index 0000000..969d550 --- /dev/null +++ b/tests/compare.sh @@ -0,0 +1,29 @@ +# TEST MODEL-FRAME COMPARE FUNCTIONS +set -o xtrace +set -e + +# Make sure howdy is clean before starting +sudo howdy clear -y || true + +# Learn match 1 +sudo sed -i "s,device_path.*,device_path = $PWD\/tests\/video\/match1.m4v,g" /lib/security/howdy/config.ini +sudo howdy add -y + +# Text compare matching with same camera input +sudo python3 /lib/security/howdy/compare.py $USER + +# Change to match 2 and compare against the modal of match 1, which should fail +sudo sed -i "s,device_path.*,device_path = $PWD\/tests\/video\/match2.m4v,g" /lib/security/howdy/config.ini +! sudo python3 /lib/security/howdy/compare.py $USER + +# Add match 2 as a model to compare both 1 and 2 at the same time +sudo howdy add -y +sudo python3 /lib/security/howdy/compare.py $USER + +# Compare against a camera with no visible face +sudo sed -i "s,device_path.*,device_path = $PWD\/tests\/video\/noMatch.m4v,g" /lib/security/howdy/config.ini +! sudo python3 /lib/security/howdy/compare.py $USER + +# Clean up +sudo howdy clear -y +sudo sed -i "s,device_path.*,device_path = none,g" /lib/security/howdy/config.ini diff --git a/tests/importing.sh b/tests/importing.sh index 3f7bddd..4bb7c22 100755 --- a/tests/importing.sh +++ b/tests/importing.sh @@ -1,7 +1,9 @@ +# TEST INSTALLATION OF DEPENDENCIES +set -o xtrace +set -e + # Confirm the cv2 module has been installed correctly -echo "cv2 version:" sudo /usr/bin/env python3 -c "import cv2; print(cv2.__version__);" # Confirm the face_recognition module has been installed correctly -echo "face_recognition version:" sudo /usr/bin/env python3 -c "import face_recognition; print(face_recognition.__version__);" diff --git a/tests/pam.sh b/tests/pam.sh new file mode 100755 index 0000000..0f1f7a0 --- /dev/null +++ b/tests/pam.sh @@ -0,0 +1,32 @@ +# TEST THE PAM INTEGRATION +set -o xtrace +set -e + +# Make sure howdy is clean before starting +sudo howdy clear -y || true + +# Change active camera to match video 1 +sudo sed -i "s,device_path.*,device_path = $PWD\/tests\/video\/match1.m4v,g" /lib/security/howdy/config.ini + +# Let howdy add the match face +sudo howdy add -y + +# Test the PAM auth +timeout 10 pamtester login $USER authenticate + +# Clear the face models and change the camera to video 2 +sudo howdy clear -y +sudo sed -i "s,device_path.*,device_path = $PWD\/tests\/video\/match2.m4v,g" /lib/security/howdy/config.ini + +# Let howdy add the match face +sudo howdy add -y + +# Try to open a elevated session through PAM +timeout 10 pamtester login $USER open_session + +# Verify we can close sessions, even though howdy does not use this PAM function +timeout 10 pamtester login $USER close_session + +# Clean up +sudo howdy clear -y +sudo sed -i "s,device_path.*,device_path = none,g" /lib/security/howdy/config.ini diff --git a/tests/passthrough.sh b/tests/passthrough.sh old mode 100644 new mode 100755 index 8822b50..629d142 --- a/tests/passthrough.sh +++ b/tests/passthrough.sh @@ -1,3 +1,7 @@ +# TEST USER SUDO PASSTHOUGH (NON-ROOT) +set -o xtrace +set -e + # Check if the username passthough works correctly with sudo howdy | ack-grep --passthru --color "current active user: travis" sudo howdy | ack-grep --passthru --color "current active user: travis" From 9ca5be97fb470ab1b4b7a09a7173357ac27b622d Mon Sep 17 00:00:00 2001 From: Luya Tshimbalanga Date: Wed, 28 Nov 2018 18:18:12 -0800 Subject: [PATCH 11/60] Add Fedora --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 4493f0c..d216bb8 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,14 @@ Install the `howdy` package from the AUR. For AUR installation instructions, tak You will need to do some additional configuration steps. Please read the [ArchWiki entry](https://wiki.archlinux.org/index.php/Howdy) for more information. +### Fedora +The `howdy` package is now available in a [Fedora COPR repository](https://copr.fedorainfracloud.org/coprs/luya/howdy/) by simply execute the following command from a terminal: + +``` +sudo dnf copr enable luya/howdy +sudo dnf install howdy +``` + ## Setup After installation, you need to let Howdy learn your face. Run `sudo howdy add` to add a face model. From 359720e566ae9f0a7f8c40ab46e97be93f0c22e8 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Wed, 5 Dec 2018 12:23:07 +0100 Subject: [PATCH 12/60] Switched to pam-auth-update for debian installs as per #107 --- debian/install | 1 + debian/postinst | 71 ++------------------------------------------ debian/prerm | 23 +++++++------- src/pam-config/howdy | 6 ++++ 4 files changed, 19 insertions(+), 82 deletions(-) create mode 100644 src/pam-config/howdy diff --git a/debian/install b/debian/install index c35719b..b4e148f 100644 --- a/debian/install +++ b/debian/install @@ -1,2 +1,3 @@ src/. lib/security/howdy +src/pam-config/. /usr/share/pam-configs autocomplete/. usr/share/bash-completion/completions diff --git a/debian/postinst b/debian/postinst index dffcc5d..c2035b4 100755 --- a/debian/postinst +++ b/debian/postinst @@ -140,75 +140,8 @@ print("Howdy command installed") log("Adding howdy as PAM module") -# Will be filled with the actual output lines -outlines = [] -# Will be fillled with lines that contain coloring -printlines = [] -# Track if the new lines have been insterted yet -inserted = False - -# Open the PAM config file -with open("/etc/pam.d/common-auth") as fp: - # Read the first line - line = fp.readline() - - while line: - # Add the line to the output directly, we're not deleting anything - outlines.append(line) - - # Print the comments in gray and don't insert into comments - if line[:1] == "#": - printlines.append("\033[37m" + line + "\033[0m") - else: - printlines.append(line) - - # If it's not a comment and we haven't inserted yet - if not inserted: - # Set both the comment and the linking line - line_comment = "# Howdy IR face recognition\n" - line_link = "auth sufficient pam_python.so /lib/security/howdy/pam.py\n\n" - - # Add them to the output without any markup - outlines.append(line_comment) - outlines.append(line_link) - - # Make the print orange to make it clear what's being added - printlines.append("\033[33m" + line_comment + "\033[0m") - printlines.append("\033[33m" + line_link + "\033[0m") - - # Mark as inserted - inserted = True - - # Go to the next line - line = fp.readline() - -# Print a file Header -print("\033[33m" + ">>> START OF /etc/pam.d/common-auth" + "\033[0m") - -# Loop though all printing lines and use the enters from the file -for line in printlines: - print(line, end="") - -# Print a footer -print("\033[33m" + ">>> END OF /etc/pam.d/common-auth" + "\033[0m" + "\n") - -# Do not prompt for a yes if we're in no promt mode -if "HOWDY_NO_PROMPT" not in os.environ: - # Ask the user if this change is okay - print("Lines will be insterted in /etc/pam.d/common-auth as shown above") - ans = input("Apply this change? [y/N]: ") - - # Abort the whole thing if it's not - if ans.lower().strip() != "y" or ans.lower().strip() == "yes": - print("Interpreting as a \"NO\", aborting") - sys.exit(1) - -print("Adding lines to PAM\n") - -# Write to PAM -common_auth = open("/etc/pam.d/common-auth", "w") -common_auth.write("".join(outlines)) -common_auth.close() +# Activate the pam-config file +handleStatus(subprocess.call(["pam-auth-update --package"], shell=True)) # Sign off print("Installation complete.") diff --git a/debian/prerm b/debian/prerm index e0c5126..319be6e 100755 --- a/debian/prerm +++ b/debian/prerm @@ -2,13 +2,6 @@ # Executed on deinstallation # Completely remove howdy from the system -def col(id): - """Add color escape sequences""" - if id == 1: return "\033[32m" - if id == 2: return "\033[33m" - if id == 3: return "\033[31m" - return "\033[0m" - # Import required modules import subprocess import sys @@ -31,6 +24,16 @@ try: subprocess.call(["rm /usr/share/bash-completion/completions/howdy"], shell=True) except e: print("Can't remove autocompletion script") + +# Refresh and remove howdy from pam-config +try: + subprocess.call(["pam-auth-update --package"], shell=True) + subprocess.call(["rm /usr/share/pam-configs/howdy"], shell=True) + subprocess.call(["pam-auth-update --package"], shell=True) +except e: + print("Can't remove pam module") + +# Remove full installation folder, just to be sure try: subprocess.call(["rm -rf /lib/security/howdy"], shell=True) except e: @@ -39,9 +42,3 @@ except e: # Remove face_recognition and dlib subprocess.call(["pip3 uninstall face_recognition face_recognition_models dlib -y --no-cache-dir"], shell=True) - -# Print a tearbending message -print(col(2) + """ -There are still lines in /etc/pam.d/common-auth that can't be removed automatically -Run "nano /etc/pam.d/common-auth" to remove them by hand\ -""" + col(0)) diff --git a/src/pam-config/howdy b/src/pam-config/howdy new file mode 100644 index 0000000..28fb6b1 --- /dev/null +++ b/src/pam-config/howdy @@ -0,0 +1,6 @@ +Name: Howdy +Default: yes +Priority: 512 +Auth-Type: Primary +Auth: + [success=end default=ignore] pam_python.so /lib/security/howdy/pam.py From 683837df91b008f03ddb16d4c8e37d9fcb09db53 Mon Sep 17 00:00:00 2001 From: dmig Date: Fri, 7 Dec 2018 14:26:01 +0700 Subject: [PATCH 13/60] new option for CNN --- src/config.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.ini b/src/config.ini index 1f577e9..55e29d6 100644 --- a/src/config.ini +++ b/src/config.ini @@ -21,6 +21,11 @@ dismiss_lockscreen = false # The howdy command will still function disabled = false +# Use CNN instead of HOG +# CNN model is much more accurate than the HOG based model, but takes much more +# computational power to run, and is meant to be executed on a GPU to attain reasonable speed. +use_cnn = false + [video] # The certainty of the detected face belonging to the user of the account # On a scale from 1 to 10, values above 5 are not recommended From d7bc38ea167f54719de12373debff11761c6542e Mon Sep 17 00:00:00 2001 From: dmig Date: Fri, 7 Dec 2018 14:28:07 +0700 Subject: [PATCH 14/60] get rid of face_recognition module, support CNN --- src/cli/test.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/cli/test.py b/src/cli/test.py index cceb1a4..63af1d2 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -5,7 +5,7 @@ import configparser import os import time import cv2 -import face_recognition +import dlib # Get the absolute path to the current file path = os.path.dirname(os.path.abspath(__file__)) @@ -51,6 +51,14 @@ def print_text(line_number, text): """Print the status text by line number""" cv2.putText(overlay, text, (10, height - 10 - (10 * line_number)), cv2.FONT_HERSHEY_SIMPLEX, .3, (0, 255, 0), 0, cv2.LINE_AA) +use_cnn = config.getboolean('core', 'use_cnn') +if use_cnn: + face_detector = dlib.cnn_face_detection_model_v1( + path + '/../dlib-data/mmod_human_face_detector.dat' + ) +else: + face_detector = dlib.get_frontal_face_detector() + # Open the window and attach a a mouse listener cv2.namedWindow("Howdy Test") cv2.setMouseCallback("Howdy Test", mouse) @@ -86,7 +94,7 @@ try: # Grab a single frame of video - ret, frame = (video_capture.read()) + ret, frame = video_capture.read() # Make a frame to put overlays in overlay = frame.copy() @@ -100,7 +108,7 @@ try: # Fill with the overal containing percentage hist_perc = [] - # Loop though all values to calculate a pensentage and add it to the overlay + # Loop though all values to calculate a percentage and add it to the overlay for index, value in enumerate(hist): value_perc = float(value[0]) / hist_total * 100 hist_perc.append(value_perc) @@ -135,17 +143,20 @@ try: rec_tm = time.time() # Get the locations of all faces and their locations - face_locations = face_recognition.face_locations(frame) + face_locations = face_detector(frame, 1) # upsample 1 time rec_tm = time.time() - rec_tm # Loop though all faces and paint a circle around them for loc in face_locations: + if use_cnn: + loc = loc.rect + # Get the center X and Y from the rectangular points - x = int((loc[1] - loc[3]) / 2) + loc[3] - y = int((loc[2] - loc[0]) / 2) + loc[0] + x = int((loc.right() - loc.left()) / 2) + loc.left() + y = int((loc.bottom() - loc.top()) / 2) + loc.top() # Get the raduis from the with of the square - r = (loc[1] - loc[3]) / 2 + r = (loc.right() - loc.left()) / 2 # Add 20% padding r = int(r + (r * 0.2)) From d9e72c74dc6a4d93464992dcc59211b3f040d58b Mon Sep 17 00:00:00 2001 From: dmig Date: Sat, 8 Dec 2018 13:18:05 +0700 Subject: [PATCH 15/60] directory and instructions for dlib data files --- src/dlib-data/.gitignore | 2 ++ src/dlib-data/Readme.md | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 src/dlib-data/.gitignore create mode 100644 src/dlib-data/Readme.md diff --git a/src/dlib-data/.gitignore b/src/dlib-data/.gitignore new file mode 100644 index 0000000..e4d30eb --- /dev/null +++ b/src/dlib-data/.gitignore @@ -0,0 +1,2 @@ +*.dat +*.dat.bz2 diff --git a/src/dlib-data/Readme.md b/src/dlib-data/Readme.md new file mode 100644 index 0000000..a940a5f --- /dev/null +++ b/src/dlib-data/Readme.md @@ -0,0 +1,7 @@ +Download and unpack `dlib` data files from https://github.com/davisking/dlib-models repository: +```shell +wget https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2 +wget https://github.com/davisking/dlib-models/raw/master/mmod_human_face_detector.dat.bz2 +wget https://github.com/davisking/dlib-models/raw/master/shape_predictor_5_face_landmarks.dat.bz2 +bunzip *bz2 +``` From 0c384baef2a7760e6da44b9fb83b9cdc39e675ed Mon Sep 17 00:00:00 2001 From: dmig Date: Sat, 8 Dec 2018 13:53:30 +0700 Subject: [PATCH 16/60] speedup and improve face recognition; stable slow mode fps --- src/cli/test.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/cli/test.py b/src/cli/test.py index 63af1d2..8c8e034 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -1,3 +1,4 @@ +#! /usr/bin/python3 # Show a windows with the video stream and testing information # Import required modules @@ -59,6 +60,8 @@ if use_cnn: else: face_detector = dlib.get_frontal_face_detector() +clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) + # Open the window and attach a a mouse listener cv2.namedWindow("Howdy Test") cv2.setMouseCallback("Howdy Test", mouse) @@ -79,22 +82,26 @@ rec_tm = 0 # Wrap everything in an keyboard interupt handler try: while True: + frame_tm = time.time() + # Increment the frames total_frames += 1 sec_frames += 1 # Id we've entered a new second - if sec != int(time.time()): + if sec != int(frame_tm): # Set the last seconds FPS fps = sec_frames # Set the new second and reset the counter - sec = int(time.time()) + sec = int(frame_tm) sec_frames = 0 # Grab a single frame of video ret, frame = video_capture.read() + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + frame = clahe.apply(frame) # Make a frame to put overlays in overlay = frame.copy() @@ -174,9 +181,11 @@ try: if cv2.waitKey(1) != -1: raise KeyboardInterrupt() + frame_time = time.time() - frame_tm + # Delay the frame if slowmode is on if slow_mode: - time.sleep(.55) + time.sleep(.5 - frame_time) # On ctrl+C except KeyboardInterrupt: From 31dab29aa7ce6dec24aaee374ede04be35095f83 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 12:28:45 +0700 Subject: [PATCH 17/60] use default values when reading from config --- src/cli/test.py | 8 ++++---- src/compare.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cli/test.py b/src/cli/test.py index 8c8e034..c65c92b 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -19,13 +19,13 @@ config.read(path + "/../config.ini") video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true -if config.getboolean("video", "force_mjpeg"): +if config.getboolean("video", "force_mjpeg", fallback=False): # Set a magic number, will enable MJPEG but is badly documented video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested -fw = config.getint("video", "frame_width") -fh = config.getint("video", "frame_height") +fw = config.getint("video", "frame_width", fallback=-1) +fh = config.getint("video", "frame_height", fallback=-1) if fw != -1: video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) @@ -52,7 +52,7 @@ def print_text(line_number, text): """Print the status text by line number""" cv2.putText(overlay, text, (10, height - 10 - (10 * line_number)), cv2.FONT_HERSHEY_SIMPLEX, .3, (0, 255, 0), 0, cv2.LINE_AA) -use_cnn = config.getboolean('core', 'use_cnn') +use_cnn = config.getboolean('core', 'use_cnn', fallback=False) if use_cnn: face_detector = dlib.cnn_face_detection_model_v1( path + '/../dlib-data/mmod_human_face_detector.dat' diff --git a/src/compare.py b/src/compare.py index 24c4a15..dbfd5fb 100644 --- a/src/compare.py +++ b/src/compare.py @@ -59,13 +59,13 @@ timings.append(time.time()) video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true -if config.getboolean("video", "force_mjpeg"): +if config.getboolean("video", "force_mjpeg", fallback=False): # Set a magic number, will enable MJPEG but is badly documentated video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested -fw = config.getint("video", "frame_width") -fh = config.getint("video", "frame_height") +fw = config.getint("video", "frame_width", fallback=-1) +fh = config.getint("video", "frame_height", fallback=-1) if fw != -1: video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) @@ -84,7 +84,7 @@ import face_recognition timings.append(time.time()) # Fetch the max frame height -max_height = int(config.get("video", "max_height")) +max_height = config.getfloat("video", "max_height", fallback=0.0) # Start the read loop frames = 0 From 29c3a31a5bbffa3503d3da664598677f226e0430 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:11:08 +0700 Subject: [PATCH 18/60] fix models loading problem --- src/compare.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compare.py b/src/compare.py index dbfd5fb..9fb19e5 100644 --- a/src/compare.py +++ b/src/compare.py @@ -44,7 +44,8 @@ try: models = json.load(open(os.path.dirname(os.path.abspath(__file__)) + "/models/" + user + ".dat")) # Put all models together into 1 array - encodings = [model["data"] for model in models] + for model in models: + encodings += model["data"] except FileNotFoundError: sys.exit(10) From 01e706fce6d371658006d4e1bb4f8d8d35d1c4a5 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:12:28 +0700 Subject: [PATCH 19/60] speedup startup a bit --- src/compare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compare.py b/src/compare.py index 9fb19e5..6505eec 100644 --- a/src/compare.py +++ b/src/compare.py @@ -75,7 +75,7 @@ if fh != -1: # Capture a single frame so the camera becomes active # This will let the camera adjust its light levels while we're importing for faster scanning -video_capture.read() +video_capture.grab() # Note the time it took to open the camera timings.append(time.time()) From c8c481aed25930209e5a97af2710a69c18ee863b Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:15:31 +0700 Subject: [PATCH 20/60] use PATH constant --- src/compare.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/compare.py b/src/compare.py index 6505eec..73c3d1b 100644 --- a/src/compare.py +++ b/src/compare.py @@ -14,9 +14,12 @@ import os import json import configparser +# Get the absolute path to the current directory +PATH = os.path.abspath(__file__ + '/..') + # Read config from disk config = configparser.ConfigParser() -config.read(os.path.dirname(os.path.abspath(__file__)) + "/config.ini") +config.read(PATH + "/config.ini") def stop(status): """Stop the execution and close video stream""" @@ -41,7 +44,7 @@ dark_tries = 0 # Try to load the face model from the models folder try: - models = json.load(open(os.path.dirname(os.path.abspath(__file__)) + "/models/" + user + ".dat")) + models = json.load(open(PATH + "/models/" + user + ".dat")) # Put all models together into 1 array for model in models: From 1b8a7dc449f739386ad7956dda4193985be70c4d Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:21:44 +0700 Subject: [PATCH 21/60] replace face_recognition with dlib+numpy; support for cnn detector; calculate scaling_factor outside of main cycle; use grayscale image for darkframe and face detection; fix winning model index detection; some minor code cleanups --- src/compare.py | 126 ++++++++++++++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 55 deletions(-) diff --git a/src/compare.py b/src/compare.py index 73c3d1b..2d2f0c4 100644 --- a/src/compare.py +++ b/src/compare.py @@ -84,11 +84,33 @@ video_capture.grab() timings.append(time.time()) # Import face recognition, takes some time -import face_recognition +import dlib +import numpy as np + +use_cnn = config.getboolean('core', 'use_cnn', fallback=False) +if use_cnn: + face_detector = dlib.cnn_face_detection_model_v1( + PATH + '/dlib-data/mmod_human_face_detector.dat' + ) +else: + face_detector = dlib.get_frontal_face_detector() + +pose_predictor = dlib.shape_predictor( + PATH + '/dlib-data/shape_predictor_5_face_landmarks.dat' +) +face_encoder = dlib.face_recognition_model_v1( + PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' +) + timings.append(time.time()) # Fetch the max frame height max_height = config.getfloat("video", "max_height", fallback=0.0) +# Get the height of the image +height = video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT) or 1 + +# Calculate the amount the image has to shrink +scaling_factor = (max_height / height) or 1 # Start the read loop frames = 0 @@ -105,80 +127,74 @@ while True: stop(11) # Grab a single frame of video - # Don't remove ret, it doesn't work without it - ret, frame = video_capture.read() + _, frame = video_capture.read() + gsframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Create a histogram of the image with 8 values - hist = cv2.calcHist([frame], [0], None, [8], [0, 256]) + hist = cv2.calcHist([gsframe], [0], None, [8], [0, 256]) # All values combined for percentage calculation - hist_total = int(sum(hist)[0]) + hist_total = np.sum(hist) - # If the image is fully black, skip to the next frame - if hist_total == 0: + # If the image is fully black or the frame exceeds threshold, + # skip to the next frame + if hist_total == 0 or (hist[0] / hist_total * 100 > dark_threshold): dark_tries += 1 continue - # Scrip the frame if it exceeds the threshold - if float(hist[0]) / hist_total * 100 > dark_threshold: - dark_tries += 1 - continue - - # Get the height and with of the image - height, width = frame.shape[:2] - # If the hight is too high - if max_height < height: - # Calculate the amount the image has to shrink - scaling_factor = max_height / float(height) + if scaling_factor != 1: # Apply that factor to the frame frame = cv2.resize(frame, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) - - # Save the new size for diagnostics - scale_height, scale_width = frame.shape[:2] + gsframe = cv2.resize(gsframe, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) # Get all faces from that frame as encodings - face_encodings = face_recognition.face_encodings(frame) + face_locations = face_detector(gsframe, 1) # upsample 1 time # Loop through each face - for face_encoding in face_encodings: + for fl in face_locations: + if use_cnn: + fl = fl.rect + + face_landmark = pose_predictor(frame, fl) + face_encoding = np.array( + face_encoder.compute_face_descriptor(frame, face_landmark, 1) # num_jitters=1 + ) # Match this found face against a known face - matches = face_recognition.face_distance(encodings, face_encoding) + matches = np.linalg.norm(encodings - face_encoding, axis=1) - # Check if any match is certain enough to be the user we're looking for - match_index = 0 - for match in matches: - match_index += 1 + # Get best match + match_index = np.argmin(matches) + match = matches[match_index] - # Try to find a match that's confident enough - if 0 < match < video_certainty: - timings.append(time.time()) + # Check if a match that's confident enough + if 0 < match < video_certainty: + timings.append(time.time()) - # If set to true in the config, print debug text - if end_report: - def print_timing(label, offset): - """Helper function to print a timing from the list""" - print(" %s: %dms" % (label, round((timings[1 + offset] - timings[offset]) * 1000))) + # If set to true in the config, print debug text + if end_report: + def print_timing(label, offset): + """Helper function to print a timing from the list""" + print(" %s: %dms" % (label, round((timings[1 + offset] - timings[offset]) * 1000))) - print("Time spent") - print_timing("Starting up", 0) - print_timing("Opening the camera", 1) - print_timing("Importing face_recognition", 2) - print_timing("Searching for known face", 3) + print("Time spent") + print_timing("Starting up", 0) + print_timing("Opening the camera", 1) + print_timing("Importing recognition libs", 2) + print_timing("Searching for known face", 3) - print("\nResolution") - print(" Native: %dx%d" % (height, width)) - print(" Used: %dx%d" % (scale_height, scale_width)) + print("\nResolution") + width = video_capture.get(cv2.CAP_PROP_FRAME_WIDTH) or 1 + print(" Native: %dx%d" % (height, width)) + # Save the new size for diagnostics + scale_height, scale_width = frame.shape[:2] + print(" Used: %dx%d" % (scale_height, scale_width)) - # Show the total number of frames and calculate the FPS by deviding it by the total scan time - print("\nFrames searched: %d (%.2f fps)" % (frames, frames / (timings[4] - timings[3]))) - print("Dark frames ignored: %d " % (dark_tries, )) - print("Certainty of winning frame: %.3f" % (match * 10, )) + # Show the total number of frames and calculate the FPS by deviding it by the total scan time + print("\nFrames searched: %d (%.2f fps)" % (frames, frames / (timings[4] - timings[3]))) + print("Dark frames ignored: %d " % (dark_tries, )) + print("Certainty of winning frame: %.3f" % (match * 10, )) - # Catch older 3-encoding models - if not match_index in models: - match_index = 0 + print("Winning model: %d (\"%s\")" % (match_index, models[match_index]["label"])) - print("Winning model: %d (\"%s\")" % (match_index, models[match_index]["label"])) - - # End peacefully - stop(0) + # End peacefully + stop(0) From 82e4e9e10fd3b6f96f662f92744fcb3a309070f9 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:23:55 +0700 Subject: [PATCH 22/60] replace git dependency with wget|curl; fix opencv dependency; add recommended and suggested packages --- debian/control | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 8d2efa1..457d11d 100644 --- a/debian/control +++ b/debian/control @@ -9,7 +9,9 @@ Vcs-Git: https://github.com/boltgolt/howdy Package: howdy Homepage: https://github.com/boltgolt/howdy Architecture: all -Depends: ${misc:Depends}, git, python3, python3-pip, python3-dev, python3-setuptools, libpam-python, fswebcam, libopencv-dev, python-opencv, cmake, streamer +Depends: ${misc:Depends}, curl|wget, python3-pip, python3-dev, python3-setuptools, libpam-python, fswebcam, libopencv-dev, python3-opencv, cmake, streamer +Recommends: libatlas-base-dev | libopenblas-dev | liblapack-dev +Suggests: nvidia-cuda-dev (>= 7.5) Description: Howdy: Windows Hello style authentication for Linux. Use your built-in IR emitters and camera in combination with face recognition to prove who you are. From 9c2507ed137c4aea8d0543eac55acfd8df3fcd6c Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:25:02 +0700 Subject: [PATCH 23/60] replace subprocess calls with native calls --- debian/prerm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/debian/prerm b/debian/prerm index e0c5126..958c37e 100755 --- a/debian/prerm +++ b/debian/prerm @@ -13,6 +13,7 @@ def col(id): import subprocess import sys import os +from shutil import rmtree # Only run when we actually want to remove if "remove" not in sys.argv and "purge" not in sys.argv: @@ -24,21 +25,21 @@ if not os.path.exists("/lib/security/howdy/cli"): # Remove files and symlinks try: - subprocess.call(["rm /usr/local/bin/howdy"], shell=True) -except e: + os.unlink('/usr/local/bin/howdy') +except Exception: print("Can't remove executable") try: - subprocess.call(["rm /usr/share/bash-completion/completions/howdy"], shell=True) -except e: + os.unlink('/usr/share/bash-completion/completions/howdy') +except Exception: print("Can't remove autocompletion script") try: - subprocess.call(["rm -rf /lib/security/howdy"], shell=True) -except e: + rmtree('/lib/security/howdy') +except Exception: # This error is normal pass # Remove face_recognition and dlib -subprocess.call(["pip3 uninstall face_recognition face_recognition_models dlib -y --no-cache-dir"], shell=True) +subprocess.call(['pip3', 'uninstall', 'dlib', '-y', '--no-cache-dir']) # Print a tearbending message print(col(2) + """ From ff02a723d48a64b5e2863b0009f49042ca9106c6 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:30:25 +0700 Subject: [PATCH 24/60] replace most subprocess calls with native calls; download and install dlib from tarball instead of making git clone; configure dlib according to cpu flags; do not install opencv using pip; set use_cnn option automatically; minor code cleanup --- debian/postinst | 131 +++++++++++++++++++++++++++++++----------------- 1 file changed, 84 insertions(+), 47 deletions(-) diff --git a/debian/postinst b/debian/postinst index dffcc5d..53f0afa 100755 --- a/debian/postinst +++ b/debian/postinst @@ -10,14 +10,13 @@ def col(id): return "\033[0m" # Import required modules +import fileinput import subprocess -import time import sys import os import re -import signal -import fileinput -import urllib.parse +import tarfile +from shutil import rmtree, which # Don't run unless we need to configure the install # Will also happen on upgrade but we will catch that later on @@ -35,6 +34,7 @@ def handleStatus(status): print(col(3) + "Error while running last command" + col(0)) sys.exit(1) +sc = subprocess.call # We're not in fresh configuration mode so don't continue the setup if not os.path.exists("/tmp/howdy_picked_device"): @@ -78,64 +78,108 @@ picked = in_file.read() in_file.close() # Remove the temporary file -subprocess.call(["rm /tmp/howdy_picked_device"], shell=True) +os.unlink("/tmp/howdy_picked_device") log("Upgrading pip to the latest version") # Update pip -handleStatus(subprocess.call(["pip3 install --upgrade pip"], shell=True)) +handleStatus(sc(["pip3", "install", "--upgrade", "pip"])) -log("Cloning dlib") +dlib_archive = '/tmp/dlib_latest.tar.gz' -# Clone the dlib git to /tmp, but only the last commit -handleStatus(subprocess.call(["git", "clone", "--depth", "1", "https://github.com/davisking/dlib.git", "/tmp/dlib_clone"])) +log('Downloading dlib') + +loader = which('curl') +LOADER_CMD = None +if loader: + LOADER_CMD = [loader, '--silent', '--retry', '5', '--location', '--output'] +else: + loader = which('wget') + LOADER_CMD = [loader, '--quiet', '--tries', '5', '--output-document'] + +cmd = LOADER_CMD + [dlib_archive, 'https://api.github.com/repos/davisking/dlib/tarball/latest'] + +handleStatus(sc(cmd)) + +DLIB_DIR = None + +excludes = re.compile( + 'davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|' + '(docs|examples|python_examples)|' + 'tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))' +) +with tarfile.open(dlib_archive) as tf: + for item in tf: + # tarball contains directory davisking-dlib-, so peek into archive for the name + if not DLIB_DIR: + DLIB_DIR = item.name + + # extract only files sufficent for building + if not excludes.match(item.name): + tf.extract(item, '/tmp') + +os.unlink(dlib_archive) log("Building dlib") -# Start the build without GPU -handleStatus(subprocess.call(["cd /tmp/dlib_clone/; python3 setup.py install --yes USE_AVX_INSTRUCTIONS --no DLIB_USE_CUDA"], shell=True)) +# Start the build +cmd = ["python3", "setup.py", "install"] + +flags = '' +with open('/proc/cpuinfo') as info: + for line in info: + if 'flags' in line: + flags = line + break + +if 'avx' in flags: + cmd += ["--yes", "USE_AVX_INSTRUCTIONS"] +elif 'sse4' in flags: + cmd += ["--yes", "USE_SSE4_INSTRUCTIONS"] +elif 'sse3' in flags: + cmd += ["--yes", "USE_SSE3_INSTRUCTIONS"] +elif 'sse2' in flags: + cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] + +sp = subprocess.run(cmd, cwd=DLIB_DIR, stderr=subprocess.STDOUT) +handleStatus(sp.returncode) + +# simple check for CUDA +cuda_used = 'DLIB WILL USE CUDA' in sp.stdout log("Cleaning up dlib") # Remove the no longer needed git clone -handleStatus(subprocess.call(["rm", "-rf", "/tmp/dlib_clone"])) -print("Temporary dlib files removed") +del sp +rmtree(DLIB_DIR) -log("Installing python dependencies") +log("Temporary dlib files removed") -# Install direct dependencies so pip does not freak out with the manual dlib install -handleStatus(subprocess.call(["pip3", "install", "--cache-dir", "/tmp/pip_howdy", "face_recognition_models==0.3.0", "Click>=6.0", "numpy", "Pillow"])) - -log("Installing face_recognition") - -# Install face_recognition though pip -handleStatus(subprocess.call(["pip3", "install", "--cache-dir", "/tmp/pip_howdy", "--no-deps", "face_recognition==1.2.2"])) - -try: - import cv2 -except Exception as e: - log("Reinstalling opencv2") - handleStatus(subprocess.call(["pip3", "install", "opencv-python"])) log("Configuring howdy") # Manually change the camera id to the one picked -for line in fileinput.input(["/lib/security/howdy/config.ini"], inplace = 1): - print(line.replace("device_path = none", "device_path = " + picked), end="") +for line in fileinput.input(["/lib/security/howdy/config.ini"], inplace=1): + print( + line + .replace("device_path = none", "device_path = " + picked) + .replace("use_cnn = false", "use_cnn = " + str(cuda_used).lower()), + end="" + ) print("Camera ID saved") # Secure the howdy folder -handleStatus(subprocess.call(["chmod 744 -R /lib/security/howdy/"], shell=True)) +handleStatus(sc(["chmod 744 -R /lib/security/howdy/"], shell=True)) # Allow anyone to execute the python CLI -handleStatus(subprocess.call(["chmod 755 /lib/security/howdy"], shell=True)) -handleStatus(subprocess.call(["chmod 755 /lib/security/howdy/cli.py"], shell=True)) -handleStatus(subprocess.call(["chmod 755 -R /lib/security/howdy/cli"], shell=True)) +os.chmod('/lib/security/howdy', 0o755) +os.chmod('/lib/security/howdy/cli.py', 0o755) +handleStatus(sc(["chmod 755 -R /lib/security/howdy/cli"], shell=True)) print("Permissions set") # Make the CLI executable as howdy -handleStatus(subprocess.call(["ln -s /lib/security/howdy/cli.py /usr/local/bin/howdy"], shell=True)) -handleStatus(subprocess.call(["chmod +x /usr/local/bin/howdy"], shell=True)) +os.symlink("/lib/security/howdy/cli.py", "/usr/local/bin/howdy") +os.chmod("/usr/local/bin/howdy", 0o755) print("Howdy command installed") log("Adding howdy as PAM module") @@ -149,10 +193,7 @@ inserted = False # Open the PAM config file with open("/etc/pam.d/common-auth") as fp: - # Read the first line - line = fp.readline() - - while line: + for line in fp.readline(): # Add the line to the output directly, we're not deleting anything outlines.append(line) @@ -179,9 +220,6 @@ with open("/etc/pam.d/common-auth") as fp: # Mark as inserted inserted = True - # Go to the next line - line = fp.readline() - # Print a file Header print("\033[33m" + ">>> START OF /etc/pam.d/common-auth" + "\033[0m") @@ -196,19 +234,18 @@ print("\033[33m" + ">>> END OF /etc/pam.d/common-auth" + "\033[0m" + "\n") if "HOWDY_NO_PROMPT" not in os.environ: # Ask the user if this change is okay print("Lines will be insterted in /etc/pam.d/common-auth as shown above") - ans = input("Apply this change? [y/N]: ") + ans = input("Apply this change? [y/N]: ").strip().lower() # Abort the whole thing if it's not - if ans.lower().strip() != "y" or ans.lower().strip() == "yes": + if ans not in ("y", "yes"): print("Interpreting as a \"NO\", aborting") sys.exit(1) print("Adding lines to PAM\n") # Write to PAM -common_auth = open("/etc/pam.d/common-auth", "w") -common_auth.write("".join(outlines)) -common_auth.close() +with open("/etc/pam.d/common-auth", "w") as common_auth: + common_auth.write("".join(outlines)) # Sign off print("Installation complete.") From 377241bd2ef0d685e6fb85a7ad1c1071d47d5e76 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 13:50:35 +0700 Subject: [PATCH 25/60] don't frighten user with slowdown message, it's not so significant; notify user about max name length --- src/cli/add.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cli/add.py b/src/cli/add.py index 4fe11d8..4283f1d 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -46,8 +46,8 @@ except FileNotFoundError: # Print a warning if too many encodings are being added if len(encodings) > 3: - print("WARNING: Every additional model slows down the face recognition engine") - print("Press ctrl+C to cancel\n") + print("NOTICE: Each additional model slows down the face recognition engine slightly") + print("Press Ctrl+C to cancel\n") print("Adding face model for the user " + user) @@ -63,7 +63,7 @@ if builtins.howdy_args.y: print('Using default label "%s" because of -y flag' % (label, )) else: # Ask the user for a custom label - label_in = input("Enter a label for this new model [" + label + "]: ") + label_in = input("Enter a label for this new model [" + label + "] (max 24 characters): ") # Set the custom label (if any) and limit it to 24 characters if label_in != "": From b465982092a00523ac1c28c533dc98550649d353 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 14:22:55 +0700 Subject: [PATCH 26/60] dark frame detection --- src/cli/add.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/cli/add.py b/src/cli/add.py index 4283f1d..4432cbc 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -106,14 +106,26 @@ time.sleep(2) enc = [] # Count the amount or read frames frames = 0 +dark_threshold = config.getfloat("video", "dark_threshold") # Loop through frames till we hit a timeout while frames < 60: - frames += 1 - # Grab a single frame of video # Don't remove ret, it doesn't work without it ret, frame = video_capture.read() + gsframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # Create a histogram of the image with 8 values + hist = cv2.calcHist([gsframe], [0], None, [8], [0, 256]) + # All values combined for percentage calculation + hist_total = np.sum(hist) + + # If the image is fully black or the frame exceeds threshold, + # skip to the next frame + if hist_total == 0 or (hist[0] / hist_total * 100 > dark_threshold): + continue + + frames += 1 # Get the encodings in the frame enc = face_recognition.face_encodings(frame) From 8671be425d2e880cb6249c70aafa1f8449e15f67 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 14:24:50 +0700 Subject: [PATCH 27/60] use defaults for config values; simplify path detection --- src/cli/add.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cli/add.py b/src/cli/add.py index 4432cbc..86b0ab8 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -20,8 +20,8 @@ except ImportError as err: print("pip3 show face_recognition") sys.exit(1) -# Get the absolute path to the current file -path = os.path.dirname(os.path.abspath(__file__)) +# Get the absolute path to the current directory +path = os.path.abspath(__file__ + '/..') # Read config from disk config = configparser.ConfigParser() @@ -81,13 +81,13 @@ insert_model = { video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true -if config.getboolean("video", "force_mjpeg"): +if config.getboolean("video", "force_mjpeg", fallback=False): # Set a magic number, will enable MJPEG but is badly documentated video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested -fw = config.getint("video", "frame_width") -fh = config.getint("video", "frame_height") +fw = config.getint("video", "frame_width", fallback=-1) +fh = config.getint("video", "frame_height", fallback=-1) if fw != -1: video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) @@ -95,7 +95,7 @@ if fh != -1: video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) # Request a frame to wake the camera up -video_capture.read() +video_capture.grab() print("\nPlease look straight into the camera") From 2c48350b232d2eb4068dcdddedff22d207dbc8fb Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 14:27:21 +0700 Subject: [PATCH 28/60] replace face_recognition with dlib+numpy; add video_capture.release(); minor code cleanup --- src/cli/add.py | 59 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/cli/add.py b/src/cli/add.py index 86b0ab8..28f6022 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -8,16 +8,17 @@ import json import configparser import builtins import cv2 +import numpy as np -# Try to import face_recognition and give a nice error if we can't +# Try to import dlib and give a nice error if we can't # Add should be the first point where import issues show up try: - import face_recognition + import dlib except ImportError as err: print(err) - print("\nCan't import the face_recognition module, check the output of") - print("pip3 show face_recognition") + print("\nCan't import the dlib module, check the output of") + print("pip3 show dlib") sys.exit(1) # Get the absolute path to the current directory @@ -27,6 +28,21 @@ path = os.path.abspath(__file__ + '/..') config = configparser.ConfigParser() config.read(path + "/../config.ini") +use_cnn = config.getboolean('core', 'use_cnn', fallback=False) +if use_cnn: + face_detector = dlib.cnn_face_detection_model_v1( + path + '/../dlib-data/mmod_human_face_detector.dat' + ) +else: + face_detector = dlib.get_frontal_face_detector() + +pose_predictor = dlib.shape_predictor( + path + '/../dlib-data/shape_predictor_5_face_landmarks.dat' +) +face_encoder = dlib.face_recognition_model_v1( + path + '/../dlib-data/dlib_face_recognition_resnet_model_v1.dat' +) + user = builtins.howdy_user # The permanent file to store the encoded model in enc_file = path + "/../models/" + user + ".dat" @@ -127,29 +143,34 @@ while frames < 60: frames += 1 - # Get the encodings in the frame - enc = face_recognition.face_encodings(frame) + # Get all faces from that frame as encodings + face_locations = face_detector(gsframe, 1) # upsample 1 time # If we've found at least one, we can continue - if enc: + if face_locations: break -else: + +video_capture.release() + +# If more than 1 faces are detected we can't know wich one belongs to the user +if len(face_locations) > 1: + print("Multiple faces detected, aborting") + sys.exit(1) +elif not face_locations: print("No face detected, aborting") sys.exit(1) -# If more than 1 faces are detected we can't know wich one belongs to the user -if len(enc) > 1: - print("Multiple faces detected, aborting") - sys.exit(1) +face_location = face_locations[0] +if use_cnn: + face_location = face_location.rect -# Totally clean array that can be exported as JSON -clean_enc = [] +# Get the encodings in the frame +face_landmark = pose_predictor(frame, face_location) +face_encoding = np.array( + face_encoder.compute_face_descriptor(frame, face_landmark, 1) # num_jitters=1 +) -# Copy the values into a clean array so we can export it as JSON later on -for point in enc[0]: - clean_enc.append(point) - -insert_model["data"].append(clean_enc) +insert_model["data"].append(face_encoding.tolist()) # Insert full object into the list encodings.append(insert_model) From d1d4d0af2314715d7ad2ef8a49a620e2c61ef1b3 Mon Sep 17 00:00:00 2001 From: dmig Date: Sun, 9 Dec 2018 14:28:16 +0700 Subject: [PATCH 29/60] remove last face_recognition references --- .travis.yml | 4 ++-- debian/prerm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index e3eb3ce..531897f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,8 +10,8 @@ script: # Confirm the cv2 module has been installed correctly - sudo /usr/bin/env python3 -c "import cv2; print(cv2.__version__);" - # Confirm the face_recognition module has been installed correctly - - sudo /usr/bin/env python3 -c "import face_recognition; print(face_recognition.__version__);" + # Confirm the dlib module has been installed correctly + - sudo /usr/bin/env python3 -c "import dlib; print(dlib.__version__);" # Check if the username passthough works correctly with sudo - 'howdy | ack-grep --passthru --color "current active user: travis"' diff --git a/debian/prerm b/debian/prerm index 958c37e..a4537f0 100755 --- a/debian/prerm +++ b/debian/prerm @@ -38,7 +38,7 @@ except Exception: # This error is normal pass -# Remove face_recognition and dlib +# Remove dlib subprocess.call(['pip3', 'uninstall', 'dlib', '-y', '--no-cache-dir']) # Print a tearbending message From 1f0ed1267a7c873314aef0dbeb6be40cc5146acb Mon Sep 17 00:00:00 2001 From: boltgolt Date: Sun, 9 Dec 2018 12:47:29 +0100 Subject: [PATCH 30/60] The dyslexia fix --- debian/postinst | 7 +++++++ src/compare.py | 2 +- src/config.ini | 6 +++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/debian/postinst b/debian/postinst index c2035b4..a66ff5b 100755 --- a/debian/postinst +++ b/debian/postinst @@ -53,11 +53,18 @@ if not os.path.exists("/tmp/howdy_picked_device"): # Go through every setting in the old config and apply it to the new file for section in oldConf.sections(): for (key, value) in oldConf.items(section): + + # MIGRATION 2.3.1 -> 2.4.0 # If config is still using the old device_id parameter, convert it to a path if key == "device_id": key = "device_path" value = "/dev/video" + value + # MIGRATION 2.4.0 -> 2.5.0 + # Finally correct typo in "timout" config value + if key == "timout": + key = "timeout" + try: newConf.set(section, key, value) # Add a new section where needed diff --git a/src/compare.py b/src/compare.py index b42dc38..509d751 100644 --- a/src/compare.py +++ b/src/compare.py @@ -89,7 +89,7 @@ timings.append(time.time()) max_height = int(config.get("video", "max_height")) # Fetch config settings out of the loop -timeout = config.getint("video", "timout") +timeout = config.getint("video", "timeout") dark_threshold = config.getfloat("video", "dark_threshold") end_report = config.getboolean("debug", "end_report") diff --git a/src/config.ini b/src/config.ini index 1f577e9..9d68d5a 100644 --- a/src/config.ini +++ b/src/config.ini @@ -14,7 +14,7 @@ ignore_ssh = true # Auto dismiss lock screen on confirmation # Will run loginctl unlock-sessions after every auth -# Expirimental, can behave incorrectly on some systems +# Experimental, can behave incorrectly on some systems dismiss_lockscreen = false # Disable howdy in the PAM @@ -27,7 +27,7 @@ disabled = false certainty = 3.5 # The number of seconds to search before timing out -timout = 4 +timeout = 4 # The path of the device to capture frames from # Should be set automatically by the installer @@ -38,7 +38,7 @@ device_path = none max_height = 320 # Force the use of Motion JPEG when decoding frames, fixes issues with -# YUYV raw frame deconding +# YUYV raw frame decoding force_mjpeg = false # Set the camera input profile to this width and height From 2013338155697913826a1a0e0c9b496acb7ed235 Mon Sep 17 00:00:00 2001 From: Tim Welch Date: Sun, 9 Dec 2018 12:06:31 -0500 Subject: [PATCH 31/60] Add initial support for ffmpeg Fixes HP Spectre x360 13t IR camera issue. The IR camera is detected by OpenCV but fails to work properly. FFMPEG works using /dev/video2 device. Added an ffmpeg class that mimics the behavior and currently used functions of opencv. --- src/cli/add.py | 11 ++++- src/compare.py | 11 ++++- src/config.ini | 15 ++++++ src/ffmpeg_reader.py | 113 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+), 4 deletions(-) create mode 100755 src/ffmpeg_reader.py diff --git a/src/cli/add.py b/src/cli/add.py index ca1170c..10c7330 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -77,8 +77,15 @@ insert_model = { "data": [] } -# Open the camera -video_capture = cv2.VideoCapture(config.get("video", "device_path")) +if config.get("video", "recording_plugin") == "ffmpeg": + from ffmpeg_reader import ffmpeg_reader + + # Set the capture source for ffmpeg + video_capture = ffmpeg_reader(config.get("video", "device_name"), config.get("video", "device_format"), 10) + +else: + # Start video capture on the IR camera + video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true if config.getboolean("video", "force_mjpeg"): diff --git a/src/compare.py b/src/compare.py index 509d751..98df282 100644 --- a/src/compare.py +++ b/src/compare.py @@ -56,8 +56,15 @@ for model in models: # Add the time needed to start the script timings.append(time.time()) -# Start video capture on the IR camera -video_capture = cv2.VideoCapture(config.get("video", "device_path")) +if config.get("video", "recording_plugin") == "ffmpeg": + from ffmpeg_reader import ffmpeg_reader + + # Set the capture source for ffmpeg + video_capture = ffmpeg_reader(config.get("video", "device_name"), config.get("video", "device_format"), 10) + +else: + # Start video capture on the IR camera + video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true if config.getboolean("video", "force_mjpeg"): diff --git a/src/config.ini b/src/config.ini index 9d68d5a..df2907f 100644 --- a/src/config.ini +++ b/src/config.ini @@ -22,6 +22,21 @@ dismiss_lockscreen = false disabled = false [video] +# +# opencv or ffmpeg. Choose ffmpeg if your IR device is a grayscale only. +# Run this: v4l2-ctl -d /dev/video2 --list-formats +recording_plugin = opencv + +# +# format to use for ffmpeg. Could be vfwcap or v4l2 or some other thing... +# +device_format = v4l2 + +# +# device name if using ffmpeg. ex: /dev/video2 +# +device_name = none + # The certainty of the detected face belonging to the user of the account # On a scale from 1 to 10, values above 5 are not recommended certainty = 3.5 diff --git a/src/ffmpeg_reader.py b/src/ffmpeg_reader.py new file mode 100755 index 0000000..679bc41 --- /dev/null +++ b/src/ffmpeg_reader.py @@ -0,0 +1,113 @@ +import ffmpeg +import numpy +from cv2 import CAP_PROP_FRAME_WIDTH +from cv2 import CAP_PROP_FRAME_HEIGHT +from cv2 import CAP_PROP_FOURCC +import sys + +import json +#import subprocess +#from ._run import Error +from subprocess import Popen, PIPE + + +class ffmpeg_reader: + """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ + + # Init + def __init__(self, device_name, device_format, numframes): + self.device_name = device_name + self.device_format = device_format + self.numframes = numframes + self.video = () + self.num_frames_read = 0 + self.height = 0 + self.width = 0 + self.init_camera = True + self.force_jpeg = 0 + + def set(self, prop, setting): + """ Setter method for height and width """ + if prop == CAP_PROP_FRAME_WIDTH: + self.width = setting + elif prop == CAP_PROP_FRAME_HEIGHT: + self.height = setting + elif prop == CAP_PROP_FOURCC: + self.force_jpeg = setting + + + def get(self, prop): + """ Getter method for height and width """ + if prop == CAP_PROP_FRAME_WIDTH: + return self.width + elif prop == CAP_PROP_FRAME_HEIGHT: + return self.height + elif prop == CAP_PROP_FOURCC: + return self.force_jpeg + + def probe(self): + """ Probe the video device to get height and width info """ + probe = ffmpeg.probe(self.device_name) + + if self.get(CAP_PROP_FRAME_WIDTH) == 0 or self.get(CAP_PROP_FRAME_WIDTH) > int(probe['streams'][0]['width']): + self.set(CAP_PROP_FRAME_WIDTH, probe['streams'][0]['width']) + if self.get(CAP_PROP_FRAME_HEIGHT) == 0 or self.get(CAP_PROP_FRAME_HEIGHT) > int(probe['streams'][0]['height']): + self.set(CAP_PROP_FRAME_HEIGHT, probe['streams'][0]['height']) + + def record(self, numframes): + """ Record a video, saving it to self.video array for processing later """ + + # Eensure we have set our width and height before we record, otherwise our numpy call will fail + if self.get(CAP_PROP_FRAME_WIDTH) == 0 or self.get(CAP_PROP_FRAME_HEIGHT) == 0: + self.probe() + + # Ensure num_frames_read is reset to 0 + self.num_frames_read = 0 + + stream, ret = ( + ffmpeg + .input(self.device_name, format=self.device_format) + .output('pipe:', format='rawvideo', pix_fmt='rgb24', vframes=numframes) + .run(capture_stdout=True, quiet=True) + ) + self.video = ( + numpy + .frombuffer(stream, numpy.uint8) + .reshape([-1, self.width, self.height, 3]) + ) + + + def read(self): + """ Read a sigle frame from the self.video array. Will record a video if array is empty. """ + + # First time we are called, we want to initialize the camera by probing it, to ensure we have height/width + # and then take numframes of video to fill the buffer for faster recognition. + if self.init_camera: + self.init_camera = False + self.set(CAP_PROP_FRAME_HEIGHT, 352) + self.set(CAP_PROP_FRAME_WIDTH, 352) + self.video = () + self.record(self.numframes) + return 0, self.video + + # If we are called and self.video is empty, we should record self.numframes to fill the video buffer + if self.video == (): + self.record(self.numframes) + + # If we've read max frames, but still are being requested to read more, we simply record another batch. + # Note, the video array is 0 based, so if numframes is 10, we must subtract 1 or run into an array index + # error. + if self.num_frames_read >= (self.numframes - 1): + self.record(self.numframes) + + # Add one to num_frames_read. If we were at 0, that's fine as frame 0 is almost 100% going to be black + # as the IR lights aren't fully active yet anyways. Saves us one iteration in the while loop ni add/compare.py. + self.num_frames_read += 1 + + # Return a single frame of video + return 0, self.video[self.num_frames_read] + + def release(self): + """ Empty our array. If we had a hold on the camera, we would give it back here. """ + self.video = () + self.num_frames_read = 0 From 693eef964a0676e7daf1b28fc546b523d030744b Mon Sep 17 00:00:00 2001 From: Tim Welch Date: Sun, 9 Dec 2018 12:12:50 -0500 Subject: [PATCH 32/60] Initial ffmpeg support Cleaned up unused imports and hard coded width/height values. --- src/ffmpeg_reader.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/ffmpeg_reader.py b/src/ffmpeg_reader.py index 679bc41..2b415bc 100755 --- a/src/ffmpeg_reader.py +++ b/src/ffmpeg_reader.py @@ -5,12 +5,6 @@ from cv2 import CAP_PROP_FRAME_HEIGHT from cv2 import CAP_PROP_FOURCC import sys -import json -#import subprocess -#from ._run import Error -from subprocess import Popen, PIPE - - class ffmpeg_reader: """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ @@ -84,8 +78,6 @@ class ffmpeg_reader: # and then take numframes of video to fill the buffer for faster recognition. if self.init_camera: self.init_camera = False - self.set(CAP_PROP_FRAME_HEIGHT, 352) - self.set(CAP_PROP_FRAME_WIDTH, 352) self.video = () self.record(self.numframes) return 0, self.video From 02a9aee63a97415a89a1664b5d2f8675e295fa41 Mon Sep 17 00:00:00 2001 From: dmig Date: Tue, 11 Dec 2018 16:24:35 +0700 Subject: [PATCH 33/60] convert timings from list to dict; move camera initialization to separate thread --- src/compare.py | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/compare.py b/src/compare.py index 2d2f0c4..d17b330 100644 --- a/src/compare.py +++ b/src/compare.py @@ -5,7 +5,9 @@ import time # Start timing -timings = [time.time()] +timings = { + 'st': time.time() +} # Import required modules import cv2 @@ -13,6 +15,7 @@ import sys import os import json import configparser +from threading import Thread # Get the absolute path to the current directory PATH = os.path.abspath(__file__ + '/..') @@ -56,8 +59,15 @@ except FileNotFoundError: if not encodings: sys.exit(10) +timings['st'] = time.time() - timings['st'] + +video_capture = None + +def initialize_cam(): + global video_capture, timings + # Add the time needed to start the script -timings.append(time.time()) + timings['ic'] = time.time() # Start video capture on the IR camera video_capture = cv2.VideoCapture(config.get("video", "device_path")) @@ -81,7 +91,12 @@ if fh != -1: video_capture.grab() # Note the time it took to open the camera -timings.append(time.time()) + timings['ic'] = time.time() - timings['ic'] + +init_thread = Thread(target=initialize_cam) +init_thread.start() + +timings['ll'] = time.time() # Import face recognition, takes some time import dlib @@ -102,7 +117,11 @@ face_encoder = dlib.face_recognition_model_v1( PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' ) -timings.append(time.time()) +timings['ll'] = time.time() - timings['ll'] + +# wait for camera initialization to finish +init_thread.join() +del init_thread # Fetch the max frame height max_height = config.getfloat("video", "max_height", fallback=0.0) @@ -113,6 +132,7 @@ height = video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT) or 1 scaling_factor = (max_height / height) or 1 # Start the read loop +timings['fr'] = time.time() frames = 0 timeout = config.getint("video", "timout") dark_threshold = config.getfloat("video", "dark_threshold") @@ -123,7 +143,7 @@ while True: frames += 1 # Stop if we've exceded the time limit - if time.time() - timings[3] > timeout: + if time.time() - timings['fr'] > timeout: stop(11) # Grab a single frame of video @@ -168,19 +188,19 @@ while True: # Check if a match that's confident enough if 0 < match < video_certainty: - timings.append(time.time()) + timings['fr'] = time.time() - timings['fr'] # If set to true in the config, print debug text if end_report: - def print_timing(label, offset): + def print_timing(label, k): """Helper function to print a timing from the list""" - print(" %s: %dms" % (label, round((timings[1 + offset] - timings[offset]) * 1000))) + print(" %s: %dms" % (label, round(timings[k] * 1000))) print("Time spent") - print_timing("Starting up", 0) - print_timing("Opening the camera", 1) - print_timing("Importing recognition libs", 2) - print_timing("Searching for known face", 3) + print_timing("Starting up", 'st') + print_timing("Opening the camera", 'ic') + print_timing("Importing recognition libs", 'll') + print_timing("Searching for known face", 'fr') print("\nResolution") width = video_capture.get(cv2.CAP_PROP_FRAME_WIDTH) or 1 @@ -190,7 +210,7 @@ while True: print(" Used: %dx%d" % (scale_height, scale_width)) # Show the total number of frames and calculate the FPS by deviding it by the total scan time - print("\nFrames searched: %d (%.2f fps)" % (frames, frames / (timings[4] - timings[3]))) + print("\nFrames searched: %d (%.2f fps)" % (frames, frames / timings['fr'])) print("Dark frames ignored: %d " % (dark_tries, )) print("Certainty of winning frame: %.3f" % (match * 10, )) From bedfa8020cf4557e8cc914f5cf357ef3127c7eb6 Mon Sep 17 00:00:00 2001 From: dmig Date: Tue, 11 Dec 2018 16:30:45 +0700 Subject: [PATCH 34/60] more informative debug --- src/compare.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compare.py b/src/compare.py index d17b330..cafdb0d 100644 --- a/src/compare.py +++ b/src/compare.py @@ -59,14 +59,13 @@ except FileNotFoundError: if not encodings: sys.exit(10) +# Add the time needed to start the script timings['st'] = time.time() - timings['st'] video_capture = None def initialize_cam(): global video_capture, timings - -# Add the time needed to start the script timings['ic'] = time.time() # Start video capture on the IR camera @@ -198,8 +197,9 @@ while True: print("Time spent") print_timing("Starting up", 'st') - print_timing("Opening the camera", 'ic') - print_timing("Importing recognition libs", 'll') + print(" Open cam + load libs: %dms" % (round(max(timings['ll'], timings['ic']) * 1000, ))) + print_timing(" Opening the camera", 'ic') + print_timing(" Importing recognition libs", 'll') print_timing("Searching for known face", 'fr') print("\nResolution") From c90d977352d7e93221ca04db7f19f4d0aeac6518 Mon Sep 17 00:00:00 2001 From: dmig Date: Tue, 11 Dec 2018 16:40:06 +0700 Subject: [PATCH 35/60] fix broken previous commit --- src/compare.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/compare.py b/src/compare.py index cafdb0d..8460ec1 100644 --- a/src/compare.py +++ b/src/compare.py @@ -68,28 +68,28 @@ def initialize_cam(): global video_capture, timings timings['ic'] = time.time() -# Start video capture on the IR camera -video_capture = cv2.VideoCapture(config.get("video", "device_path")) + # Start video capture on the IR camera + video_capture = cv2.VideoCapture(config.get("video", "device_path")) -# Force MJPEG decoding if true -if config.getboolean("video", "force_mjpeg", fallback=False): - # Set a magic number, will enable MJPEG but is badly documentated - video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) + # Force MJPEG decoding if true + if config.getboolean("video", "force_mjpeg", fallback=False): + # Set a magic number, will enable MJPEG but is badly documentated + video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) -# Set the frame width and height if requested -fw = config.getint("video", "frame_width", fallback=-1) -fh = config.getint("video", "frame_height", fallback=-1) -if fw != -1: - video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) + # Set the frame width and height if requested + fw = config.getint("video", "frame_width", fallback=-1) + fh = config.getint("video", "frame_height", fallback=-1) + if fw != -1: + video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) -if fh != -1: - video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) + if fh != -1: + video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) -# Capture a single frame so the camera becomes active -# This will let the camera adjust its light levels while we're importing for faster scanning -video_capture.grab() + # Capture a single frame so the camera becomes active + # This will let the camera adjust its light levels while we're importing for faster scanning + video_capture.grab() -# Note the time it took to open the camera + # Note the time it took to open the camera timings['ic'] = time.time() - timings['ic'] init_thread = Thread(target=initialize_cam) From f4d231cca8d49e03861cb1ca3491825c38651f36 Mon Sep 17 00:00:00 2001 From: dmig Date: Tue, 11 Dec 2018 23:44:30 +0700 Subject: [PATCH 36/60] proper cam init time measuring --- src/compare.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/compare.py b/src/compare.py index 8460ec1..758cdd1 100644 --- a/src/compare.py +++ b/src/compare.py @@ -65,8 +65,7 @@ timings['st'] = time.time() - timings['st'] video_capture = None def initialize_cam(): - global video_capture, timings - timings['ic'] = time.time() + global video_capture # Start video capture on the IR camera video_capture = cv2.VideoCapture(config.get("video", "device_path")) @@ -89,9 +88,7 @@ def initialize_cam(): # This will let the camera adjust its light levels while we're importing for faster scanning video_capture.grab() - # Note the time it took to open the camera - timings['ic'] = time.time() - timings['ic'] - +timings['ic'] = time.time() init_thread = Thread(target=initialize_cam) init_thread.start() @@ -121,6 +118,8 @@ timings['ll'] = time.time() - timings['ll'] # wait for camera initialization to finish init_thread.join() del init_thread +# Note the time it took to open the camera +timings['ic'] = time.time() - timings['ic'] # Fetch the max frame height max_height = config.getfloat("video", "max_height", fallback=0.0) From 62aabdf480f80b3400278cb1fc922886da297bc3 Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 00:08:13 +0700 Subject: [PATCH 37/60] initialize recognizers in threads instead of camera init --- src/compare.py | 87 +++++++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/src/compare.py b/src/compare.py index 758cdd1..9069e96 100644 --- a/src/compare.py +++ b/src/compare.py @@ -62,35 +62,31 @@ if not encodings: # Add the time needed to start the script timings['st'] = time.time() - timings['st'] -video_capture = None - -def initialize_cam(): - global video_capture - - # Start video capture on the IR camera - video_capture = cv2.VideoCapture(config.get("video", "device_path")) - - # Force MJPEG decoding if true - if config.getboolean("video", "force_mjpeg", fallback=False): - # Set a magic number, will enable MJPEG but is badly documentated - video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) - - # Set the frame width and height if requested - fw = config.getint("video", "frame_width", fallback=-1) - fh = config.getint("video", "frame_height", fallback=-1) - if fw != -1: - video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) - - if fh != -1: - video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) - - # Capture a single frame so the camera becomes active - # This will let the camera adjust its light levels while we're importing for faster scanning - video_capture.grab() - timings['ic'] = time.time() -init_thread = Thread(target=initialize_cam) -init_thread.start() + +# Start video capture on the IR camera +video_capture = cv2.VideoCapture(config.get("video", "device_path")) + +# Force MJPEG decoding if true +if config.getboolean("video", "force_mjpeg", fallback=False): + # Set a magic number, will enable MJPEG but is badly documentated + video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) + +# Set the frame width and height if requested +fw = config.getint("video", "frame_width", fallback=-1) +fh = config.getint("video", "frame_height", fallback=-1) +if fw != -1: + video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, fw) + +if fh != -1: + video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, fh) + +# Capture a single frame so the camera becomes active +# This will let the camera adjust its light levels while we're importing for faster scanning +video_capture.grab() + +# Note the time it took to open the camera +timings['ic'] = time.time() - timings['ic'] timings['ll'] = time.time() @@ -98,6 +94,9 @@ timings['ll'] = time.time() import dlib import numpy as np +pose_predictor = None +face_encoder = None + use_cnn = config.getboolean('core', 'use_cnn', fallback=False) if use_cnn: face_detector = dlib.cnn_face_detection_model_v1( @@ -106,21 +105,29 @@ if use_cnn: else: face_detector = dlib.get_frontal_face_detector() -pose_predictor = dlib.shape_predictor( - PATH + '/dlib-data/shape_predictor_5_face_landmarks.dat' -) -face_encoder = dlib.face_recognition_model_v1( - PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' -) +def init_predictor(): + global pose_predictor + pose_predictor = dlib.shape_predictor( + PATH + '/dlib-data/shape_predictor_5_face_landmarks.dat' + ) +def init_encoder(): + global face_encoder + face_encoder = dlib.face_recognition_model_v1( + PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' + ) + + +init_thread1 = Thread(target=init_encoder) +init_thread2 = Thread(target=init_predictor) +init_thread1.start() +init_thread2.start() + +init_thread2.join() +init_thread1.join() +del init_thread1, init_thread2 timings['ll'] = time.time() - timings['ll'] -# wait for camera initialization to finish -init_thread.join() -del init_thread -# Note the time it took to open the camera -timings['ic'] = time.time() - timings['ic'] - # Fetch the max frame height max_height = config.getfloat("video", "max_height", fallback=0.0) # Get the height of the image From 4f11da686f2d23c6f10637d53e997d713e3948c4 Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 00:15:35 +0700 Subject: [PATCH 38/60] one more detector init thread --- src/compare.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/compare.py b/src/compare.py index 9069e96..4ac8cb6 100644 --- a/src/compare.py +++ b/src/compare.py @@ -94,16 +94,19 @@ timings['ll'] = time.time() import dlib import numpy as np +face_detector = None pose_predictor = None face_encoder = None - use_cnn = config.getboolean('core', 'use_cnn', fallback=False) -if use_cnn: - face_detector = dlib.cnn_face_detection_model_v1( - PATH + '/dlib-data/mmod_human_face_detector.dat' - ) -else: - face_detector = dlib.get_frontal_face_detector() + +def init_detector(): + global face_detector + if use_cnn: + face_detector = dlib.cnn_face_detection_model_v1( + PATH + '/dlib-data/mmod_human_face_detector.dat' + ) + else: + face_detector = dlib.get_frontal_face_detector() def init_predictor(): global pose_predictor @@ -120,12 +123,15 @@ def init_encoder(): init_thread1 = Thread(target=init_encoder) init_thread2 = Thread(target=init_predictor) +init_thread3 = Thread(target=init_detector) +init_thread3.start() init_thread1.start() init_thread2.start() +init_thread3.join() init_thread2.join() init_thread1.join() -del init_thread1, init_thread2 +del init_thread1, init_thread2, init_thread3 timings['ll'] = time.time() - timings['ll'] # Fetch the max frame height From 546015d9734600920fa299fb8eb03ac32aa83801 Mon Sep 17 00:00:00 2001 From: Tim Welch Date: Tue, 11 Dec 2018 19:00:55 -0500 Subject: [PATCH 39/60] using ffmpeg to grab resolution to save 700ms on startup --- src/ffmpeg_reader.py | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/ffmpeg_reader.py b/src/ffmpeg_reader.py index 2b415bc..b786d43 100755 --- a/src/ffmpeg_reader.py +++ b/src/ffmpeg_reader.py @@ -4,6 +4,8 @@ from cv2 import CAP_PROP_FRAME_WIDTH from cv2 import CAP_PROP_FRAME_HEIGHT from cv2 import CAP_PROP_FOURCC import sys +from subprocess import Popen, PIPE +import re class ffmpeg_reader: """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ @@ -41,12 +43,33 @@ class ffmpeg_reader: def probe(self): """ Probe the video device to get height and width info """ - probe = ffmpeg.probe(self.device_name) - if self.get(CAP_PROP_FRAME_WIDTH) == 0 or self.get(CAP_PROP_FRAME_WIDTH) > int(probe['streams'][0]['width']): - self.set(CAP_PROP_FRAME_WIDTH, probe['streams'][0]['width']) - if self.get(CAP_PROP_FRAME_HEIGHT) == 0 or self.get(CAP_PROP_FRAME_HEIGHT) > int(probe['streams'][0]['height']): - self.set(CAP_PROP_FRAME_HEIGHT, probe['streams'][0]['height']) + args = ["ffmpeg", "-f", self.device_format, "-list_formats", "all", "-i", self.device_name] + process = Popen(args, stdout=PIPE, stderr=PIPE) + out, err = process.communicate() + + if not err: + print("Error opening subprocess for ffmpeg.\n\n%s" % err) + sys.exit(1) + + regex = re.compile('\s\d{3,4}x\d{3,4}') + + probe = regex.findall(str(err.decode("utf-8"))) + if len(probe) < 1: + # Could not determine the resolution from v4l2-ctl call. Reverting to ffmpeg.probe() + probe = ffmpeg.probe(self.device_name) + height = probe['streams'][0]['height'] + width = probe['streams'][0]['width'] + else: + (height, width) = [x.strip() for x in probe[0].split('x')] + + + if height.isdigit() and self.get(CAP_PROP_FRAME_HEIGHT) == 0: + self.set(CAP_PROP_FRAME_HEIGHT, int(height)) + + if width.isdigit() and self.get(CAP_PROP_FRAME_WIDTH) == 0: + self.set(CAP_PROP_FRAME_WIDTH, int(width)) + def record(self, numframes): """ Record a video, saving it to self.video array for processing later """ From 39daaa272bc6d9e56682c621bbbc2f08f09ccea3 Mon Sep 17 00:00:00 2001 From: Tim Welch Date: Tue, 11 Dec 2018 20:53:42 -0500 Subject: [PATCH 40/60] pretty up the code a bit for ffmpeg resolution detection --- src/ffmpeg_reader.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/ffmpeg_reader.py b/src/ffmpeg_reader.py index b786d43..bf18b44 100755 --- a/src/ffmpeg_reader.py +++ b/src/ffmpeg_reader.py @@ -44,26 +44,25 @@ class ffmpeg_reader: def probe(self): """ Probe the video device to get height and width info """ + # Running this command on ffmpeg unfortunatly returns with an exit code of 1, which is silly. + # Returns an error code of 1 and this text: "/dev/video2: Immediate exit requested" args = ["ffmpeg", "-f", self.device_format, "-list_formats", "all", "-i", self.device_name] process = Popen(args, stdout=PIPE, stderr=PIPE) out, err = process.communicate() + return_code = process.poll() - if not err: - print("Error opening subprocess for ffmpeg.\n\n%s" % err) - sys.exit(1) - + # worst case scenario, err will equal en empty byte string, b'', so probe will get set to [] here. regex = re.compile('\s\d{3,4}x\d{3,4}') - probe = regex.findall(str(err.decode("utf-8"))) - if len(probe) < 1: - # Could not determine the resolution from v4l2-ctl call. Reverting to ffmpeg.probe() + + if not return_code == 1 or len(probe) < 1: + # Could not determine the resolution from ffmpeg call. Reverting to ffmpeg.probe() probe = ffmpeg.probe(self.device_name) height = probe['streams'][0]['height'] width = probe['streams'][0]['width'] else: (height, width) = [x.strip() for x in probe[0].split('x')] - if height.isdigit() and self.get(CAP_PROP_FRAME_HEIGHT) == 0: self.set(CAP_PROP_FRAME_HEIGHT, int(height)) From 7aac419bd7066e979fb6a9adc341e0655a756c5c Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 14:45:23 +0700 Subject: [PATCH 41/60] importing all modules at the beginning is ~40% faster --- src/compare.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/compare.py b/src/compare.py index 4ac8cb6..53ba3d4 100644 --- a/src/compare.py +++ b/src/compare.py @@ -10,12 +10,14 @@ timings = { } # Import required modules -import cv2 import sys import os import json import configparser from threading import Thread +import cv2 +import dlib +import numpy as np # Get the absolute path to the current directory PATH = os.path.abspath(__file__ + '/..') @@ -90,10 +92,6 @@ timings['ic'] = time.time() - timings['ic'] timings['ll'] = time.time() -# Import face recognition, takes some time -import dlib -import numpy as np - face_detector = None pose_predictor = None face_encoder = None From 01c6364e65c5017d8455028ca3de018db7d8454c Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 14:58:03 +0700 Subject: [PATCH 42/60] simplify argument check; comments typos --- src/compare.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/compare.py b/src/compare.py index 53ba3d4..b47d8a8 100644 --- a/src/compare.py +++ b/src/compare.py @@ -31,14 +31,12 @@ def stop(status): video_capture.release() sys.exit(status) -# Make sure we were given an username to tast against -try: - if not isinstance(sys.argv[1], str): - sys.exit(1) -except IndexError: + +# Make sure we were got an username to test against +if len(sys.argv) < 2: sys.exit(1) -# The username of the authenticating user +# The username of the user being authenticated user = sys.argv[1] # The model file contents models = [] @@ -61,7 +59,7 @@ except FileNotFoundError: if not encodings: sys.exit(10) -# Add the time needed to start the script +# Save the time needed to start the script timings['st'] = time.time() - timings['st'] timings['ic'] = time.time() @@ -71,8 +69,8 @@ video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true if config.getboolean("video", "force_mjpeg", fallback=False): - # Set a magic number, will enable MJPEG but is badly documentated - video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) + # Set a magic number, will enable MJPEG but is badly documented + video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # 1196444237 is 'MJPEG' in ASCII # Set the frame width and height if requested fw = config.getint("video", "frame_width", fallback=-1) From 5fcb7383ca8a74b0481ba26b709f22bd6320377f Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 15:00:59 +0700 Subject: [PATCH 43/60] reorder lines for readability --- src/compare.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/compare.py b/src/compare.py index b47d8a8..03f268b 100644 --- a/src/compare.py +++ b/src/compare.py @@ -19,8 +19,6 @@ import cv2 import dlib import numpy as np -# Get the absolute path to the current directory -PATH = os.path.abspath(__file__ + '/..') # Read config from disk config = configparser.ConfigParser() @@ -36,6 +34,9 @@ def stop(status): if len(sys.argv) < 2: sys.exit(1) +# Get the absolute path to the current directory +PATH = os.path.abspath(__file__ + '/..') + # The username of the user being authenticated user = sys.argv[1] # The model file contents @@ -44,6 +45,12 @@ models = [] encodings = [] # Amount of ingnored dark frames dark_tries = 0 +# Total amount of frames captured +frames = 0 +# face recognition/detection instances +face_detector = None +pose_predictor = None +face_encoder = None # Try to load the face model from the models folder try: @@ -59,6 +66,17 @@ except FileNotFoundError: if not encodings: sys.exit(10) +# Read config from disk +config = configparser.ConfigParser() +config.read(PATH + "/config.ini") + +# CNN usage flag +use_cnn = config.getboolean('core', 'use_cnn', fallback=False) +timeout = config.getint("video", "timout", fallback=5) +dark_threshold = config.getfloat("video", "dark_threshold", fallback=50.0) +video_certainty = config.getfloat("video", "certainty", fallback=3.5) / 10 +end_report = config.getboolean("debug", "end_report", fallback=False) + # Save the time needed to start the script timings['st'] = time.time() - timings['st'] @@ -90,11 +108,6 @@ timings['ic'] = time.time() - timings['ic'] timings['ll'] = time.time() -face_detector = None -pose_predictor = None -face_encoder = None -use_cnn = config.getboolean('core', 'use_cnn', fallback=False) - def init_detector(): global face_detector if use_cnn: @@ -128,6 +141,7 @@ init_thread3.join() init_thread2.join() init_thread1.join() del init_thread1, init_thread2, init_thread3 +# Note the time it took to initalize detectors timings['ll'] = time.time() - timings['ll'] # Fetch the max frame height @@ -140,11 +154,6 @@ scaling_factor = (max_height / height) or 1 # Start the read loop timings['fr'] = time.time() -frames = 0 -timeout = config.getint("video", "timout") -dark_threshold = config.getfloat("video", "dark_threshold") -end_report = config.getboolean("debug", "end_report") -video_certainty = config.getfloat("video", "certainty") / 10 while True: # Increment the frame count every loop frames += 1 From cc1b9785a83ec1f125558f9397848631dd3256a6 Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 15:04:11 +0700 Subject: [PATCH 44/60] replace threading module with low-level _thread; leave only one initialization helper thread --- src/compare.py | 67 +++++++++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/src/compare.py b/src/compare.py index 03f268b..10b863c 100644 --- a/src/compare.py +++ b/src/compare.py @@ -14,15 +14,28 @@ import sys import os import json import configparser -from threading import Thread import cv2 import dlib import numpy as np +import _thread as thread +def init_detector(lock): + global face_detector, pose_predictor, face_encoder + if use_cnn: + face_detector = dlib.cnn_face_detection_model_v1( + PATH + '/dlib-data/mmod_human_face_detector.dat' + ) + else: + face_detector = dlib.get_frontal_face_detector() -# Read config from disk -config = configparser.ConfigParser() -config.read(PATH + "/config.ini") + pose_predictor = dlib.shape_predictor( + PATH + '/dlib-data/shape_predictor_5_face_landmarks.dat' + ) + + face_encoder = dlib.face_recognition_model_v1( + PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' + ) + lock.release() def stop(status): """Stop the execution and close video stream""" @@ -80,9 +93,15 @@ end_report = config.getboolean("debug", "end_report", fallback=False) # Save the time needed to start the script timings['st'] = time.time() - timings['st'] -timings['ic'] = time.time() +# Import face recognition, takes some time +timings['ll'] = time.time() + +lock = thread.allocate_lock() +lock.acquire() +thread.start_new_thread(init_detector, (lock, )) # Start video capture on the IR camera +timings['ic'] = time.time() video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true @@ -106,41 +125,11 @@ video_capture.grab() # Note the time it took to open the camera timings['ic'] = time.time() - timings['ic'] -timings['ll'] = time.time() +# wait for thread to finish +lock.acquire() +lock.release() +del lock -def init_detector(): - global face_detector - if use_cnn: - face_detector = dlib.cnn_face_detection_model_v1( - PATH + '/dlib-data/mmod_human_face_detector.dat' - ) - else: - face_detector = dlib.get_frontal_face_detector() - -def init_predictor(): - global pose_predictor - pose_predictor = dlib.shape_predictor( - PATH + '/dlib-data/shape_predictor_5_face_landmarks.dat' - ) - -def init_encoder(): - global face_encoder - face_encoder = dlib.face_recognition_model_v1( - PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' - ) - - -init_thread1 = Thread(target=init_encoder) -init_thread2 = Thread(target=init_predictor) -init_thread3 = Thread(target=init_detector) -init_thread3.start() -init_thread1.start() -init_thread2.start() - -init_thread3.join() -init_thread2.join() -init_thread1.join() -del init_thread1, init_thread2, init_thread3 # Note the time it took to initalize detectors timings['ll'] = time.time() - timings['ll'] From 443c5e70635db419ddd819ed4877ee051e034259 Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 16:30:52 +0700 Subject: [PATCH 45/60] proper library load timing; add total time reporting --- src/compare.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/compare.py b/src/compare.py index 10b863c..f6f21a5 100644 --- a/src/compare.py +++ b/src/compare.py @@ -35,6 +35,8 @@ def init_detector(lock): face_encoder = dlib.face_recognition_model_v1( PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' ) + # Note the time it took to initalize detectors + timings['ll'] = time.time() - timings['ll'] lock.release() def stop(status): @@ -91,7 +93,7 @@ video_certainty = config.getfloat("video", "certainty", fallback=3.5) / 10 end_report = config.getboolean("debug", "end_report", fallback=False) # Save the time needed to start the script -timings['st'] = time.time() - timings['st'] +timings['in'] = time.time() - timings['st'] # Import face recognition, takes some time timings['ll'] = time.time() @@ -130,8 +132,6 @@ lock.acquire() lock.release() del lock -# Note the time it took to initalize detectors -timings['ll'] = time.time() - timings['ll'] # Fetch the max frame height max_height = config.getfloat("video", "max_height", fallback=0.0) @@ -193,6 +193,7 @@ while True: # Check if a match that's confident enough if 0 < match < video_certainty: + timings['tt'] = time.time() - timings['st'] timings['fr'] = time.time() - timings['fr'] # If set to true in the config, print debug text @@ -202,11 +203,12 @@ while True: print(" %s: %dms" % (label, round(timings[k] * 1000))) print("Time spent") - print_timing("Starting up", 'st') + print_timing("Starting up", 'in') print(" Open cam + load libs: %dms" % (round(max(timings['ll'], timings['ic']) * 1000, ))) print_timing(" Opening the camera", 'ic') print_timing(" Importing recognition libs", 'll') print_timing("Searching for known face", 'fr') + print_timing("Total time", 'tt') print("\nResolution") width = video_capture.get(cv2.CAP_PROP_FRAME_WIDTH) or 1 From a8d68d945b51f871bc9876d1885fcb8b9fe3e14e Mon Sep 17 00:00:00 2001 From: dmig Date: Wed, 12 Dec 2018 16:43:27 +0700 Subject: [PATCH 46/60] no changes, comment --- src/compare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compare.py b/src/compare.py index f6f21a5..23fd486 100644 --- a/src/compare.py +++ b/src/compare.py @@ -109,7 +109,7 @@ video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true if config.getboolean("video", "force_mjpeg", fallback=False): # Set a magic number, will enable MJPEG but is badly documented - video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # 1196444237 is 'MJPEG' in ASCII + video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # 1196444237 is 'GPJM' in ASCII # Set the frame width and height if requested fw = config.getint("video", "frame_width", fallback=-1) From f8cfde6f72d954ed4c8cdd58a9c7b62f5f5ba5ad Mon Sep 17 00:00:00 2001 From: boltgolt Date: Thu, 13 Dec 2018 20:10:08 +0100 Subject: [PATCH 47/60] Fixed a few small things from PR #109 --- src/cli/add.py | 5 +++-- src/cli/test.py | 6 ++++++ src/compare.py | 7 ++++--- src/config.ini | 34 ++++++++++++++------------------- src/ffmpeg_reader.py | 45 +++++++++++++++++++++++--------------------- src/pam.py | 7 +++++-- 6 files changed, 56 insertions(+), 48 deletions(-) diff --git a/src/cli/add.py b/src/cli/add.py index 10c7330..b2f6e96 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -77,14 +77,15 @@ insert_model = { "data": [] } +# Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": from ffmpeg_reader import ffmpeg_reader # Set the capture source for ffmpeg - video_capture = ffmpeg_reader(config.get("video", "device_name"), config.get("video", "device_format"), 10) + video_capture = ffmpeg_reader(config.get("video", "device_path"), config.get("video", "device_format")) else: - # Start video capture on the IR camera + # Start video capture on the IR camera through OpenCV video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true diff --git a/src/cli/test.py b/src/cli/test.py index cceb1a4..3faa5b6 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -3,6 +3,7 @@ # Import required modules import configparser import os +import sys import time import cv2 import face_recognition @@ -14,6 +15,11 @@ path = os.path.dirname(os.path.abspath(__file__)) config = configparser.ConfigParser() config.read(path + "/../config.ini") +if config.get("video", "recording_plugin") == "ffmpeg": + print("Howdy has been configured to use ffmpeg as recorder, which doesn't support the test command yet") + print("Aborting") + sys.exit(12) + # Start capturing from the configured webcam video_capture = cv2.VideoCapture(config.get("video", "device_path")) diff --git a/src/compare.py b/src/compare.py index 98df282..0b7c283 100644 --- a/src/compare.py +++ b/src/compare.py @@ -28,7 +28,7 @@ try: if not isinstance(sys.argv[1], str): sys.exit(1) except IndexError: - sys.exit(1) + sys.exit(12) # The username of the authenticating user user = sys.argv[1] @@ -56,14 +56,15 @@ for model in models: # Add the time needed to start the script timings.append(time.time()) +# Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": from ffmpeg_reader import ffmpeg_reader # Set the capture source for ffmpeg - video_capture = ffmpeg_reader(config.get("video", "device_name"), config.get("video", "device_format"), 10) + video_capture = ffmpeg_reader(config.get("video", "device_path"), config.get("video", "device_format")) else: - # Start video capture on the IR camera + # Start video capture on the IR camera through OpenCV video_capture = cv2.VideoCapture(config.get("video", "device_path")) # Force MJPEG decoding if true diff --git a/src/config.ini b/src/config.ini index df2907f..4500e95 100644 --- a/src/config.ini +++ b/src/config.ini @@ -22,21 +22,6 @@ dismiss_lockscreen = false disabled = false [video] -# -# opencv or ffmpeg. Choose ffmpeg if your IR device is a grayscale only. -# Run this: v4l2-ctl -d /dev/video2 --list-formats -recording_plugin = opencv - -# -# format to use for ffmpeg. Could be vfwcap or v4l2 or some other thing... -# -device_format = v4l2 - -# -# device name if using ffmpeg. ex: /dev/video2 -# -device_name = none - # The certainty of the detected face belonging to the user of the account # On a scale from 1 to 10, values above 5 are not recommended certainty = 3.5 @@ -45,17 +30,13 @@ certainty = 3.5 timeout = 4 # The path of the device to capture frames from -# Should be set automatically by the installer +# Should be set automatically by an installer if your distro has one device_path = none # Scale down the video feed to this maximum height # Speeds up face recognition but can make it less precise max_height = 320 -# Force the use of Motion JPEG when decoding frames, fixes issues with -# YUYV raw frame decoding -force_mjpeg = false - # Set the camera input profile to this width and height # The largest profile will be used if set to -1 # Automatically ignored if not a valid profile @@ -68,6 +49,19 @@ frame_height = -1 # The lower this setting is, the more dark frames are ignored dark_threshold = 50 +# The recorder to use. Can be either opencv or ffmpeg. +# Switching from the default opencv to ffmpeg can help with grayscale issues. +recording_plugin = opencv + +# Video format used by ffmpeg. Options include vfwcap or v4l2. +# FFMPEG only. +device_format = v4l2 + +# Force the use of Motion JPEG when decoding frames, fixes issues with YUYV +# raw frame decoding. +# OPENCV only. +force_mjpeg = false + [debug] # Show a short but detailed diagnostic report in console end_report = false diff --git a/src/ffmpeg_reader.py b/src/ffmpeg_reader.py index bf18b44..658b447 100755 --- a/src/ffmpeg_reader.py +++ b/src/ffmpeg_reader.py @@ -1,18 +1,26 @@ -import ffmpeg +# Class that simulates the functionality of opencv so howdy can use ffmpeg seamlessly + +# Import required modules import numpy +import sys +import re +from subprocess import Popen, PIPE from cv2 import CAP_PROP_FRAME_WIDTH from cv2 import CAP_PROP_FRAME_HEIGHT from cv2 import CAP_PROP_FOURCC -import sys -from subprocess import Popen, PIPE -import re + +try: + import ffmpeg +except ImportError: + print("Missing ffmpeg module, please run:") + print(" pip3 install ffmpeg-python\n") + sys.exit(12) class ffmpeg_reader: """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ - # Init - def __init__(self, device_name, device_format, numframes): - self.device_name = device_name + def __init__(self, device_path, device_format, numframes=10): + self.device_path = device_path self.device_format = device_format self.numframes = numframes self.video = () @@ -20,7 +28,6 @@ class ffmpeg_reader: self.height = 0 self.width = 0 self.init_camera = True - self.force_jpeg = 0 def set(self, prop, setting): """ Setter method for height and width """ @@ -28,9 +35,6 @@ class ffmpeg_reader: self.width = setting elif prop == CAP_PROP_FRAME_HEIGHT: self.height = setting - elif prop == CAP_PROP_FOURCC: - self.force_jpeg = setting - def get(self, prop): """ Getter method for height and width """ @@ -38,34 +42,32 @@ class ffmpeg_reader: return self.width elif prop == CAP_PROP_FRAME_HEIGHT: return self.height - elif prop == CAP_PROP_FOURCC: - return self.force_jpeg - + def probe(self): """ Probe the video device to get height and width info """ - # Running this command on ffmpeg unfortunatly returns with an exit code of 1, which is silly. + # Running this command on ffmpeg unfortunatly returns with an exit code of 1, which is silly. # Returns an error code of 1 and this text: "/dev/video2: Immediate exit requested" - args = ["ffmpeg", "-f", self.device_format, "-list_formats", "all", "-i", self.device_name] + args = ["ffmpeg", "-f", self.device_format, "-list_formats", "all", "-i", self.device_path] process = Popen(args, stdout=PIPE, stderr=PIPE) out, err = process.communicate() return_code = process.poll() - # worst case scenario, err will equal en empty byte string, b'', so probe will get set to [] here. + # Worst case scenario, err will equal en empty byte string, b'', so probe will get set to [] here. regex = re.compile('\s\d{3,4}x\d{3,4}') probe = regex.findall(str(err.decode("utf-8"))) - if not return_code == 1 or len(probe) < 1: + if not return_code == 1 or len(probe) < 1: # Could not determine the resolution from ffmpeg call. Reverting to ffmpeg.probe() - probe = ffmpeg.probe(self.device_name) + probe = ffmpeg.probe(self.device_path) height = probe['streams'][0]['height'] width = probe['streams'][0]['width'] else: (height, width) = [x.strip() for x in probe[0].split('x')] + # Set height and width from probe if they haven't been set already if height.isdigit() and self.get(CAP_PROP_FRAME_HEIGHT) == 0: self.set(CAP_PROP_FRAME_HEIGHT, int(height)) - if width.isdigit() and self.get(CAP_PROP_FRAME_WIDTH) == 0: self.set(CAP_PROP_FRAME_WIDTH, int(width)) @@ -80,9 +82,10 @@ class ffmpeg_reader: # Ensure num_frames_read is reset to 0 self.num_frames_read = 0 + # Record a predetermined amount of frames from the camera stream, ret = ( ffmpeg - .input(self.device_name, format=self.device_format) + .input(self.device_path, format=self.device_format) .output('pipe:', format='rawvideo', pix_fmt='rgb24', vframes=numframes) .run(capture_stdout=True, quiet=True) ) diff --git a/src/pam.py b/src/pam.py index 6de8f19..2e0dbfa 100644 --- a/src/pam.py +++ b/src/pam.py @@ -33,11 +33,14 @@ def doAuth(pamh): pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "No face model known")) return pamh.PAM_USER_UNKNOWN # Status 11 means we exceded the maximum retry count - if status == 11: + elif status == 11: pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Face detection timeout reached")) return pamh.PAM_AUTH_ERR + # Status 12 means we aborted + elif status == 12: + return pamh.PAM_AUTH_ERR # Status 0 is a successful exit - if status == 0: + elif status == 0: # Show the success message if it isn't suppressed if not config.getboolean("core", "no_confirmation"): pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Identified face as " + pamh.get_user())) From f4db5ee94bee6a2b432639e1273dea7180a34933 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Thu, 13 Dec 2018 20:53:18 +0100 Subject: [PATCH 48/60] Formatting fixes --- src/cli.py | 32 ++++++++++++++++---------------- src/cli/config.py | 2 +- src/cli/disable.py | 2 +- src/cli/list.py | 2 +- src/cli/remove.py | 4 ++-- src/cli/test.py | 4 +++- src/compare.py | 4 +++- src/ffmpeg_reader.py | 14 ++++++-------- src/pam.py | 5 +++++ 9 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/cli.py b/src/cli.py index 2c5d877..07447cf 100755 --- a/src/cli.py +++ b/src/cli.py @@ -27,37 +27,37 @@ if user == "root" or user is None: # Basic command setup parser = argparse.ArgumentParser(description="Command line interface for Howdy face authentication.", - formatter_class=argparse.RawDescriptionHelpFormatter, - add_help=False, - prog="howdy", - epilog="For support please visit\nhttps://github.com/boltgolt/howdy") + formatter_class=argparse.RawDescriptionHelpFormatter, + add_help=False, + prog="howdy", + epilog="For support please visit\nhttps://github.com/boltgolt/howdy") # Add an argument for the command parser.add_argument("command", - help="The command option to execute, can be one of the following: add, clear, config, disable, list, remove or test.", - metavar="command", - choices=["add", "clear", "config", "disable", "list", "remove", "test"]) + help="The command option to execute, can be one of the following: add, clear, config, disable, list, remove or test.", + metavar="command", + choices=["add", "clear", "config", "disable", "list", "remove", "test"]) # Add an argument for the extra arguments of diable and remove parser.add_argument("argument", - help="Either 0 (enable) or 1 (disable) for the disable command, or the model ID for the remove command.", - nargs="?") + help="Either 0 (enable) or 1 (disable) for the disable command, or the model ID for the remove command.", + nargs="?") # Add the user flag parser.add_argument("-U", "--user", - default=user, - help="Set the user account to use.") + default=user, + help="Set the user account to use.") # Add the -y flag parser.add_argument("-y", - help="Skip all questions.", - action="store_true") + help="Skip all questions.", + action="store_true") # Overwrite the default help message so we can use a uppercase S parser.add_argument("-h", "--help", - action="help", - default=argparse.SUPPRESS, - help="Show this help message and exit.") + action="help", + default=argparse.SUPPRESS, + help="Show this help message and exit.") # If we only have 1 argument we print the help text if len(sys.argv) < 2: diff --git a/src/cli/config.py b/src/cli/config.py index aaa5518..4f6caca 100644 --- a/src/cli/config.py +++ b/src/cli/config.py @@ -17,4 +17,4 @@ elif "EDITOR" in os.environ: editor = os.environ["EDITOR"] # Open the editor as a subprocess and fork it -subprocess.call([editor, os.path.dirname(os.path.realpath(__file__)) + "/../config.ini"]) +subprocess.call([editor, os.path.dirname(os.path.realpath(__file__)) + "/../config.ini"]) diff --git a/src/cli/disable.py b/src/cli/disable.py index 8bc0341..cba8931 100644 --- a/src/cli/disable.py +++ b/src/cli/disable.py @@ -16,7 +16,7 @@ config = configparser.ConfigParser() config.read(config_path) # Check if enough arguments have been passed -if builtins.howdy_args.argument == None: +if builtins.howdy_args.argument is None: print("Please add a 0 (enable) or a 1 (disable) as an argument") sys.exit(1) diff --git a/src/cli/list.py b/src/cli/list.py index 061bf49..08a1e9f 100644 --- a/src/cli/list.py +++ b/src/cli/list.py @@ -8,7 +8,7 @@ import time import builtins # Get the absolute path and the username -path = os.path.dirname(os.path.realpath(__file__)) + "/.." +path = os.path.dirname(os.path.realpath(__file__)) + "/.." user = builtins.howdy_user # Check if the models file has been created yet diff --git a/src/cli/remove.py b/src/cli/remove.py index deef825..45e2036 100644 --- a/src/cli/remove.py +++ b/src/cli/remove.py @@ -7,11 +7,11 @@ import json import builtins # Get the absolute path and the username -path = os.path.dirname(os.path.realpath(__file__)) + "/.." +path = os.path.dirname(os.path.realpath(__file__)) + "/.." user = builtins.howdy_user # Check if enough arguments have been passed -if builtins.howdy_args.argument == None: +if builtins.howdy_args.argument is None: print("Please add the ID of the model you want to remove as an argument") print("You can find the IDs by running:") print("\n\thowdy list\n") diff --git a/src/cli/test.py b/src/cli/test.py index 3faa5b6..4c4effe 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -45,6 +45,7 @@ Press ctrl+C in this terminal to quit Click on the image to enable or disable slow mode """) + def mouse(event, x, y, flags, param): """Handle mouse events""" global slow_mode @@ -53,10 +54,12 @@ def mouse(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: slow_mode = not slow_mode + def print_text(line_number, text): """Print the status text by line number""" cv2.putText(overlay, text, (10, height - 10 - (10 * line_number)), cv2.FONT_HERSHEY_SIMPLEX, .3, (0, 255, 0), 0, cv2.LINE_AA) + # Open the window and attach a a mouse listener cv2.namedWindow("Howdy Test") cv2.setMouseCallback("Howdy Test", mouse) @@ -90,7 +93,6 @@ try: sec = int(time.time()) sec_frames = 0 - # Grab a single frame of video ret, frame = (video_capture.read()) # Make a frame to put overlays in diff --git a/src/compare.py b/src/compare.py index 0b7c283..7d9b939 100644 --- a/src/compare.py +++ b/src/compare.py @@ -18,11 +18,13 @@ import configparser config = configparser.ConfigParser() config.read(os.path.dirname(os.path.abspath(__file__)) + "/config.ini") + def stop(status): """Stop the execution and close video stream""" video_capture.release() sys.exit(status) + # Make sure we were given an username to tast against try: if not isinstance(sys.argv[1], str): @@ -182,7 +184,7 @@ while True: print("Certainty of winning frame: %.3f" % (match * 10, )) # Catch older 3-encoding models - if not match_index in models: + if match_index not in models: match_index = 0 print("Winning model: %d (\"%s\")" % (match_index, models[match_index]["label"])) diff --git a/src/ffmpeg_reader.py b/src/ffmpeg_reader.py index 658b447..da77eae 100755 --- a/src/ffmpeg_reader.py +++ b/src/ffmpeg_reader.py @@ -7,7 +7,6 @@ import re from subprocess import Popen, PIPE from cv2 import CAP_PROP_FRAME_WIDTH from cv2 import CAP_PROP_FRAME_HEIGHT -from cv2 import CAP_PROP_FOURCC try: import ffmpeg @@ -16,6 +15,7 @@ except ImportError: print(" pip3 install ffmpeg-python\n") sys.exit(12) + class ffmpeg_reader: """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ @@ -54,16 +54,16 @@ class ffmpeg_reader: return_code = process.poll() # Worst case scenario, err will equal en empty byte string, b'', so probe will get set to [] here. - regex = re.compile('\s\d{3,4}x\d{3,4}') + regex = re.compile(r"\s\d{3,4}x\d{3,4}") probe = regex.findall(str(err.decode("utf-8"))) if not return_code == 1 or len(probe) < 1: # Could not determine the resolution from ffmpeg call. Reverting to ffmpeg.probe() probe = ffmpeg.probe(self.device_path) - height = probe['streams'][0]['height'] - width = probe['streams'][0]['width'] + height = probe["streams"][0]["height"] + width = probe["streams"][0]["width"] else: - (height, width) = [x.strip() for x in probe[0].split('x')] + (height, width) = [x.strip() for x in probe[0].split("x")] # Set height and width from probe if they haven't been set already if height.isdigit() and self.get(CAP_PROP_FRAME_HEIGHT) == 0: @@ -71,7 +71,6 @@ class ffmpeg_reader: if width.isdigit() and self.get(CAP_PROP_FRAME_WIDTH) == 0: self.set(CAP_PROP_FRAME_WIDTH, int(width)) - def record(self, numframes): """ Record a video, saving it to self.video array for processing later """ @@ -86,7 +85,7 @@ class ffmpeg_reader: stream, ret = ( ffmpeg .input(self.device_path, format=self.device_format) - .output('pipe:', format='rawvideo', pix_fmt='rgb24', vframes=numframes) + .output("pipe:", format="rawvideo", pix_fmt="rgb24", vframes=numframes) .run(capture_stdout=True, quiet=True) ) self.video = ( @@ -95,7 +94,6 @@ class ffmpeg_reader: .reshape([-1, self.width, self.height, 3]) ) - def read(self): """ Read a sigle frame from the self.video array. Will record a video if array is empty. """ diff --git a/src/pam.py b/src/pam.py index 2e0dbfa..18f1c12 100644 --- a/src/pam.py +++ b/src/pam.py @@ -12,6 +12,7 @@ import ConfigParser config = ConfigParser.ConfigParser() config.read(os.path.dirname(os.path.abspath(__file__)) + "/config.ini") + def doAuth(pamh): """Starts authentication in a seperate process""" @@ -56,18 +57,22 @@ def doAuth(pamh): pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Unknown error: " + str(status))) return pamh.PAM_SYSTEM_ERR + def pam_sm_authenticate(pamh, flags, args): """Called by PAM when the user wants to authenticate, in sudo for example""" return doAuth(pamh) + def pam_sm_open_session(pamh, flags, args): """Called when starting a session, such as su""" return doAuth(pamh) + def pam_sm_close_session(pamh, flags, argv): """We don't need to clean anyting up at the end of a session, so returns true""" return pamh.PAM_SUCCESS + def pam_sm_setcred(pamh, flags, argv): """We don't need set any credentials, so returns true""" return pamh.PAM_SUCCESS From 6a73634ac29b02440f7665b33cc915c52d3dc99a Mon Sep 17 00:00:00 2001 From: Tim Welch Date: Sun, 23 Dec 2018 12:08:18 -0500 Subject: [PATCH 49/60] Adding support for v4l2 devices directly in python v4l2l.py is included in src dir. The version you get from pip install does not work with python3 (at least not on my system), so I had to modify a bunch of the functions returning a list() of range() instead of the original range(). --- src/cli/add.py | 8 +- src/compare.py | 8 +- src/pyv4l2_reader.py | 110 +++ src/v4l2.py | 1914 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2034 insertions(+), 6 deletions(-) create mode 100644 src/pyv4l2_reader.py create mode 100644 src/v4l2.py diff --git a/src/cli/add.py b/src/cli/add.py index e7db14f..9d31643 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -95,11 +95,13 @@ insert_model = { # Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": - from ffmpeg_reader import ffmpeg_reader - # Set the capture source for ffmpeg + from ffmpeg_reader import ffmpeg_reader video_capture = ffmpeg_reader(config.get("video", "device_path"), config.get("video", "device_format")) - +elif config.get("video", "recording_plugin") == "pyv4l2": + # Set the capture source for pyv4l2 + from pyv4l2_reader import pyv4l2_reader + video_capture = pyv4l2_reader(config.get("video", "device_path"), config.get("video", "device_format")) else: # Start video capture on the IR camera through OpenCV video_capture = cv2.VideoCapture(config.get("video", "device_path")) diff --git a/src/compare.py b/src/compare.py index 7fc9c87..550fca9 100644 --- a/src/compare.py +++ b/src/compare.py @@ -108,11 +108,13 @@ timings['ic'] = time.time() # Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": - from ffmpeg_reader import ffmpeg_reader - # Set the capture source for ffmpeg + from ffmpeg_reader import ffmpeg_reader video_capture = ffmpeg_reader(config.get("video", "device_path"), config.get("video", "device_format")) - +elif config.get("video", "recording_plugin") == "pyv4l2": + # Set the capture source for pyv4l2 + from pyv4l2_reader import pyv4l2_reader + video_capture = pyv4l2_reader(config.get("video", "device_path"), config.get("video", "device_format")) else: # Start video capture on the IR camera through OpenCV video_capture = cv2.VideoCapture(config.get("video", "device_path")) diff --git a/src/pyv4l2_reader.py b/src/pyv4l2_reader.py new file mode 100644 index 0000000..b0472c0 --- /dev/null +++ b/src/pyv4l2_reader.py @@ -0,0 +1,110 @@ +# Class that simulates the functionality of opencv so howdy can use v4l2 devices seamlessly + +# Import required modules. lib4l-dev package is also required. +import v4l2 +import fcntl +import numpy +import sys +from cv2 import cvtColor, COLOR_GRAY2BGR, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT + +try: + from pyv4l2.frame import Frame +except ImportError: + print("Missing pyv4l2 module, please run:") + print(" pip3 install pyv4l2\n") + sys.exit(13) + +class pyv4l2_reader: + """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ + + # Init + def __init__(self, device_name, device_format): + self.device_name = device_name + self.device_format = device_format + self.height = 0 + self.width = 0 + self.probe() + self.frame = "" + + def set(self, prop, setting): + """ Setter method for height and width """ + if prop == CAP_PROP_FRAME_WIDTH: + self.width = setting + elif prop == CAP_PROP_FRAME_HEIGHT: + self.height = setting + + def get(self, prop): + """ Getter method for height and width """ + if prop == CAP_PROP_FRAME_WIDTH: + return self.width + elif prop == CAP_PROP_FRAME_HEIGHT: + return self.height + + def probe(self): + """ Probe the video device to get height and width info """ + + vd = open(self.device_name, 'r') + fmt = v4l2.v4l2_format() + fmt.type = v4l2.V4L2_BUF_TYPE_VIDEO_CAPTURE + ret = fcntl.ioctl(vd, v4l2.VIDIOC_G_FMT, fmt) + vd.close() + if ret == 0: + height = fmt.fmt.pix.height + width = fmt.fmt.pix.width + else: + # Could not determine the resolution from ioctl call. Reverting to slower ffmpeg.probe() method + import ffmpeg + probe = ffmpeg.probe(self.device_name) + height = int(probe['streams'][0]['height']) + width = int(probe['streams'][0]['width']) + + if self.get(CAP_PROP_FRAME_HEIGHT) == 0: + self.set(CAP_PROP_FRAME_HEIGHT, int(height)) + + if self.get(CAP_PROP_FRAME_WIDTH) == 0: + self.set(CAP_PROP_FRAME_WIDTH, int(width)) + + def record(self): + """ Start recording """ + self.frame = Frame(self.device_name) + + + def grab(self): + """ Read a sigle frame from the IR camera. """ + self.read() + + def read(self): + """ Read a sigle frame from the IR camera. """ + + if not self.frame: + self.record() + + # Grab a raw frame from the camera + frame_data = self.frame.get_frame() + + # Convert the raw frame_date to a numpy array + img = ( + numpy + .frombuffer(frame_data, numpy.uint8) + ) + + # Convert the numpy array to a proper grayscale image array + img_bgr = cvtColor(img, COLOR_GRAY2BGR) + + # Convert the grayscale image array into a proper RGB style numpy array + img2 = ( + numpy + .frombuffer(img_bgr, numpy.uint8) + .reshape([352, 352, 3]) + ) + + # Return a single frame of video + return 0, img2 + + def release(self): + """ Empty our array. If we had a hold on the camera, we would give it back here. """ + self.video = () + self.num_frames_read = 0 + if self.frame: + self.frame.close() + diff --git a/src/v4l2.py b/src/v4l2.py new file mode 100644 index 0000000..6edf49b --- /dev/null +++ b/src/v4l2.py @@ -0,0 +1,1914 @@ +# Python bindings for the v4l2 userspace api + +# Copyright (C) 1999-2009 the contributors + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# Alternatively you can redistribute this file under the terms of the +# BSD license as stated below: + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The names of its contributors may not be used to endorse or promote +# products derived from this software without specific prior written +# permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +Python bindings for the v4l2 userspace api in Linux 2.6.34 +""" + +# see linux/videodev2.h + +import ctypes + + +_IOC_NRBITS = 8 +_IOC_TYPEBITS = 8 +_IOC_SIZEBITS = 14 +_IOC_DIRBITS = 2 + +_IOC_NRSHIFT = 0 +_IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS +_IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS +_IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS + +_IOC_NONE = 0 +_IOC_WRITE = 1 +_IOC_READ = 2 + + +def _IOC(dir_, type_, nr, size): + return ( + ctypes.c_int32(dir_ << _IOC_DIRSHIFT).value | + ctypes.c_int32(ord(type_) << _IOC_TYPESHIFT).value | + ctypes.c_int32(nr << _IOC_NRSHIFT).value | + ctypes.c_int32(size << _IOC_SIZESHIFT).value) + + +def _IOC_TYPECHECK(t): + return ctypes.sizeof(t) + + +def _IO(type_, nr): + return _IOC(_IOC_NONE, type_, nr, 0) + + +def _IOW(type_, nr, size): + return _IOC(_IOC_WRITE, type_, nr, _IOC_TYPECHECK(size)) + + +def _IOR(type_, nr, size): + return _IOC(_IOC_READ, type_, nr, _IOC_TYPECHECK(size)) + + +def _IOWR(type_, nr, size): + return _IOC(_IOC_READ | _IOC_WRITE, type_, nr, _IOC_TYPECHECK(size)) + + +# +# type alias +# + +enum = ctypes.c_uint +c_int = ctypes.c_int + + +# +# time +# + +class timeval(ctypes.Structure): + _fields_ = [ + ('secs', ctypes.c_long), + ('usecs', ctypes.c_long), + ] + + +# +# v4l2 +# + + +VIDEO_MAX_FRAME = 32 + + +VID_TYPE_CAPTURE = 1 +VID_TYPE_TUNER = 2 +VID_TYPE_TELETEXT = 4 +VID_TYPE_OVERLAY = 8 +VID_TYPE_CHROMAKEY = 16 +VID_TYPE_CLIPPING = 32 +VID_TYPE_FRAMERAM = 64 +VID_TYPE_SCALES = 128 +VID_TYPE_MONOCHROME = 256 +VID_TYPE_SUBCAPTURE = 512 +VID_TYPE_MPEG_DECODER = 1024 +VID_TYPE_MPEG_ENCODER = 2048 +VID_TYPE_MJPEG_DECODER = 4096 +VID_TYPE_MJPEG_ENCODER = 8192 + + +def v4l2_fourcc(a, b, c, d): + return ord(a) | (ord(b) << 8) | (ord(c) << 16) | (ord(d) << 24) + + +v4l2_field = enum +( + V4L2_FIELD_ANY, + V4L2_FIELD_NONE, + V4L2_FIELD_TOP, + V4L2_FIELD_BOTTOM, + V4L2_FIELD_INTERLACED, + V4L2_FIELD_SEQ_TB, + V4L2_FIELD_SEQ_BT, + V4L2_FIELD_ALTERNATE, + V4L2_FIELD_INTERLACED_TB, + V4L2_FIELD_INTERLACED_BT, +) = range(10) + + +def V4L2_FIELD_HAS_TOP(field): + return ( + field == V4L2_FIELD_TOP or + field == V4L2_FIELD_INTERLACED or + field == V4L2_FIELD_INTERLACED_TB or + field == V4L2_FIELD_INTERLACED_BT or + field == V4L2_FIELD_SEQ_TB or + field == V4L2_FIELD_SEQ_BT) + + +def V4L2_FIELD_HAS_BOTTOM(field): + return ( + field == V4L2_FIELD_BOTTOM or + field == V4L2_FIELD_INTERLACED or + field == V4L2_FIELD_INTERLACED_TB or + field == V4L2_FIELD_INTERLACED_BT or + field == V4L2_FIELD_SEQ_TB or + field == V4L2_FIELD_SEQ_BT) + + +def V4L2_FIELD_HAS_BOTH(field): + return ( + field == V4L2_FIELD_INTERLACED or + field == V4L2_FIELD_INTERLACED_TB or + field == V4L2_FIELD_INTERLACED_BT or + field == V4L2_FIELD_SEQ_TB or + field == V4L2_FIELD_SEQ_BT) + + +v4l2_buf_type = enum +( + V4L2_BUF_TYPE_VIDEO_CAPTURE, + V4L2_BUF_TYPE_VIDEO_OUTPUT, + V4L2_BUF_TYPE_VIDEO_OVERLAY, + V4L2_BUF_TYPE_VBI_CAPTURE, + V4L2_BUF_TYPE_VBI_OUTPUT, + V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, + V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, + V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, + V4L2_BUF_TYPE_PRIVATE, +) = list(range(1, 9)) + [0x80] + + +v4l2_ctrl_type = enum +( + V4L2_CTRL_TYPE_INTEGER, + V4L2_CTRL_TYPE_BOOLEAN, + V4L2_CTRL_TYPE_MENU, + V4L2_CTRL_TYPE_BUTTON, + V4L2_CTRL_TYPE_INTEGER64, + V4L2_CTRL_TYPE_CTRL_CLASS, + V4L2_CTRL_TYPE_STRING, +) = range(1, 8) + + +v4l2_tuner_type = enum +( + V4L2_TUNER_RADIO, + V4L2_TUNER_ANALOG_TV, + V4L2_TUNER_DIGITAL_TV, +) = range(1, 4) + + +v4l2_memory = enum +( + V4L2_MEMORY_MMAP, + V4L2_MEMORY_USERPTR, + V4L2_MEMORY_OVERLAY, +) = range(1, 4) + + +v4l2_colorspace = enum +( + V4L2_COLORSPACE_SMPTE170M, + V4L2_COLORSPACE_SMPTE240M, + V4L2_COLORSPACE_REC709, + V4L2_COLORSPACE_BT878, + V4L2_COLORSPACE_470_SYSTEM_M, + V4L2_COLORSPACE_470_SYSTEM_BG, + V4L2_COLORSPACE_JPEG, + V4L2_COLORSPACE_SRGB, +) = range(1, 9) + + +v4l2_priority = enum +( + V4L2_PRIORITY_UNSET, + V4L2_PRIORITY_BACKGROUND, + V4L2_PRIORITY_INTERACTIVE, + V4L2_PRIORITY_RECORD, + V4L2_PRIORITY_DEFAULT, +) = list(range(0, 4)) + [2] + + +class v4l2_rect(ctypes.Structure): + _fields_ = [ + ('left', ctypes.c_int32), + ('top', ctypes.c_int32), + ('width', ctypes.c_int32), + ('height', ctypes.c_int32), + ] + + +class v4l2_fract(ctypes.Structure): + _fields_ = [ + ('numerator', ctypes.c_uint32), + ('denominator', ctypes.c_uint32), + ] + + +# +# Driver capabilities +# + +class v4l2_capability(ctypes.Structure): + _fields_ = [ + ('driver', ctypes.c_char * 16), + ('card', ctypes.c_char * 32), + ('bus_info', ctypes.c_char * 32), + ('version', ctypes.c_uint32), + ('capabilities', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +# +# Values for 'capabilities' field +# + +V4L2_CAP_VIDEO_CAPTURE = 0x00000001 +V4L2_CAP_VIDEO_OUTPUT = 0x00000002 +V4L2_CAP_VIDEO_OVERLAY = 0x00000004 +V4L2_CAP_VBI_CAPTURE = 0x00000010 +V4L2_CAP_VBI_OUTPUT = 0x00000020 +V4L2_CAP_SLICED_VBI_CAPTURE = 0x00000040 +V4L2_CAP_SLICED_VBI_OUTPUT = 0x00000080 +V4L2_CAP_RDS_CAPTURE = 0x00000100 +V4L2_CAP_VIDEO_OUTPUT_OVERLAY = 0x00000200 +V4L2_CAP_HW_FREQ_SEEK = 0x00000400 +V4L2_CAP_RDS_OUTPUT = 0x00000800 + +V4L2_CAP_TUNER = 0x00010000 +V4L2_CAP_AUDIO = 0x00020000 +V4L2_CAP_RADIO = 0x00040000 +V4L2_CAP_MODULATOR = 0x00080000 + +V4L2_CAP_READWRITE = 0x01000000 +V4L2_CAP_ASYNCIO = 0x02000000 +V4L2_CAP_STREAMING = 0x04000000 + + +# +# Video image format +# + +class v4l2_pix_format(ctypes.Structure): + _fields_ = [ + ('width', ctypes.c_uint32), + ('height', ctypes.c_uint32), + ('pixelformat', ctypes.c_uint32), + ('field', v4l2_field), + ('bytesperline', ctypes.c_uint32), + ('sizeimage', ctypes.c_uint32), + ('colorspace', v4l2_colorspace), + ('priv', ctypes.c_uint32), + ] + +# RGB formats +V4L2_PIX_FMT_RGB332 = v4l2_fourcc('R', 'G', 'B', '1') +V4L2_PIX_FMT_RGB444 = v4l2_fourcc('R', '4', '4', '4') +V4L2_PIX_FMT_RGB555 = v4l2_fourcc('R', 'G', 'B', 'O') +V4L2_PIX_FMT_RGB565 = v4l2_fourcc('R', 'G', 'B', 'P') +V4L2_PIX_FMT_RGB555X = v4l2_fourcc('R', 'G', 'B', 'Q') +V4L2_PIX_FMT_RGB565X = v4l2_fourcc('R', 'G', 'B', 'R') +V4L2_PIX_FMT_BGR24 = v4l2_fourcc('B', 'G', 'R', '3') +V4L2_PIX_FMT_RGB24 = v4l2_fourcc('R', 'G', 'B', '3') +V4L2_PIX_FMT_BGR32 = v4l2_fourcc('B', 'G', 'R', '4') +V4L2_PIX_FMT_RGB32 = v4l2_fourcc('R', 'G', 'B', '4') + +# Grey formats +V4L2_PIX_FMT_GREY = v4l2_fourcc('G', 'R', 'E', 'Y') +V4L2_PIX_FMT_Y10 = v4l2_fourcc('Y', '1', '0', ' ') +V4L2_PIX_FMT_Y16 = v4l2_fourcc('Y', '1', '6', ' ') + +# Palette formats +V4L2_PIX_FMT_PAL8 = v4l2_fourcc('P', 'A', 'L', '8') + +# Luminance+Chrominance formats +V4L2_PIX_FMT_YVU410 = v4l2_fourcc('Y', 'V', 'U', '9') +V4L2_PIX_FMT_YVU420 = v4l2_fourcc('Y', 'V', '1', '2') +V4L2_PIX_FMT_YUYV = v4l2_fourcc('Y', 'U', 'Y', 'V') +V4L2_PIX_FMT_YYUV = v4l2_fourcc('Y', 'Y', 'U', 'V') +V4L2_PIX_FMT_YVYU = v4l2_fourcc('Y', 'V', 'Y', 'U') +V4L2_PIX_FMT_UYVY = v4l2_fourcc('U', 'Y', 'V', 'Y') +V4L2_PIX_FMT_VYUY = v4l2_fourcc('V', 'Y', 'U', 'Y') +V4L2_PIX_FMT_YUV422P = v4l2_fourcc('4', '2', '2', 'P') +V4L2_PIX_FMT_YUV411P = v4l2_fourcc('4', '1', '1', 'P') +V4L2_PIX_FMT_Y41P = v4l2_fourcc('Y', '4', '1', 'P') +V4L2_PIX_FMT_YUV444 = v4l2_fourcc('Y', '4', '4', '4') +V4L2_PIX_FMT_YUV555 = v4l2_fourcc('Y', 'U', 'V', 'O') +V4L2_PIX_FMT_YUV565 = v4l2_fourcc('Y', 'U', 'V', 'P') +V4L2_PIX_FMT_YUV32 = v4l2_fourcc('Y', 'U', 'V', '4') +V4L2_PIX_FMT_YUV410 = v4l2_fourcc('Y', 'U', 'V', '9') +V4L2_PIX_FMT_YUV420 = v4l2_fourcc('Y', 'U', '1', '2') +V4L2_PIX_FMT_HI240 = v4l2_fourcc('H', 'I', '2', '4') +V4L2_PIX_FMT_HM12 = v4l2_fourcc('H', 'M', '1', '2') + +# two planes -- one Y, one Cr + Cb interleaved +V4L2_PIX_FMT_NV12 = v4l2_fourcc('N', 'V', '1', '2') +V4L2_PIX_FMT_NV21 = v4l2_fourcc('N', 'V', '2', '1') +V4L2_PIX_FMT_NV16 = v4l2_fourcc('N', 'V', '1', '6') +V4L2_PIX_FMT_NV61 = v4l2_fourcc('N', 'V', '6', '1') + +# Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm +V4L2_PIX_FMT_SBGGR8 = v4l2_fourcc('B', 'A', '8', '1') +V4L2_PIX_FMT_SGBRG8 = v4l2_fourcc('G', 'B', 'R', 'G') +V4L2_PIX_FMT_SGRBG8 = v4l2_fourcc('G', 'R', 'B', 'G') +V4L2_PIX_FMT_SRGGB8 = v4l2_fourcc('R', 'G', 'G', 'B') +V4L2_PIX_FMT_SBGGR10 = v4l2_fourcc('B', 'G', '1', '0') +V4L2_PIX_FMT_SGBRG10 = v4l2_fourcc('G', 'B', '1', '0') +V4L2_PIX_FMT_SGRBG10 = v4l2_fourcc('B', 'A', '1', '0') +V4L2_PIX_FMT_SRGGB10 = v4l2_fourcc('R', 'G', '1', '0') +V4L2_PIX_FMT_SGRBG10DPCM8 = v4l2_fourcc('B', 'D', '1', '0') +V4L2_PIX_FMT_SBGGR16 = v4l2_fourcc('B', 'Y', 'R', '2') + +# compressed formats +V4L2_PIX_FMT_MJPEG = v4l2_fourcc('M', 'J', 'P', 'G') +V4L2_PIX_FMT_JPEG = v4l2_fourcc('J', 'P', 'E', 'G') +V4L2_PIX_FMT_DV = v4l2_fourcc('d', 'v', 's', 'd') +V4L2_PIX_FMT_MPEG = v4l2_fourcc('M', 'P', 'E', 'G') + +# Vendor-specific formats +V4L2_PIX_FMT_CPIA1 = v4l2_fourcc('C', 'P', 'I', 'A') +V4L2_PIX_FMT_WNVA = v4l2_fourcc('W', 'N', 'V', 'A') +V4L2_PIX_FMT_SN9C10X = v4l2_fourcc('S', '9', '1', '0') +V4L2_PIX_FMT_SN9C20X_I420 = v4l2_fourcc('S', '9', '2', '0') +V4L2_PIX_FMT_PWC1 = v4l2_fourcc('P', 'W', 'C', '1') +V4L2_PIX_FMT_PWC2 = v4l2_fourcc('P', 'W', 'C', '2') +V4L2_PIX_FMT_ET61X251 = v4l2_fourcc('E', '6', '2', '5') +V4L2_PIX_FMT_SPCA501 = v4l2_fourcc('S', '5', '0', '1') +V4L2_PIX_FMT_SPCA505 = v4l2_fourcc('S', '5', '0', '5') +V4L2_PIX_FMT_SPCA508 = v4l2_fourcc('S', '5', '0', '8') +V4L2_PIX_FMT_SPCA561 = v4l2_fourcc('S', '5', '6', '1') +V4L2_PIX_FMT_PAC207 = v4l2_fourcc('P', '2', '0', '7') +V4L2_PIX_FMT_MR97310A = v4l2_fourcc('M', '3', '1', '0') +V4L2_PIX_FMT_SN9C2028 = v4l2_fourcc('S', 'O', 'N', 'X') +V4L2_PIX_FMT_SQ905C = v4l2_fourcc('9', '0', '5', 'C') +V4L2_PIX_FMT_PJPG = v4l2_fourcc('P', 'J', 'P', 'G') +V4L2_PIX_FMT_OV511 = v4l2_fourcc('O', '5', '1', '1') +V4L2_PIX_FMT_OV518 = v4l2_fourcc('O', '5', '1', '8') +V4L2_PIX_FMT_STV0680 = v4l2_fourcc('S', '6', '8', '0') + + +# +# Format enumeration +# + +class v4l2_fmtdesc(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('type', ctypes.c_int), + ('flags', ctypes.c_uint32), + ('description', ctypes.c_char * 32), + ('pixelformat', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + +V4L2_FMT_FLAG_COMPRESSED = 0x0001 +V4L2_FMT_FLAG_EMULATED = 0x0002 + + +# +# Experimental frame size and frame rate enumeration +# + +v4l2_frmsizetypes = enum +( + V4L2_FRMSIZE_TYPE_DISCRETE, + V4L2_FRMSIZE_TYPE_CONTINUOUS, + V4L2_FRMSIZE_TYPE_STEPWISE, +) = range(1, 4) + + +class v4l2_frmsize_discrete(ctypes.Structure): + _fields_ = [ + ('width', ctypes.c_uint32), + ('height', ctypes.c_uint32), + ] + + +class v4l2_frmsize_stepwise(ctypes.Structure): + _fields_ = [ + ('min_width', ctypes.c_uint32), + ('min_height', ctypes.c_uint32), + ('step_width', ctypes.c_uint32), + ('min_height', ctypes.c_uint32), + ('max_height', ctypes.c_uint32), + ('step_height', ctypes.c_uint32), + ] + + +class v4l2_frmsizeenum(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('discrete', v4l2_frmsize_discrete), + ('stepwise', v4l2_frmsize_stepwise), + ] + + _fields_ = [ + ('index', ctypes.c_uint32), + ('pixel_format', ctypes.c_uint32), + ('type', ctypes.c_uint32), + ('_u', _u), + ('reserved', ctypes.c_uint32 * 2) + ] + + _anonymous_ = ('_u',) + + +# +# Frame rate enumeration +# + +v4l2_frmivaltypes = enum +( + V4L2_FRMIVAL_TYPE_DISCRETE, + V4L2_FRMIVAL_TYPE_CONTINUOUS, + V4L2_FRMIVAL_TYPE_STEPWISE, +) = range(1, 4) + + +class v4l2_frmival_stepwise(ctypes.Structure): + _fields_ = [ + ('min', v4l2_fract), + ('max', v4l2_fract), + ('step', v4l2_fract), + ] + + +class v4l2_frmivalenum(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('discrete', v4l2_fract), + ('stepwise', v4l2_frmival_stepwise), + ] + + _fields_ = [ + ('index', ctypes.c_uint32), + ('pixel_format', ctypes.c_uint32), + ('width', ctypes.c_uint32), + ('height', ctypes.c_uint32), + ('type', ctypes.c_uint32), + ('_u', _u), + ('reserved', ctypes.c_uint32 * 2), + ] + + _anonymous_ = ('_u',) + + +# +# Timecode +# + +class v4l2_timecode(ctypes.Structure): + _fields_ = [ + ('type', ctypes.c_uint32), + ('flags', ctypes.c_uint32), + ('frames', ctypes.c_uint8), + ('seconds', ctypes.c_uint8), + ('minutes', ctypes.c_uint8), + ('hours', ctypes.c_uint8), + ('userbits', ctypes.c_uint8 * 4), + ] + + +V4L2_TC_TYPE_24FPS = 1 +V4L2_TC_TYPE_25FPS = 2 +V4L2_TC_TYPE_30FPS = 3 +V4L2_TC_TYPE_50FPS = 4 +V4L2_TC_TYPE_60FPS = 5 + +V4L2_TC_FLAG_DROPFRAME = 0x0001 +V4L2_TC_FLAG_COLORFRAME = 0x0002 +V4L2_TC_USERBITS_field = 0x000C +V4L2_TC_USERBITS_USERDEFINED = 0x0000 +V4L2_TC_USERBITS_8BITCHARS = 0x0008 + + +class v4l2_jpegcompression(ctypes.Structure): + _fields_ = [ + ('quality', ctypes.c_int), + ('APPn', ctypes.c_int), + ('APP_len', ctypes.c_int), + ('APP_data', ctypes.c_char * 60), + ('COM_len', ctypes.c_int), + ('COM_data', ctypes.c_char * 60), + ('jpeg_markers', ctypes.c_uint32), + ] + + +V4L2_JPEG_MARKER_DHT = 1 << 3 +V4L2_JPEG_MARKER_DQT = 1 << 4 +V4L2_JPEG_MARKER_DRI = 1 << 5 +V4L2_JPEG_MARKER_COM = 1 << 6 +V4L2_JPEG_MARKER_APP = 1 << 7 + + +# +# Memory-mapping buffers +# + +class v4l2_requestbuffers(ctypes.Structure): + _fields_ = [ + ('count', ctypes.c_uint32), + ('type', v4l2_buf_type), + ('memory', v4l2_memory), + ('reserved', ctypes.c_uint32 * 2), + ] + + +class v4l2_buffer(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('offset', ctypes.c_uint32), + ('userptr', ctypes.c_ulong), + ] + + _fields_ = [ + ('index', ctypes.c_uint32), + ('type', v4l2_buf_type), + ('bytesused', ctypes.c_uint32), + ('flags', ctypes.c_uint32), + ('field', v4l2_field), + ('timestamp', timeval), + ('timecode', v4l2_timecode), + ('sequence', ctypes.c_uint32), + ('memory', v4l2_memory), + ('m', _u), + ('length', ctypes.c_uint32), + ('input', ctypes.c_uint32), + ('reserved', ctypes.c_uint32), + ] + + +V4L2_BUF_FLAG_MAPPED = 0x0001 +V4L2_BUF_FLAG_QUEUED = 0x0002 +V4L2_BUF_FLAG_DONE = 0x0004 +V4L2_BUF_FLAG_KEYFRAME = 0x0008 +V4L2_BUF_FLAG_PFRAME = 0x0010 +V4L2_BUF_FLAG_BFRAME = 0x0020 +V4L2_BUF_FLAG_TIMECODE = 0x0100 +V4L2_BUF_FLAG_INPUT = 0x0200 + + +# +# Overlay preview +# + +class v4l2_framebuffer(ctypes.Structure): + _fields_ = [ + ('capability', ctypes.c_uint32), + ('flags', ctypes.c_uint32), + ('base', ctypes.c_void_p), + ('fmt', v4l2_pix_format), + ] + +V4L2_FBUF_CAP_EXTERNOVERLAY = 0x0001 +V4L2_FBUF_CAP_CHROMAKEY = 0x0002 +V4L2_FBUF_CAP_LIST_CLIPPING = 0x0004 +V4L2_FBUF_CAP_BITMAP_CLIPPING = 0x0008 +V4L2_FBUF_CAP_LOCAL_ALPHA = 0x0010 +V4L2_FBUF_CAP_GLOBAL_ALPHA = 0x0020 +V4L2_FBUF_CAP_LOCAL_INV_ALPHA = 0x0040 +V4L2_FBUF_CAP_SRC_CHROMAKEY = 0x0080 + +V4L2_FBUF_FLAG_PRIMARY = 0x0001 +V4L2_FBUF_FLAG_OVERLAY = 0x0002 +V4L2_FBUF_FLAG_CHROMAKEY = 0x0004 +V4L2_FBUF_FLAG_LOCAL_ALPHA = 0x0008 +V4L2_FBUF_FLAG_GLOBAL_ALPHA = 0x0010 +V4L2_FBUF_FLAG_LOCAL_INV_ALPHA = 0x0020 +V4L2_FBUF_FLAG_SRC_CHROMAKEY = 0x0040 + + +class v4l2_clip(ctypes.Structure): + pass +v4l2_clip._fields_ = [ + ('c', v4l2_rect), + ('next', ctypes.POINTER(v4l2_clip)), +] + + +class v4l2_window(ctypes.Structure): + _fields_ = [ + ('w', v4l2_rect), + ('field', v4l2_field), + ('chromakey', ctypes.c_uint32), + ('clips', ctypes.POINTER(v4l2_clip)), + ('clipcount', ctypes.c_uint32), + ('bitmap', ctypes.c_void_p), + ('global_alpha', ctypes.c_uint8), + ] + + +# +# Capture parameters +# + +class v4l2_captureparm(ctypes.Structure): + _fields_ = [ + ('capability', ctypes.c_uint32), + ('capturemode', ctypes.c_uint32), + ('timeperframe', v4l2_fract), + ('extendedmode', ctypes.c_uint32), + ('readbuffers', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +V4L2_MODE_HIGHQUALITY = 0x0001 +V4L2_CAP_TIMEPERFRAME = 0x1000 + + +class v4l2_outputparm(ctypes.Structure): + _fields_ = [ + ('capability', ctypes.c_uint32), + ('outputmode', ctypes.c_uint32), + ('timeperframe', v4l2_fract), + ('extendedmode', ctypes.c_uint32), + ('writebuffers', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +# +# Input image cropping +# + +class v4l2_cropcap(ctypes.Structure): + _fields_ = [ + ('type', v4l2_buf_type), + ('bounds', v4l2_rect), + ('defrect', v4l2_rect), + ('pixelaspect', v4l2_fract), + ] + + +class v4l2_crop(ctypes.Structure): + _fields_ = [ + ('type', ctypes.c_int), + ('c', v4l2_rect), + ] + + +# +# Analog video standard +# + +v4l2_std_id = ctypes.c_uint64 + + +V4L2_STD_PAL_B = 0x00000001 +V4L2_STD_PAL_B1 = 0x00000002 +V4L2_STD_PAL_G = 0x00000004 +V4L2_STD_PAL_H = 0x00000008 +V4L2_STD_PAL_I = 0x00000010 +V4L2_STD_PAL_D = 0x00000020 +V4L2_STD_PAL_D1 = 0x00000040 +V4L2_STD_PAL_K = 0x00000080 + +V4L2_STD_PAL_M = 0x00000100 +V4L2_STD_PAL_N = 0x00000200 +V4L2_STD_PAL_Nc = 0x00000400 +V4L2_STD_PAL_60 = 0x00000800 + +V4L2_STD_NTSC_M = 0x00001000 +V4L2_STD_NTSC_M_JP = 0x00002000 +V4L2_STD_NTSC_443 = 0x00004000 +V4L2_STD_NTSC_M_KR = 0x00008000 + +V4L2_STD_SECAM_B = 0x00010000 +V4L2_STD_SECAM_D = 0x00020000 +V4L2_STD_SECAM_G = 0x00040000 +V4L2_STD_SECAM_H = 0x00080000 +V4L2_STD_SECAM_K = 0x00100000 +V4L2_STD_SECAM_K1 = 0x00200000 +V4L2_STD_SECAM_L = 0x00400000 +V4L2_STD_SECAM_LC = 0x00800000 + +V4L2_STD_ATSC_8_VSB = 0x01000000 +V4L2_STD_ATSC_16_VSB = 0x02000000 + + +# some common needed stuff +V4L2_STD_PAL_BG = (V4L2_STD_PAL_B | V4L2_STD_PAL_B1 | V4L2_STD_PAL_G) +V4L2_STD_PAL_DK = (V4L2_STD_PAL_D | V4L2_STD_PAL_D1 | V4L2_STD_PAL_K) +V4L2_STD_PAL = (V4L2_STD_PAL_BG | V4L2_STD_PAL_DK | V4L2_STD_PAL_H | V4L2_STD_PAL_I) +V4L2_STD_NTSC = (V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_NTSC_M_KR) +V4L2_STD_SECAM_DK = (V4L2_STD_SECAM_D | V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1) +V4L2_STD_SECAM = (V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H | V4L2_STD_SECAM_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC) + +V4L2_STD_525_60 = (V4L2_STD_PAL_M | V4L2_STD_PAL_60 | V4L2_STD_NTSC | V4L2_STD_NTSC_443) +V4L2_STD_625_50 = (V4L2_STD_PAL | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc | V4L2_STD_SECAM) +V4L2_STD_ATSC = (V4L2_STD_ATSC_8_VSB | V4L2_STD_ATSC_16_VSB) + +V4L2_STD_UNKNOWN = 0 +V4L2_STD_ALL = (V4L2_STD_525_60 | V4L2_STD_625_50) + +# some merged standards +V4L2_STD_MN = (V4L2_STD_PAL_M | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc | V4L2_STD_NTSC) +V4L2_STD_B = (V4L2_STD_PAL_B | V4L2_STD_PAL_B1 | V4L2_STD_SECAM_B) +V4L2_STD_GH = (V4L2_STD_PAL_G | V4L2_STD_PAL_H|V4L2_STD_SECAM_G | V4L2_STD_SECAM_H) +V4L2_STD_DK = (V4L2_STD_PAL_DK | V4L2_STD_SECAM_DK) + + +class v4l2_standard(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('id', v4l2_std_id), + ('name', ctypes.c_char * 24), + ('frameperiod', v4l2_fract), + ('framelines', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +# +# Video timings dv preset +# + +class v4l2_dv_preset(ctypes.Structure): + _fields_ = [ + ('preset', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4) + ] + + +# +# DV preset enumeration +# + +class v4l2_dv_enum_preset(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('preset', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('width', ctypes.c_uint32), + ('height', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + +# +# DV preset values +# + +V4L2_DV_INVALID = 0 +V4L2_DV_480P59_94 = 1 +V4L2_DV_576P50 = 2 +V4L2_DV_720P24 = 3 +V4L2_DV_720P25 = 4 +V4L2_DV_720P30 = 5 +V4L2_DV_720P50 = 6 +V4L2_DV_720P59_94 = 7 +V4L2_DV_720P60 = 8 +V4L2_DV_1080I29_97 = 9 +V4L2_DV_1080I30 = 10 +V4L2_DV_1080I25 = 11 +V4L2_DV_1080I50 = 12 +V4L2_DV_1080I60 = 13 +V4L2_DV_1080P24 = 14 +V4L2_DV_1080P25 = 15 +V4L2_DV_1080P30 = 16 +V4L2_DV_1080P50 = 17 +V4L2_DV_1080P60 = 18 + + +# +# DV BT timings +# + +class v4l2_bt_timings(ctypes.Structure): + _fields_ = [ + ('width', ctypes.c_uint32), + ('height', ctypes.c_uint32), + ('interlaced', ctypes.c_uint32), + ('polarities', ctypes.c_uint32), + ('pixelclock', ctypes.c_uint64), + ('hfrontporch', ctypes.c_uint32), + ('hsync', ctypes.c_uint32), + ('hbackporch', ctypes.c_uint32), + ('vfrontporch', ctypes.c_uint32), + ('vsync', ctypes.c_uint32), + ('vbackporch', ctypes.c_uint32), + ('il_vfrontporch', ctypes.c_uint32), + ('il_vsync', ctypes.c_uint32), + ('il_vbackporch', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 16), + ] + + _pack_ = True + +# Interlaced or progressive format +V4L2_DV_PROGRESSIVE = 0 +V4L2_DV_INTERLACED = 1 + +# Polarities. If bit is not set, it is assumed to be negative polarity +V4L2_DV_VSYNC_POS_POL = 0x00000001 +V4L2_DV_HSYNC_POS_POL = 0x00000002 + + +class v4l2_dv_timings(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('bt', v4l2_bt_timings), + ('reserved', ctypes.c_uint32 * 32), + ] + + _fields_ = [ + ('type', ctypes.c_uint32), + ('_u', _u), + ] + + _anonymous_ = ('_u',) + _pack_ = True + + +# Values for the type field +V4L2_DV_BT_656_1120 = 0 + + +# +# Video inputs +# + +class v4l2_input(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('type', ctypes.c_uint32), + ('audioset', ctypes.c_uint32), + ('tuner', ctypes.c_uint32), + ('std', v4l2_std_id), + ('status', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +V4L2_INPUT_TYPE_TUNER = 1 +V4L2_INPUT_TYPE_CAMERA = 2 + +V4L2_IN_ST_NO_POWER = 0x00000001 +V4L2_IN_ST_NO_SIGNAL = 0x00000002 +V4L2_IN_ST_NO_COLOR = 0x00000004 + +V4L2_IN_ST_HFLIP = 0x00000010 +V4L2_IN_ST_VFLIP = 0x00000020 + +V4L2_IN_ST_NO_H_LOCK = 0x00000100 +V4L2_IN_ST_COLOR_KILL = 0x00000200 + +V4L2_IN_ST_NO_SYNC = 0x00010000 +V4L2_IN_ST_NO_EQU = 0x00020000 +V4L2_IN_ST_NO_CARRIER = 0x00040000 + +V4L2_IN_ST_MACROVISION = 0x01000000 +V4L2_IN_ST_NO_ACCESS = 0x02000000 +V4L2_IN_ST_VTR = 0x04000000 + +V4L2_IN_CAP_PRESETS = 0x00000001 +V4L2_IN_CAP_CUSTOM_TIMINGS = 0x00000002 +V4L2_IN_CAP_STD = 0x00000004 + +# +# Video outputs +# + +class v4l2_output(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('type', ctypes.c_uint32), + ('audioset', ctypes.c_uint32), + ('modulator', ctypes.c_uint32), + ('std', v4l2_std_id), + ('reserved', ctypes.c_uint32 * 4), + ] + + +V4L2_OUTPUT_TYPE_MODULATOR = 1 +V4L2_OUTPUT_TYPE_ANALOG = 2 +V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY = 3 + +V4L2_OUT_CAP_PRESETS = 0x00000001 +V4L2_OUT_CAP_CUSTOM_TIMINGS = 0x00000002 +V4L2_OUT_CAP_STD = 0x00000004 + +# +# Controls +# + +class v4l2_control(ctypes.Structure): + _fields_ = [ + ('id', ctypes.c_uint32), + ('value', ctypes.c_int32), + ] + + +class v4l2_ext_control(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('value', ctypes.c_int32), + ('value64', ctypes.c_int64), + ('reserved', ctypes.c_void_p), + ] + + _fields_ = [ + ('id', ctypes.c_uint32), + ('reserved2', ctypes.c_uint32 * 2), + ('_u', _u) + ] + + _anonymous_ = ('_u',) + _pack_ = True + + +class v4l2_ext_controls(ctypes.Structure): + _fields_ = [ + ('ctrl_class', ctypes.c_uint32), + ('count', ctypes.c_uint32), + ('error_idx', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ('controls', ctypes.POINTER(v4l2_ext_control)), + ] + + +V4L2_CTRL_CLASS_USER = 0x00980000 +V4L2_CTRL_CLASS_MPEG = 0x00990000 +V4L2_CTRL_CLASS_CAMERA = 0x009a0000 +V4L2_CTRL_CLASS_FM_TX = 0x009b0000 + + +def V4L2_CTRL_ID_MASK(): + return 0x0fffffff + + +def V4L2_CTRL_ID2CLASS(id_): + return id_ & 0x0fff0000 # unsigned long + + +def V4L2_CTRL_DRIVER_PRIV(id_): + return (id_ & 0xffff) >= 0x1000 + + +class v4l2_queryctrl(ctypes.Structure): + _fields_ = [ + ('id', ctypes.c_uint32), + ('type', v4l2_ctrl_type), + ('name', ctypes.c_char * 32), + ('minimum', ctypes.c_int32), + ('maximum', ctypes.c_int32), + ('step', ctypes.c_int32), + ('default', ctypes.c_int32), + ('flags', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ] + + +class v4l2_querymenu(ctypes.Structure): + _fields_ = [ + ('id', ctypes.c_uint32), + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('reserved', ctypes.c_uint32), + ] + + +V4L2_CTRL_FLAG_DISABLED = 0x0001 +V4L2_CTRL_FLAG_GRABBED = 0x0002 +V4L2_CTRL_FLAG_READ_ONLY = 0x0004 +V4L2_CTRL_FLAG_UPDATE = 0x0008 +V4L2_CTRL_FLAG_INACTIVE = 0x0010 +V4L2_CTRL_FLAG_SLIDER = 0x0020 +V4L2_CTRL_FLAG_WRITE_ONLY = 0x0040 + +V4L2_CTRL_FLAG_NEXT_CTRL = 0x80000000 + +V4L2_CID_BASE = V4L2_CTRL_CLASS_USER | 0x900 +V4L2_CID_USER_BASE = V4L2_CID_BASE +V4L2_CID_PRIVATE_BASE = 0x08000000 + +V4L2_CID_USER_CLASS = V4L2_CTRL_CLASS_USER | 1 +V4L2_CID_BRIGHTNESS = V4L2_CID_BASE + 0 +V4L2_CID_CONTRAST = V4L2_CID_BASE + 1 +V4L2_CID_SATURATION = V4L2_CID_BASE + 2 +V4L2_CID_HUE = V4L2_CID_BASE + 3 +V4L2_CID_AUDIO_VOLUME = V4L2_CID_BASE + 5 +V4L2_CID_AUDIO_BALANCE = V4L2_CID_BASE + 6 +V4L2_CID_AUDIO_BASS = V4L2_CID_BASE + 7 +V4L2_CID_AUDIO_TREBLE = V4L2_CID_BASE + 8 +V4L2_CID_AUDIO_MUTE = V4L2_CID_BASE + 9 +V4L2_CID_AUDIO_LOUDNESS = V4L2_CID_BASE + 10 +V4L2_CID_BLACK_LEVEL = V4L2_CID_BASE + 11 # Deprecated +V4L2_CID_AUTO_WHITE_BALANCE = V4L2_CID_BASE + 12 +V4L2_CID_DO_WHITE_BALANCE = V4L2_CID_BASE + 13 +V4L2_CID_RED_BALANCE = V4L2_CID_BASE + 14 +V4L2_CID_BLUE_BALANCE = V4L2_CID_BASE + 15 +V4L2_CID_GAMMA = V4L2_CID_BASE + 16 +V4L2_CID_WHITENESS = V4L2_CID_GAMMA # Deprecated +V4L2_CID_EXPOSURE = V4L2_CID_BASE + 17 +V4L2_CID_AUTOGAIN = V4L2_CID_BASE + 18 +V4L2_CID_GAIN = V4L2_CID_BASE + 19 +V4L2_CID_HFLIP = V4L2_CID_BASE + 20 +V4L2_CID_VFLIP = V4L2_CID_BASE + 21 + +# Deprecated; use V4L2_CID_PAN_RESET and V4L2_CID_TILT_RESET +V4L2_CID_HCENTER = V4L2_CID_BASE + 22 +V4L2_CID_VCENTER = V4L2_CID_BASE + 23 + +V4L2_CID_POWER_LINE_FREQUENCY = V4L2_CID_BASE + 24 + +v4l2_power_line_frequency = enum +( + V4L2_CID_POWER_LINE_FREQUENCY_DISABLED, + V4L2_CID_POWER_LINE_FREQUENCY_50HZ, + V4L2_CID_POWER_LINE_FREQUENCY_60HZ, +) = range(3) + +V4L2_CID_HUE_AUTO = V4L2_CID_BASE + 25 +V4L2_CID_WHITE_BALANCE_TEMPERATURE = V4L2_CID_BASE + 26 +V4L2_CID_SHARPNESS = V4L2_CID_BASE + 27 +V4L2_CID_BACKLIGHT_COMPENSATION = V4L2_CID_BASE + 28 +V4L2_CID_CHROMA_AGC = V4L2_CID_BASE + 29 +V4L2_CID_COLOR_KILLER = V4L2_CID_BASE + 30 +V4L2_CID_COLORFX = V4L2_CID_BASE + 31 + +v4l2_colorfx = enum +( + V4L2_COLORFX_NONE, + V4L2_COLORFX_BW, + V4L2_COLORFX_SEPIA, +) = range(3) + +V4L2_CID_AUTOBRIGHTNESS = V4L2_CID_BASE + 32 +V4L2_CID_BAND_STOP_FILTER = V4L2_CID_BASE + 33 + +V4L2_CID_ROTATE = V4L2_CID_BASE + 34 +V4L2_CID_BG_COLOR = V4L2_CID_BASE + 35 +V4L2_CID_LASTP1 = V4L2_CID_BASE + 36 + +V4L2_CID_MPEG_BASE = V4L2_CTRL_CLASS_MPEG | 0x900 +V4L2_CID_MPEG_CLASS = V4L2_CTRL_CLASS_MPEG | 1 + +# MPEG streams +V4L2_CID_MPEG_STREAM_TYPE = V4L2_CID_MPEG_BASE + 0 + +v4l2_mpeg_stream_type = enum +( + V4L2_MPEG_STREAM_TYPE_MPEG2_PS, + V4L2_MPEG_STREAM_TYPE_MPEG2_TS, + V4L2_MPEG_STREAM_TYPE_MPEG1_SS, + V4L2_MPEG_STREAM_TYPE_MPEG2_DVD, + V4L2_MPEG_STREAM_TYPE_MPEG1_VCD, + V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD, +) = range(6) + +V4L2_CID_MPEG_STREAM_PID_PMT = V4L2_CID_MPEG_BASE + 1 +V4L2_CID_MPEG_STREAM_PID_AUDIO = V4L2_CID_MPEG_BASE + 2 +V4L2_CID_MPEG_STREAM_PID_VIDEO = V4L2_CID_MPEG_BASE + 3 +V4L2_CID_MPEG_STREAM_PID_PCR = V4L2_CID_MPEG_BASE + 4 +V4L2_CID_MPEG_STREAM_PES_ID_AUDIO = V4L2_CID_MPEG_BASE + 5 +V4L2_CID_MPEG_STREAM_PES_ID_VIDEO = V4L2_CID_MPEG_BASE + 6 +V4L2_CID_MPEG_STREAM_VBI_FMT = V4L2_CID_MPEG_BASE + 7 + +v4l2_mpeg_stream_vbi_fmt = enum +( + V4L2_MPEG_STREAM_VBI_FMT_NONE, + V4L2_MPEG_STREAM_VBI_FMT_IVTV, +) = range(2) + +V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ = V4L2_CID_MPEG_BASE + 100 + +v4l2_mpeg_audio_sampling_freq = enum +( + V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100, + V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000, + V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000, +) = range(3) + +V4L2_CID_MPEG_AUDIO_ENCODING = V4L2_CID_MPEG_BASE + 101 + +v4l2_mpeg_audio_encoding = enum +( + V4L2_MPEG_AUDIO_ENCODING_LAYER_1, + V4L2_MPEG_AUDIO_ENCODING_LAYER_2, + V4L2_MPEG_AUDIO_ENCODING_LAYER_3, + V4L2_MPEG_AUDIO_ENCODING_AAC, + V4L2_MPEG_AUDIO_ENCODING_AC3, +) = range(5) + +V4L2_CID_MPEG_AUDIO_L1_BITRATE = V4L2_CID_MPEG_BASE + 102 + +v4l2_mpeg_audio_l1_bitrate = enum +( + V4L2_MPEG_AUDIO_L1_BITRATE_32K, + V4L2_MPEG_AUDIO_L1_BITRATE_64K, + V4L2_MPEG_AUDIO_L1_BITRATE_96K, + V4L2_MPEG_AUDIO_L1_BITRATE_128K, + V4L2_MPEG_AUDIO_L1_BITRATE_160K, + V4L2_MPEG_AUDIO_L1_BITRATE_192K, + V4L2_MPEG_AUDIO_L1_BITRATE_224K, + V4L2_MPEG_AUDIO_L1_BITRATE_256K, + V4L2_MPEG_AUDIO_L1_BITRATE_288K, + V4L2_MPEG_AUDIO_L1_BITRATE_320K, + V4L2_MPEG_AUDIO_L1_BITRATE_352K, + V4L2_MPEG_AUDIO_L1_BITRATE_384K, + V4L2_MPEG_AUDIO_L1_BITRATE_416K, + V4L2_MPEG_AUDIO_L1_BITRATE_448K, +) = range(14) + +V4L2_CID_MPEG_AUDIO_L2_BITRATE = V4L2_CID_MPEG_BASE + 103 + +v4l2_mpeg_audio_l2_bitrate = enum +( + V4L2_MPEG_AUDIO_L2_BITRATE_32K, + V4L2_MPEG_AUDIO_L2_BITRATE_48K, + V4L2_MPEG_AUDIO_L2_BITRATE_56K, + V4L2_MPEG_AUDIO_L2_BITRATE_64K, + V4L2_MPEG_AUDIO_L2_BITRATE_80K, + V4L2_MPEG_AUDIO_L2_BITRATE_96K, + V4L2_MPEG_AUDIO_L2_BITRATE_112K, + V4L2_MPEG_AUDIO_L2_BITRATE_128K, + V4L2_MPEG_AUDIO_L2_BITRATE_160K, + V4L2_MPEG_AUDIO_L2_BITRATE_192K, + V4L2_MPEG_AUDIO_L2_BITRATE_224K, + V4L2_MPEG_AUDIO_L2_BITRATE_256K, + V4L2_MPEG_AUDIO_L2_BITRATE_320K, + V4L2_MPEG_AUDIO_L2_BITRATE_384K, +) = range(14) + +V4L2_CID_MPEG_AUDIO_L3_BITRATE = V4L2_CID_MPEG_BASE + 104 + +v4l2_mpeg_audio_l3_bitrate = enum +( + V4L2_MPEG_AUDIO_L3_BITRATE_32K, + V4L2_MPEG_AUDIO_L3_BITRATE_40K, + V4L2_MPEG_AUDIO_L3_BITRATE_48K, + V4L2_MPEG_AUDIO_L3_BITRATE_56K, + V4L2_MPEG_AUDIO_L3_BITRATE_64K, + V4L2_MPEG_AUDIO_L3_BITRATE_80K, + V4L2_MPEG_AUDIO_L3_BITRATE_96K, + V4L2_MPEG_AUDIO_L3_BITRATE_112K, + V4L2_MPEG_AUDIO_L3_BITRATE_128K, + V4L2_MPEG_AUDIO_L3_BITRATE_160K, + V4L2_MPEG_AUDIO_L3_BITRATE_192K, + V4L2_MPEG_AUDIO_L3_BITRATE_224K, + V4L2_MPEG_AUDIO_L3_BITRATE_256K, + V4L2_MPEG_AUDIO_L3_BITRATE_320K, +) = range(14) + +V4L2_CID_MPEG_AUDIO_MODE = V4L2_CID_MPEG_BASE + 105 + +v4l2_mpeg_audio_mode = enum +( + V4L2_MPEG_AUDIO_MODE_STEREO, + V4L2_MPEG_AUDIO_MODE_JOINT_STEREO, + V4L2_MPEG_AUDIO_MODE_DUAL, + V4L2_MPEG_AUDIO_MODE_MONO, +) = range(4) + +V4L2_CID_MPEG_AUDIO_MODE_EXTENSION = V4L2_CID_MPEG_BASE + 106 + +v4l2_mpeg_audio_mode_extension = enum +( + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4, + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8, + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12, + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16, +) = range(4) + +V4L2_CID_MPEG_AUDIO_EMPHASIS = V4L2_CID_MPEG_BASE + 107 + +v4l2_mpeg_audio_emphasis = enum +( + V4L2_MPEG_AUDIO_EMPHASIS_NONE, + V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS, + V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17, +) = range(3) + +V4L2_CID_MPEG_AUDIO_CRC = V4L2_CID_MPEG_BASE + 108 + +v4l2_mpeg_audio_crc = enum +( + V4L2_MPEG_AUDIO_CRC_NONE, + V4L2_MPEG_AUDIO_CRC_CRC16, +) = range(2) + +V4L2_CID_MPEG_AUDIO_MUTE = V4L2_CID_MPEG_BASE + 109 +V4L2_CID_MPEG_AUDIO_AAC_BITRATE = V4L2_CID_MPEG_BASE + 110 +V4L2_CID_MPEG_AUDIO_AC3_BITRATE = V4L2_CID_MPEG_BASE + 111 + +v4l2_mpeg_audio_ac3_bitrate = enum +( + V4L2_MPEG_AUDIO_AC3_BITRATE_32K, + V4L2_MPEG_AUDIO_AC3_BITRATE_40K, + V4L2_MPEG_AUDIO_AC3_BITRATE_48K, + V4L2_MPEG_AUDIO_AC3_BITRATE_56K, + V4L2_MPEG_AUDIO_AC3_BITRATE_64K, + V4L2_MPEG_AUDIO_AC3_BITRATE_80K, + V4L2_MPEG_AUDIO_AC3_BITRATE_96K, + V4L2_MPEG_AUDIO_AC3_BITRATE_112K, + V4L2_MPEG_AUDIO_AC3_BITRATE_128K, + V4L2_MPEG_AUDIO_AC3_BITRATE_160K, + V4L2_MPEG_AUDIO_AC3_BITRATE_192K, + V4L2_MPEG_AUDIO_AC3_BITRATE_224K, + V4L2_MPEG_AUDIO_AC3_BITRATE_256K, + V4L2_MPEG_AUDIO_AC3_BITRATE_320K, + V4L2_MPEG_AUDIO_AC3_BITRATE_384K, + V4L2_MPEG_AUDIO_AC3_BITRATE_448K, + V4L2_MPEG_AUDIO_AC3_BITRATE_512K, + V4L2_MPEG_AUDIO_AC3_BITRATE_576K, + V4L2_MPEG_AUDIO_AC3_BITRATE_640K, +) = range(19) + +V4L2_CID_MPEG_VIDEO_ENCODING = V4L2_CID_MPEG_BASE + 200 + +v4l2_mpeg_video_encoding = enum +( + V4L2_MPEG_VIDEO_ENCODING_MPEG_1, + V4L2_MPEG_VIDEO_ENCODING_MPEG_2, + V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC, +) = range(3) + +V4L2_CID_MPEG_VIDEO_ASPECT = V4L2_CID_MPEG_BASE + 201 + +v4l2_mpeg_video_aspect = enum +( + V4L2_MPEG_VIDEO_ASPECT_1x1, + V4L2_MPEG_VIDEO_ASPECT_4x3, + V4L2_MPEG_VIDEO_ASPECT_16x9, + V4L2_MPEG_VIDEO_ASPECT_221x100, +) = range(4) + +V4L2_CID_MPEG_VIDEO_B_FRAMES = V4L2_CID_MPEG_BASE + 202 +V4L2_CID_MPEG_VIDEO_GOP_SIZE = V4L2_CID_MPEG_BASE + 203 +V4L2_CID_MPEG_VIDEO_GOP_CLOSURE = V4L2_CID_MPEG_BASE + 204 +V4L2_CID_MPEG_VIDEO_PULLDOWN = V4L2_CID_MPEG_BASE + 205 +V4L2_CID_MPEG_VIDEO_BITRATE_MODE = V4L2_CID_MPEG_BASE + 206 + +v4l2_mpeg_video_bitrate_mode = enum +( + V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, + V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, +) = range(2) + +V4L2_CID_MPEG_VIDEO_BITRATE = V4L2_CID_MPEG_BASE + 207 +V4L2_CID_MPEG_VIDEO_BITRATE_PEAK = V4L2_CID_MPEG_BASE + 208 +V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION = V4L2_CID_MPEG_BASE + 209 +V4L2_CID_MPEG_VIDEO_MUTE = V4L2_CID_MPEG_BASE + 210 +V4L2_CID_MPEG_VIDEO_MUTE_YUV = V4L2_CID_MPEG_BASE + 211 + +V4L2_CID_MPEG_CX2341X_BASE = V4L2_CTRL_CLASS_MPEG | 0x1000 +V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE = V4L2_CID_MPEG_CX2341X_BASE + 0 + +v4l2_mpeg_cx2341x_video_spatial_filter_mode = enum +( + V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL, + V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO, +) = range(2) + +V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER = V4L2_CID_MPEG_CX2341X_BASE + 1 +V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE = V4L2_CID_MPEG_CX2341X_BASE + 2 + +v4l2_mpeg_cx2341x_video_luma_spatial_filter_type = enum +( + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE, +) = range(5) + +V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE = V4L2_CID_MPEG_CX2341X_BASE + 3 + +v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type = enum +( + V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF, + V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR, +) = range(2) + +V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE = V4L2_CID_MPEG_CX2341X_BASE + 4 + +v4l2_mpeg_cx2341x_video_temporal_filter_mode = enum +( + V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL, + V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO, +) = range(2) + +V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER = V4L2_CID_MPEG_CX2341X_BASE + 5 +V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE = V4L2_CID_MPEG_CX2341X_BASE + 6 + +v4l2_mpeg_cx2341x_video_median_filter_type = enum +( + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG, +) = range(5) + +V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM = V4L2_CID_MPEG_CX2341X_BASE + 7 +V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP = V4L2_CID_MPEG_CX2341X_BASE + 8 +V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM = V4L2_CID_MPEG_CX2341X_BASE + 9 +V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP = V4L2_CID_MPEG_CX2341X_BASE + 10 +V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS = V4L2_CID_MPEG_CX2341X_BASE + 11 + +V4L2_CID_CAMERA_CLASS_BASE = V4L2_CTRL_CLASS_CAMERA | 0x900 +V4L2_CID_CAMERA_CLASS = V4L2_CTRL_CLASS_CAMERA | 1 + +V4L2_CID_EXPOSURE_AUTO = V4L2_CID_CAMERA_CLASS_BASE + 1 + +v4l2_exposure_auto_type = enum +( + V4L2_EXPOSURE_AUTO, + V4L2_EXPOSURE_MANUAL, + V4L2_EXPOSURE_SHUTTER_PRIORITY, + V4L2_EXPOSURE_APERTURE_PRIORITY, +) = range(4) + +V4L2_CID_EXPOSURE_ABSOLUTE = V4L2_CID_CAMERA_CLASS_BASE + 2 +V4L2_CID_EXPOSURE_AUTO_PRIORITY = V4L2_CID_CAMERA_CLASS_BASE + 3 + +V4L2_CID_PAN_RELATIVE = V4L2_CID_CAMERA_CLASS_BASE + 4 +V4L2_CID_TILT_RELATIVE = V4L2_CID_CAMERA_CLASS_BASE + 5 +V4L2_CID_PAN_RESET = V4L2_CID_CAMERA_CLASS_BASE + 6 +V4L2_CID_TILT_RESET = V4L2_CID_CAMERA_CLASS_BASE + 7 + +V4L2_CID_PAN_ABSOLUTE = V4L2_CID_CAMERA_CLASS_BASE + 8 +V4L2_CID_TILT_ABSOLUTE = V4L2_CID_CAMERA_CLASS_BASE + 9 + +V4L2_CID_FOCUS_ABSOLUTE = V4L2_CID_CAMERA_CLASS_BASE + 10 +V4L2_CID_FOCUS_RELATIVE = V4L2_CID_CAMERA_CLASS_BASE + 11 +V4L2_CID_FOCUS_AUTO = V4L2_CID_CAMERA_CLASS_BASE + 12 + +V4L2_CID_ZOOM_ABSOLUTE = V4L2_CID_CAMERA_CLASS_BASE + 13 +V4L2_CID_ZOOM_RELATIVE = V4L2_CID_CAMERA_CLASS_BASE + 14 +V4L2_CID_ZOOM_CONTINUOUS = V4L2_CID_CAMERA_CLASS_BASE + 15 + +V4L2_CID_PRIVACY = V4L2_CID_CAMERA_CLASS_BASE + 16 + +V4L2_CID_FM_TX_CLASS_BASE = V4L2_CTRL_CLASS_FM_TX | 0x900 +V4L2_CID_FM_TX_CLASS = V4L2_CTRL_CLASS_FM_TX | 1 + +V4L2_CID_RDS_TX_DEVIATION = V4L2_CID_FM_TX_CLASS_BASE + 1 +V4L2_CID_RDS_TX_PI = V4L2_CID_FM_TX_CLASS_BASE + 2 +V4L2_CID_RDS_TX_PTY = V4L2_CID_FM_TX_CLASS_BASE + 3 +V4L2_CID_RDS_TX_PS_NAME = V4L2_CID_FM_TX_CLASS_BASE + 5 +V4L2_CID_RDS_TX_RADIO_TEXT = V4L2_CID_FM_TX_CLASS_BASE + 6 + +V4L2_CID_AUDIO_LIMITER_ENABLED = V4L2_CID_FM_TX_CLASS_BASE + 64 +V4L2_CID_AUDIO_LIMITER_RELEASE_TIME = V4L2_CID_FM_TX_CLASS_BASE + 65 +V4L2_CID_AUDIO_LIMITER_DEVIATION = V4L2_CID_FM_TX_CLASS_BASE + 66 + +V4L2_CID_AUDIO_COMPRESSION_ENABLED = V4L2_CID_FM_TX_CLASS_BASE + 80 +V4L2_CID_AUDIO_COMPRESSION_GAIN = V4L2_CID_FM_TX_CLASS_BASE + 81 +V4L2_CID_AUDIO_COMPRESSION_THRESHOLD = V4L2_CID_FM_TX_CLASS_BASE + 82 +V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME = V4L2_CID_FM_TX_CLASS_BASE + 83 +V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME = V4L2_CID_FM_TX_CLASS_BASE + 84 + +V4L2_CID_PILOT_TONE_ENABLED = V4L2_CID_FM_TX_CLASS_BASE + 96 +V4L2_CID_PILOT_TONE_DEVIATION = V4L2_CID_FM_TX_CLASS_BASE + 97 +V4L2_CID_PILOT_TONE_FREQUENCY = V4L2_CID_FM_TX_CLASS_BASE + 98 + +V4L2_CID_TUNE_PREEMPHASIS = V4L2_CID_FM_TX_CLASS_BASE + 112 + +v4l2_preemphasis = enum +( + V4L2_PREEMPHASIS_DISABLED, + V4L2_PREEMPHASIS_50_uS, + V4L2_PREEMPHASIS_75_uS, +) = range(3) + +V4L2_CID_TUNE_POWER_LEVEL = V4L2_CID_FM_TX_CLASS_BASE + 113 +V4L2_CID_TUNE_ANTENNA_CAPACITOR = V4L2_CID_FM_TX_CLASS_BASE + 114 + + +# +# Tuning +# + +class v4l2_tuner(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('type', v4l2_tuner_type), + ('capability', ctypes.c_uint32), + ('rangelow', ctypes.c_uint32), + ('rangehigh', ctypes.c_uint32), + ('rxsubchans', ctypes.c_uint32), + ('audmode', ctypes.c_uint32), + ('signal', ctypes.c_int32), + ('afc', ctypes.c_int32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +class v4l2_modulator(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('capability', ctypes.c_uint32), + ('rangelow', ctypes.c_uint32), + ('rangehigh', ctypes.c_uint32), + ('txsubchans', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ] + + +V4L2_TUNER_CAP_LOW = 0x0001 +V4L2_TUNER_CAP_NORM = 0x0002 +V4L2_TUNER_CAP_STEREO = 0x0010 +V4L2_TUNER_CAP_LANG2 = 0x0020 +V4L2_TUNER_CAP_SAP = 0x0020 +V4L2_TUNER_CAP_LANG1 = 0x0040 +V4L2_TUNER_CAP_RDS = 0x0080 + +V4L2_TUNER_SUB_MONO = 0x0001 +V4L2_TUNER_SUB_STEREO = 0x0002 +V4L2_TUNER_SUB_LANG2 = 0x0004 +V4L2_TUNER_SUB_SAP = 0x0004 +V4L2_TUNER_SUB_LANG1 = 0x0008 +V4L2_TUNER_SUB_RDS = 0x0010 + +V4L2_TUNER_MODE_MONO = 0x0000 +V4L2_TUNER_MODE_STEREO = 0x0001 +V4L2_TUNER_MODE_LANG2 = 0x0002 +V4L2_TUNER_MODE_SAP = 0x0002 +V4L2_TUNER_MODE_LANG1 = 0x0003 +V4L2_TUNER_MODE_LANG1_LANG2 = 0x0004 + + +class v4l2_frequency(ctypes.Structure): + _fields_ = [ + ('tuner', ctypes.c_uint32), + ('type', v4l2_tuner_type), + ('frequency', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 8), + ] + + +class v4l2_hw_freq_seek(ctypes.Structure): + _fields_ = [ + ('tuner', ctypes.c_uint32), + ('type', v4l2_tuner_type), + ('seek_upward', ctypes.c_uint32), + ('wrap_around', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 8), + ] + + +# +# RDS +# + +class v4l2_rds_data(ctypes.Structure): + _fields_ = [ + ('lsb', ctypes.c_char), + ('msb', ctypes.c_char), + ('block', ctypes.c_char), + ] + + _pack_ = True + + +V4L2_RDS_BLOCK_MSK = 0x7 +V4L2_RDS_BLOCK_A = 0 +V4L2_RDS_BLOCK_B = 1 +V4L2_RDS_BLOCK_C = 2 +V4L2_RDS_BLOCK_D = 3 +V4L2_RDS_BLOCK_C_ALT = 4 +V4L2_RDS_BLOCK_INVALID = 7 + +V4L2_RDS_BLOCK_CORRECTED = 0x40 +V4L2_RDS_BLOCK_ERROR = 0x80 + + +# +# Audio +# + +class v4l2_audio(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('capability', ctypes.c_uint32), + ('mode', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ] + + +V4L2_AUDCAP_STEREO = 0x00001 +V4L2_AUDCAP_AVL = 0x00002 + +V4L2_AUDMODE_AVL = 0x00001 + + +class v4l2_audioout(ctypes.Structure): + _fields_ = [ + ('index', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ('capability', ctypes.c_uint32), + ('mode', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ] + + +# +# Mpeg services (experimental) +# + +V4L2_ENC_IDX_FRAME_I = 0 +V4L2_ENC_IDX_FRAME_P = 1 +V4L2_ENC_IDX_FRAME_B = 2 +V4L2_ENC_IDX_FRAME_MASK = 0xf + + +class v4l2_enc_idx_entry(ctypes.Structure): + _fields_ = [ + ('offset', ctypes.c_uint64), + ('pts', ctypes.c_uint64), + ('length', ctypes.c_uint32), + ('flags', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ] + + +V4L2_ENC_IDX_ENTRIES = 64 + + +class v4l2_enc_idx(ctypes.Structure): + _fields_ = [ + ('entries', ctypes.c_uint32), + ('entries_cap', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 4), + ('entry', v4l2_enc_idx_entry * V4L2_ENC_IDX_ENTRIES), + ] + + +V4L2_ENC_CMD_START = 0 +V4L2_ENC_CMD_STOP = 1 +V4L2_ENC_CMD_PAUSE = 2 +V4L2_ENC_CMD_RESUME = 3 + +V4L2_ENC_CMD_STOP_AT_GOP_END = 1 << 0 + + +class v4l2_encoder_cmd(ctypes.Structure): + class _u(ctypes.Union): + class _s(ctypes.Structure): + _fields_ = [ + ('data', ctypes.c_uint32 * 8), + ] + + _fields_ = [ + ('raw', _s), + ] + + _fields_ = [ + ('cmd', ctypes.c_uint32), + ('flags', ctypes.c_uint32), + ('_u', _u), + ] + + _anonymous_ = ('_u',) + + +# +# Data services (VBI) +# + +class v4l2_vbi_format(ctypes.Structure): + _fields_ = [ + ('sampling_rate', ctypes.c_uint32), + ('offset', ctypes.c_uint32), + ('samples_per_line', ctypes.c_uint32), + ('sample_format', ctypes.c_uint32), + ('start', ctypes.c_int32 * 2), + ('count', ctypes.c_uint32 * 2), + ('flags', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ] + + +V4L2_VBI_UNSYNC = 1 << 0 +V4L2_VBI_INTERLACED = 1 << 1 + + +class v4l2_sliced_vbi_format(ctypes.Structure): + _fields_ = [ + ('service_set', ctypes.c_uint16), + ('service_lines', ctypes.c_uint16 * 2 * 24), + ('io_size', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 2), + ] + + +V4L2_SLICED_TELETEXT_B = 0x0001 +V4L2_SLICED_VPS = 0x0400 +V4L2_SLICED_CAPTION_525 = 0x1000 +V4L2_SLICED_WSS_625 = 0x4000 +V4L2_SLICED_VBI_525 = V4L2_SLICED_CAPTION_525 +V4L2_SLICED_VBI_625 = ( + V4L2_SLICED_TELETEXT_B | V4L2_SLICED_VPS | V4L2_SLICED_WSS_625) + + +class v4l2_sliced_vbi_cap(ctypes.Structure): + _fields_ = [ + ('service_set', ctypes.c_uint16), + ('service_lines', ctypes.c_uint16 * 2 * 24), + ('type', v4l2_buf_type), + ('reserved', ctypes.c_uint32 * 3), + ] + + +class v4l2_sliced_vbi_data(ctypes.Structure): + _fields_ = [ + ('id', ctypes.c_uint32), + ('field', ctypes.c_uint32), + ('line', ctypes.c_uint32), + ('reserved', ctypes.c_uint32), + ('data', ctypes.c_char * 48), + ] + + +# +# Sliced VBI data inserted into MPEG Streams +# + + +V4L2_MPEG_VBI_IVTV_TELETEXT_B = 1 +V4L2_MPEG_VBI_IVTV_CAPTION_525 = 4 +V4L2_MPEG_VBI_IVTV_WSS_625 = 5 +V4L2_MPEG_VBI_IVTV_VPS = 7 + + +class v4l2_mpeg_vbi_itv0_line(ctypes.Structure): + _fields_ = [ + ('id', ctypes.c_char), + ('data', ctypes.c_char * 42), + ] + + _pack_ = True + + +class v4l2_mpeg_vbi_itv0(ctypes.Structure): + _fields_ = [ + ('linemask', ctypes.c_uint32 * 2), # how to define __le32 in ctypes? + ('line', v4l2_mpeg_vbi_itv0_line * 35), + ] + + _pack_ = True + + +class v4l2_mpeg_vbi_ITV0(ctypes.Structure): + _fields_ = [ + ('line', v4l2_mpeg_vbi_itv0_line * 36), + ] + + _pack_ = True + + +V4L2_MPEG_VBI_IVTV_MAGIC0 = "itv0" +V4L2_MPEG_VBI_IVTV_MAGIC1 = "ITV0" + + +class v4l2_mpeg_vbi_fmt_ivtv(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('itv0', v4l2_mpeg_vbi_itv0), + ('ITV0', v4l2_mpeg_vbi_ITV0), + ] + + _fields_ = [ + ('magic', ctypes.c_char * 4), + ('_u', _u) + ] + + _anonymous_ = ('_u',) + _pack_ = True + + +# +# Aggregate structures +# + +class v4l2_format(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('pix', v4l2_pix_format), + ('win', v4l2_window), + ('vbi', v4l2_vbi_format), + ('sliced', v4l2_sliced_vbi_format), + ('raw_data', ctypes.c_char * 200), + ] + + _fields_ = [ + ('type', v4l2_buf_type), + ('fmt', _u), + ] + + +class v4l2_streamparm(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('capture', v4l2_captureparm), + ('output', v4l2_outputparm), + ('raw_data', ctypes.c_char * 200), + ] + + _fields_ = [ + ('type', v4l2_buf_type), + ('parm', _u) + ] + + +# +# Advanced debugging +# + +V4L2_CHIP_MATCH_HOST = 0 +V4L2_CHIP_MATCH_I2C_DRIVER = 1 +V4L2_CHIP_MATCH_I2C_ADDR = 2 +V4L2_CHIP_MATCH_AC97 = 3 + + +class v4l2_dbg_match(ctypes.Structure): + class _u(ctypes.Union): + _fields_ = [ + ('addr', ctypes.c_uint32), + ('name', ctypes.c_char * 32), + ] + + _fields_ = [ + ('type', ctypes.c_uint32), + ('_u', _u), + ] + + _anonymous_ = ('_u',) + _pack_ = True + + +class v4l2_dbg_register(ctypes.Structure): + _fields_ = [ + ('match', v4l2_dbg_match), + ('size', ctypes.c_uint32), + ('reg', ctypes.c_uint64), + ('val', ctypes.c_uint64), + ] + + _pack_ = True + + +class v4l2_dbg_chip_ident(ctypes.Structure): + _fields_ = [ + ('match', v4l2_dbg_match), + ('ident', ctypes.c_uint32), + ('revision', ctypes.c_uint32), + ] + + _pack_ = True + + +# +# ioctl codes for video devices +# + +VIDIOC_QUERYCAP = _IOR('V', 0, v4l2_capability) +VIDIOC_RESERVED = _IO('V', 1) +VIDIOC_ENUM_FMT = _IOWR('V', 2, v4l2_fmtdesc) +VIDIOC_G_FMT = _IOWR('V', 4, v4l2_format) +VIDIOC_S_FMT = _IOWR('V', 5, v4l2_format) +VIDIOC_REQBUFS = _IOWR('V', 8, v4l2_requestbuffers) +VIDIOC_QUERYBUF = _IOWR('V', 9, v4l2_buffer) +VIDIOC_G_FBUF = _IOR('V', 10, v4l2_framebuffer) +VIDIOC_S_FBUF = _IOW('V', 11, v4l2_framebuffer) +VIDIOC_OVERLAY = _IOW('V', 14, ctypes.c_int) +VIDIOC_QBUF = _IOWR('V', 15, v4l2_buffer) +VIDIOC_DQBUF = _IOWR('V', 17, v4l2_buffer) +VIDIOC_STREAMON = _IOW('V', 18, ctypes.c_int) +VIDIOC_STREAMOFF = _IOW('V', 19, ctypes.c_int) +VIDIOC_G_PARM = _IOWR('V', 21, v4l2_streamparm) +VIDIOC_S_PARM = _IOWR('V', 22, v4l2_streamparm) +VIDIOC_G_STD = _IOR('V', 23, v4l2_std_id) +VIDIOC_S_STD = _IOW('V', 24, v4l2_std_id) +VIDIOC_ENUMSTD = _IOWR('V', 25, v4l2_standard) +VIDIOC_ENUMINPUT = _IOWR('V', 26, v4l2_input) +VIDIOC_G_CTRL = _IOWR('V', 27, v4l2_control) +VIDIOC_S_CTRL = _IOWR('V', 28, v4l2_control) +VIDIOC_G_TUNER = _IOWR('V', 29, v4l2_tuner) +VIDIOC_S_TUNER = _IOW('V', 30, v4l2_tuner) +VIDIOC_G_AUDIO = _IOR('V', 33, v4l2_audio) +VIDIOC_S_AUDIO = _IOW('V', 34, v4l2_audio) +VIDIOC_QUERYCTRL = _IOWR('V', 36, v4l2_queryctrl) +VIDIOC_QUERYMENU = _IOWR('V', 37, v4l2_querymenu) +VIDIOC_G_INPUT = _IOR('V', 38, ctypes.c_int) +VIDIOC_S_INPUT = _IOWR('V', 39, ctypes.c_int) +VIDIOC_G_OUTPUT = _IOR('V', 46, ctypes.c_int) +VIDIOC_S_OUTPUT = _IOWR('V', 47, ctypes.c_int) +VIDIOC_ENUMOUTPUT = _IOWR('V', 48, v4l2_output) +VIDIOC_G_AUDOUT = _IOR('V', 49, v4l2_audioout) +VIDIOC_S_AUDOUT = _IOW('V', 50, v4l2_audioout) +VIDIOC_G_MODULATOR = _IOWR('V', 54, v4l2_modulator) +VIDIOC_S_MODULATOR = _IOW('V', 55, v4l2_modulator) +VIDIOC_G_FREQUENCY = _IOWR('V', 56, v4l2_frequency) +VIDIOC_S_FREQUENCY = _IOW('V', 57, v4l2_frequency) +VIDIOC_CROPCAP = _IOWR('V', 58, v4l2_cropcap) +VIDIOC_G_CROP = _IOWR('V', 59, v4l2_crop) +VIDIOC_S_CROP = _IOW('V', 60, v4l2_crop) +VIDIOC_G_JPEGCOMP = _IOR('V', 61, v4l2_jpegcompression) +VIDIOC_S_JPEGCOMP = _IOW('V', 62, v4l2_jpegcompression) +VIDIOC_QUERYSTD = _IOR('V', 63, v4l2_std_id) +VIDIOC_TRY_FMT = _IOWR('V', 64, v4l2_format) +VIDIOC_ENUMAUDIO = _IOWR('V', 65, v4l2_audio) +VIDIOC_ENUMAUDOUT = _IOWR('V', 66, v4l2_audioout) +VIDIOC_G_PRIORITY = _IOR('V', 67, v4l2_priority) +VIDIOC_S_PRIORITY = _IOW('V', 68, v4l2_priority) +VIDIOC_G_SLICED_VBI_CAP = _IOWR('V', 69, v4l2_sliced_vbi_cap) +VIDIOC_LOG_STATUS = _IO('V', 70) +VIDIOC_G_EXT_CTRLS = _IOWR('V', 71, v4l2_ext_controls) +VIDIOC_S_EXT_CTRLS = _IOWR('V', 72, v4l2_ext_controls) +VIDIOC_TRY_EXT_CTRLS = _IOWR('V', 73, v4l2_ext_controls) + +VIDIOC_ENUM_FRAMESIZES = _IOWR('V', 74, v4l2_frmsizeenum) +VIDIOC_ENUM_FRAMEINTERVALS = _IOWR('V', 75, v4l2_frmivalenum) +VIDIOC_G_ENC_INDEX = _IOR('V', 76, v4l2_enc_idx) +VIDIOC_ENCODER_CMD = _IOWR('V', 77, v4l2_encoder_cmd) +VIDIOC_TRY_ENCODER_CMD = _IOWR('V', 78, v4l2_encoder_cmd) + +VIDIOC_DBG_S_REGISTER = _IOW('V', 79, v4l2_dbg_register) +VIDIOC_DBG_G_REGISTER = _IOWR('V', 80, v4l2_dbg_register) + +VIDIOC_DBG_G_CHIP_IDENT = _IOWR('V', 81, v4l2_dbg_chip_ident) + +VIDIOC_S_HW_FREQ_SEEK = _IOW('V', 82, v4l2_hw_freq_seek) +VIDIOC_ENUM_DV_PRESETS = _IOWR('V', 83, v4l2_dv_enum_preset) +VIDIOC_S_DV_PRESET = _IOWR('V', 84, v4l2_dv_preset) +VIDIOC_G_DV_PRESET = _IOWR('V', 85, v4l2_dv_preset) +VIDIOC_QUERY_DV_PRESET = _IOR('V', 86, v4l2_dv_preset) +VIDIOC_S_DV_TIMINGS = _IOWR('V', 87, v4l2_dv_timings) +VIDIOC_G_DV_TIMINGS = _IOWR('V', 88, v4l2_dv_timings) + +VIDIOC_OVERLAY_OLD = _IOWR('V', 14, ctypes.c_int) +VIDIOC_S_PARM_OLD = _IOW('V', 22, v4l2_streamparm) +VIDIOC_S_CTRL_OLD = _IOW('V', 28, v4l2_control) +VIDIOC_G_AUDIO_OLD = _IOWR('V', 33, v4l2_audio) +VIDIOC_G_AUDOUT_OLD = _IOWR('V', 49, v4l2_audioout) +VIDIOC_CROPCAP_OLD = _IOR('V', 58, v4l2_cropcap) + +BASE_VIDIOC_PRIVATE = 192 From 140c8db081e32bcd7d37ce979db28c6f8c9b6c44 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 2 Jan 2019 13:56:02 -0500 Subject: [PATCH 50/60] Added notice that facial detection is occuring Added a pam conversation message that the facial detection is being performed. --- src/pam.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pam.py b/src/pam.py index 42ee919..ebc7a0e 100644 --- a/src/pam.py +++ b/src/pam.py @@ -24,6 +24,9 @@ def doAuth(pamh): if "SSH_CONNECTION" in os.environ or "SSH_CLIENT" in os.environ or "SSHD_OPTS" in os.environ: sys.exit(0) + # Alert the user that we are doing face detection + pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Attempting face detection")) + # Run compare as python3 subprocess to circumvent python version and import issues status = subprocess.call(["/usr/bin/python3", os.path.dirname(os.path.abspath(__file__)) + "/compare.py", pamh.get_user()]) From e38422c8a0ba60efb21935327bde0f2d5d36a4c9 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Wed, 2 Jan 2019 22:57:00 +0100 Subject: [PATCH 51/60] Installer fixes --- debian/control | 2 +- debian/postinst | 45 +++++++++++++++++++++++++++------------- src/dlib-data/install.sh | 10 +++++++++ 3 files changed, 42 insertions(+), 15 deletions(-) create mode 100755 src/dlib-data/install.sh diff --git a/debian/control b/debian/control index 457d11d..128a891 100644 --- a/debian/control +++ b/debian/control @@ -9,7 +9,7 @@ Vcs-Git: https://github.com/boltgolt/howdy Package: howdy Homepage: https://github.com/boltgolt/howdy Architecture: all -Depends: ${misc:Depends}, curl|wget, python3-pip, python3-dev, python3-setuptools, libpam-python, fswebcam, libopencv-dev, python3-opencv, cmake, streamer +Depends: ${misc:Depends}, curl|wget, python3-pip, python3-dev, python3-setuptools, libpam-python, fswebcam, libopencv-dev, cmake, streamer Recommends: libatlas-base-dev | libopenblas-dev | liblapack-dev Suggests: nvidia-cuda-dev (>= 7.5) Description: Howdy: Windows Hello style authentication for Linux. diff --git a/debian/postinst b/debian/postinst index 86b524a..91afe47 100755 --- a/debian/postinst +++ b/debian/postinst @@ -72,7 +72,7 @@ if not os.path.exists("/tmp/howdy_picked_device"): try: newConf.set(section, key, value) # Add a new section where needed - except configparser.NoSectionError as e: + except configparser.NoSectionError: newConf.add_section(section) newConf.set(section, key, value) @@ -94,21 +94,25 @@ os.unlink("/tmp/howdy_picked_device") log("Upgrading pip to the latest version") # Update pip -handleStatus(sc(["pip3", "install", "--upgrade", "pip"])) +handleStatus(sc(["pip3", "install", "--no-cache-dir", "--upgrade", "pip"])) -dlib_archive = '/tmp/dlib_latest.tar.gz' +log("Downloading and unpacking data files") + +handleStatus(subprocess.call(["./install.sh"], shell=True, cwd="/lib/security/howdy/dlib-data")) log('Downloading dlib') +dlib_archive = '/tmp/v19.16.tar.gz' + loader = which('curl') LOADER_CMD = None if loader: - LOADER_CMD = [loader, '--silent', '--retry', '5', '--location', '--output'] + LOADER_CMD = [loader, '--retry', '5', '--location', '--output'] else: loader = which('wget') - LOADER_CMD = [loader, '--quiet', '--tries', '5', '--output-document'] + LOADER_CMD = [loader, '--tries', '5', '--output-document'] -cmd = LOADER_CMD + [dlib_archive, 'https://api.github.com/repos/davisking/dlib/tarball/latest'] +cmd = LOADER_CMD + [dlib_archive, 'https://github.com/davisking/dlib/archive/v19.16.tar.gz'] handleStatus(sc(cmd)) @@ -119,13 +123,14 @@ excludes = re.compile( '(docs|examples|python_examples)|' 'tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))' ) + with tarfile.open(dlib_archive) as tf: for item in tf: # tarball contains directory davisking-dlib-, so peek into archive for the name if not DLIB_DIR: - DLIB_DIR = item.name + DLIB_DIR = "/tmp/" + item.name - # extract only files sufficent for building + # extract only files sufficient for building if not excludes.match(item.name): tf.extract(item, '/tmp') @@ -134,7 +139,8 @@ os.unlink(dlib_archive) log("Building dlib") # Start the build -cmd = ["python3", "setup.py", "install"] +cmd = ["sudo", "python3", "setup.py", "install"] +cuda_used = False flags = '' with open('/proc/cpuinfo') as info: @@ -152,11 +158,19 @@ elif 'sse3' in flags: elif 'sse2' in flags: cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] -sp = subprocess.run(cmd, cwd=DLIB_DIR, stderr=subprocess.STDOUT) -handleStatus(sp.returncode) +try: + sp = subprocess.Popen(cmd, cwd=DLIB_DIR, stdout=subprocess.PIPE) +except subprocess.CalledProcessError: + print("Error while building dlib") + raise -# simple check for CUDA -cuda_used = 'DLIB WILL USE CUDA' in sp.stdout +while sp.poll() is None: + line = sp.stdout.readline().decode("utf-8") + + if 'DLIB WILL USE CUDA' in line: + cuda_used = True + + print(line, end='') log("Cleaning up dlib") @@ -164,8 +178,11 @@ log("Cleaning up dlib") del sp rmtree(DLIB_DIR) -log("Temporary dlib files removed") +print("Temporary dlib files removed") +log("Installing OpenCV") + +handleStatus(subprocess.call(["pip3", "install", "--no-cache-dir", "opencv-python"])) log("Configuring howdy") diff --git a/src/dlib-data/install.sh b/src/dlib-data/install.sh new file mode 100755 index 0000000..b966d9f --- /dev/null +++ b/src/dlib-data/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Download the archives +wget https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2 +wget https://github.com/davisking/dlib-models/raw/master/mmod_human_face_detector.dat.bz2 +wget https://github.com/davisking/dlib-models/raw/master/shape_predictor_5_face_landmarks.dat.bz2 + +# Uncompress the data files and delete the original archive +echo "Unpacking..." +bzip2 -d *.bz2 From 2917e8ada4f04a01f11691081374150469eb32fe Mon Sep 17 00:00:00 2001 From: boltgolt Date: Wed, 2 Jan 2019 23:36:09 +0100 Subject: [PATCH 52/60] Code cleanup --- debian/postinst | 75 +++++++++++++++++++++++++++---------------------- debian/preinst | 3 +- src/cli.py | 2 +- src/compare.py | 71 +++++++++++++++++++++++----------------------- 4 files changed, 81 insertions(+), 70 deletions(-) diff --git a/debian/postinst b/debian/postinst index 91afe47..f3dd041 100755 --- a/debian/postinst +++ b/debian/postinst @@ -38,6 +38,7 @@ def handleStatus(status): sys.exit(1) +# Create shorthand for subprocess creation sc = subprocess.call # We're not in fresh configuration mode so don't continue the setup @@ -98,79 +99,88 @@ handleStatus(sc(["pip3", "install", "--no-cache-dir", "--upgrade", "pip"])) log("Downloading and unpacking data files") +# Run the bash script to download and unpack the .dat files needed handleStatus(subprocess.call(["./install.sh"], shell=True, cwd="/lib/security/howdy/dlib-data")) -log('Downloading dlib') +log("Downloading dlib") -dlib_archive = '/tmp/v19.16.tar.gz' - -loader = which('curl') +dlib_archive = "/tmp/v19.16.tar.gz" +loader = which("curl") LOADER_CMD = None + +# If curl is installed, use that as the downloader if loader: - LOADER_CMD = [loader, '--retry', '5', '--location', '--output'] + LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] +# Otherwise, fall back on wget else: - loader = which('wget') - LOADER_CMD = [loader, '--tries', '5', '--output-document'] - -cmd = LOADER_CMD + [dlib_archive, 'https://github.com/davisking/dlib/archive/v19.16.tar.gz'] + loader = which("wget") + LOADER_CMD = [loader, "--tries", "5", "--output-document"] +# Assemble and execute the download command +cmd = LOADER_CMD + [dlib_archive, "https://github.com/davisking/dlib/archive/v19.16.tar.gz"] handleStatus(sc(cmd)) +# The folder containing the dlib source DLIB_DIR = None - +# A regex of all files to ignore while unpacking the archive excludes = re.compile( - 'davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|' - '(docs|examples|python_examples)|' - 'tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))' + "davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|" + "(docs|examples|python_examples)|" + "tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))" ) +# Open the archive with tarfile.open(dlib_archive) as tf: for item in tf: - # tarball contains directory davisking-dlib-, so peek into archive for the name + # Set the destenation dir if unset if not DLIB_DIR: DLIB_DIR = "/tmp/" + item.name # extract only files sufficient for building if not excludes.match(item.name): - tf.extract(item, '/tmp') + tf.extract(item, "/tmp") +# Delete the downloaded archive os.unlink(dlib_archive) log("Building dlib") -# Start the build cmd = ["sudo", "python3", "setup.py", "install"] cuda_used = False +flags = "" -flags = '' -with open('/proc/cpuinfo') as info: +# Get the CPU details +with open("/proc/cpuinfo") as info: for line in info: - if 'flags' in line: + if "flags" in line: flags = line break -if 'avx' in flags: +# Use the most efficient instruction set the CPU supports +if "avx" in flags: cmd += ["--yes", "USE_AVX_INSTRUCTIONS"] -elif 'sse4' in flags: +elif "sse4" in flags: cmd += ["--yes", "USE_SSE4_INSTRUCTIONS"] -elif 'sse3' in flags: +elif "sse3" in flags: cmd += ["--yes", "USE_SSE3_INSTRUCTIONS"] -elif 'sse2' in flags: +elif "sse2" in flags: cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] +# Compile and link dlib try: sp = subprocess.Popen(cmd, cwd=DLIB_DIR, stdout=subprocess.PIPE) except subprocess.CalledProcessError: print("Error while building dlib") raise +# Go through each line from stdout while sp.poll() is None: line = sp.stdout.readline().decode("utf-8") - if 'DLIB WILL USE CUDA' in line: + if "DLIB WILL USE CUDA" in line: cuda_used = True - print(line, end='') + print(line, end="") log("Cleaning up dlib") @@ -188,20 +198,19 @@ log("Configuring howdy") # Manually change the camera id to the one picked for line in fileinput.input(["/lib/security/howdy/config.ini"], inplace=1): - print( - line - .replace("device_path = none", "device_path = " + picked) - .replace("use_cnn = false", "use_cnn = " + str(cuda_used).lower()), - end="" - ) + line = line.replace("device_path = none", "device_path = " + picked) + line = line.replace("use_cnn = false", "use_cnn = " + str(cuda_used).lower()) + + print(line, end="") + print("Camera ID saved") # Secure the howdy folder handleStatus(sc(["chmod 744 -R /lib/security/howdy/"], shell=True)) # Allow anyone to execute the python CLI -os.chmod('/lib/security/howdy', 0o755) -os.chmod('/lib/security/howdy/cli.py', 0o755) +os.chmod("/lib/security/howdy", 0o755) +os.chmod("/lib/security/howdy/cli.py", 0o755) handleStatus(sc(["chmod 755 -R /lib/security/howdy/cli"], shell=True)) print("Permissions set") diff --git a/debian/preinst b/debian/preinst index 4acfb39..e355a15 100755 --- a/debian/preinst +++ b/debian/preinst @@ -9,6 +9,7 @@ def col(id): if id == 3: return "\033[31m" return "\033[0m" + import subprocess import time import sys @@ -24,7 +25,7 @@ if "upgrade" in sys.argv: # Let the user know so he knows where to look on a failed install print("Backup of Howdy config file created in /tmp/howdy_config_backup_v" + sys.argv[2] + ".ini") - except e: + except subprocess.CalledProcessError: print("Could not make an backup of old Howdy config file") # Don't continue setup when we're just upgrading diff --git a/src/cli.py b/src/cli.py index 07447cf..5906f4d 100755 --- a/src/cli.py +++ b/src/cli.py @@ -11,7 +11,7 @@ import builtins # Try to get the original username (not "root") from shell try: user = os.getlogin() -except: +except Exception: user = os.environ.get("SUDO_USER") # If that fails, try to get the direct user diff --git a/src/compare.py b/src/compare.py index 7fc9c87..9aefb5d 100644 --- a/src/compare.py +++ b/src/compare.py @@ -6,7 +6,7 @@ import time # Start timing timings = { - 'st': time.time() + "st": time.time() } # Import required modules @@ -21,23 +21,21 @@ import _thread as thread def init_detector(lock): + """Start face detector, encoder and predictor in a new thread""" global face_detector, pose_predictor, face_encoder + + # Use the CNN detector if enabled if use_cnn: - face_detector = dlib.cnn_face_detection_model_v1( - PATH + '/dlib-data/mmod_human_face_detector.dat' - ) + face_detector = dlib.cnn_face_detection_model_v1(PATH + "/dlib-data/mmod_human_face_detector.dat") else: face_detector = dlib.get_frontal_face_detector() - pose_predictor = dlib.shape_predictor( - PATH + '/dlib-data/shape_predictor_5_face_landmarks.dat' - ) + # Start the others regardless + pose_predictor = dlib.shape_predictor(PATH + "/dlib-data/shape_predictor_5_face_landmarks.dat") + face_encoder = dlib.face_recognition_model_v1(PATH + "/dlib-data/dlib_face_recognition_resnet_model_v1.dat") - face_encoder = dlib.face_recognition_model_v1( - PATH + '/dlib-data/dlib_face_recognition_resnet_model_v1.dat' - ) # Note the time it took to initialize detectors - timings['ll'] = time.time() - timings['ll'] + timings["ll"] = time.time() - timings["ll"] lock.release() @@ -52,7 +50,7 @@ if len(sys.argv) < 2: sys.exit(12) # Get the absolute path to the current directory -PATH = os.path.abspath(__file__ + '/..') +PATH = os.path.abspath(__file__ + "/..") # The username of the user being authenticated user = sys.argv[1] @@ -86,25 +84,26 @@ if len(models) < 1: config = configparser.ConfigParser() config.read(PATH + "/config.ini") -# CNN usage flag -use_cnn = config.getboolean('core', 'use_cnn', fallback=False) +# Get all config values needed +use_cnn = config.getboolean("core", "use_cnn", fallback=False) timeout = config.getint("video", "timout", fallback=5) dark_threshold = config.getfloat("video", "dark_threshold", fallback=50.0) video_certainty = config.getfloat("video", "certainty", fallback=3.5) / 10 end_report = config.getboolean("debug", "end_report", fallback=False) # Save the time needed to start the script -timings['in'] = time.time() - timings['st'] +timings["in"] = time.time() - timings["st"] # Import face recognition, takes some time -timings['ll'] = time.time() +timings["ll"] = time.time() +# Start threading and wait for init to finish lock = thread.allocate_lock() lock.acquire() thread.start_new_thread(init_detector, (lock, )) # Start video capture on the IR camera -timings['ic'] = time.time() +timings["ic"] = time.time() # Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": @@ -120,7 +119,8 @@ else: # Force MJPEG decoding if true if config.getboolean("video", "force_mjpeg", fallback=False): # Set a magic number, will enable MJPEG but is badly documented - video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # 1196444237 is 'GPJM' in ASCII + # 1196444237 is "GPJM" in ASCII + video_capture.set(cv2.CAP_PROP_FOURCC, 1196444237) # Set the frame width and height if requested fw = config.getint("video", "frame_width", fallback=-1) @@ -135,14 +135,13 @@ if fh != -1: video_capture.grab() # Note the time it took to open the camera -timings['ic'] = time.time() - timings['ic'] +timings["ic"] = time.time() - timings["ic"] # wait for thread to finish lock.acquire() lock.release() del lock - # Fetch the max frame height max_height = config.getfloat("video", "max_height", fallback=0.0) # Get the height of the image @@ -158,14 +157,14 @@ end_report = config.getboolean("debug", "end_report") # Start the read loop frames = 0 -timings['fr'] = time.time() +timings["fr"] = time.time() while True: # Increment the frame count every loop frames += 1 # Stop if we've exceded the time limit - if time.time() - timings['fr'] > timeout: + if time.time() - timings["fr"] > timeout: stop(11) # Grab a single frame of video @@ -190,17 +189,18 @@ while True: gsframe = cv2.resize(gsframe, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) # Get all faces from that frame as encodings - face_locations = face_detector(gsframe, 1) # upsample 1 time + # Upsamples 1 time + face_locations = face_detector(gsframe, 1) # Loop through each face for fl in face_locations: if use_cnn: fl = fl.rect + # Fetch the faces in the image face_landmark = pose_predictor(frame, fl) - face_encoding = np.array( - face_encoder.compute_face_descriptor(frame, face_landmark, 1) # num_jitters=1 - ) + face_encoding = np.array(face_encoder.compute_face_descriptor(frame, face_landmark, 1)) + # Match this found face against a known face matches = np.linalg.norm(encodings - face_encoding, axis=1) @@ -210,8 +210,8 @@ while True: # Check if a match that's confident enough if 0 < match < video_certainty: - timings['tt'] = time.time() - timings['st'] - timings['fr'] = time.time() - timings['fr'] + timings["tt"] = time.time() - timings["st"] + timings["fr"] = time.time() - timings["fr"] # If set to true in the config, print debug text if end_report: @@ -219,13 +219,14 @@ while True: """Helper function to print a timing from the list""" print(" %s: %dms" % (label, round(timings[k] * 1000))) + # Print a nice timing report print("Time spent") - print_timing("Starting up", 'in') - print(" Open cam + load libs: %dms" % (round(max(timings['ll'], timings['ic']) * 1000, ))) - print_timing(" Opening the camera", 'ic') - print_timing(" Importing recognition libs", 'll') - print_timing("Searching for known face", 'fr') - print_timing("Total time", 'tt') + print_timing("Starting up", "in") + print(" Open cam + load libs: %dms" % (round(max(timings["ll"], timings["ic"]) * 1000, ))) + print_timing(" Opening the camera", "ic") + print_timing(" Importing recognition libs", "ll") + print_timing("Searching for known face", "fr") + print_timing("Total time", "tt") print("\nResolution") width = video_capture.get(cv2.CAP_PROP_FRAME_WIDTH) or 1 @@ -235,7 +236,7 @@ while True: print(" Used: %dx%d" % (scale_height, scale_width)) # Show the total number of frames and calculate the FPS by deviding it by the total scan time - print("\nFrames searched: %d (%.2f fps)" % (frames, frames / timings['fr'])) + print("\nFrames searched: %d (%.2f fps)" % (frames, frames / timings["fr"])) print("Dark frames ignored: %d " % (dark_tries, )) print("Certainty of winning frame: %.3f" % (match * 10, )) From a4928144ccdcc7f42371ed7b01622dfaea557417 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Thu, 3 Jan 2019 14:35:07 +0100 Subject: [PATCH 53/60] Rewrote download script, fixed tests and other misc changes --- .travis.yml | 3 ++- debian/postinst | 14 +++++++------- debian/source/options | 5 +++-- src/cli/add.py | 33 ++++++++++++++++++--------------- src/compare.py | 15 ++++++++++++++- src/config.ini | 2 +- src/dlib-data/install.sh | 23 +++++++++++++++++++---- tests/pam.sh | 2 +- 8 files changed, 65 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e0a5f1..6f7d486 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,8 @@ script: # Go through function tests - ./tests/importing.sh - ./tests/passthrough.sh - - ./tests/pam.sh + # Skip PAM integration tests for now because of broken pamtester + # - ./tests/pam.sh - ./tests/compare.sh # Remove howdy from the installation diff --git a/debian/postinst b/debian/postinst index f3dd041..31066b2 100755 --- a/debian/postinst +++ b/debian/postinst @@ -95,7 +95,7 @@ os.unlink("/tmp/howdy_picked_device") log("Upgrading pip to the latest version") # Update pip -handleStatus(sc(["pip3", "install", "--no-cache-dir", "--upgrade", "pip"])) +handleStatus(sc(["pip3", "install", "--upgrade", "pip"])) log("Downloading and unpacking data files") @@ -105,16 +105,16 @@ handleStatus(subprocess.call(["./install.sh"], shell=True, cwd="/lib/security/ho log("Downloading dlib") dlib_archive = "/tmp/v19.16.tar.gz" -loader = which("curl") +loader = which("wget") LOADER_CMD = None -# If curl is installed, use that as the downloader +# If wget is installed, use that as the downloader if loader: - LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] -# Otherwise, fall back on wget -else: - loader = which("wget") LOADER_CMD = [loader, "--tries", "5", "--output-document"] +# Otherwise, fall back on curl +else: + loader = which("curl") + LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] # Assemble and execute the download command cmd = LOADER_CMD + [dlib_archive, "https://github.com/davisking/dlib/archive/v19.16.tar.gz"] diff --git a/debian/source/options b/debian/source/options index 593ee7b..1216d00 100644 --- a/debian/source/options +++ b/debian/source/options @@ -1,6 +1,7 @@ tar-ignore = ".git" -tar-ignore = "models" tar-ignore = ".gitignore" +tar-ignore = ".github" +tar-ignore = "models" +tar-ignore = "tests" tar-ignore = "README.md" -tar-ignore = "LICENSE" tar-ignore = ".travis.yml" diff --git a/src/cli/add.py b/src/cli/add.py index 9d31643..9fd69b0 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -22,26 +22,31 @@ except ImportError as err: sys.exit(1) # Get the absolute path to the current directory -path = os.path.abspath(__file__ + '/..') +path = os.path.abspath(__file__ + "/..") + +# Test if at lest 1 of the data files is there and abort if it's not +if not os.path.isfile(path + "/../dlib-data/shape_predictor_5_face_landmarks.dat"): + print("Data files have not been downloaded, please run the following commands:") + print("\n\tcd " + os.path.realpath(path + "/../dlib-data")) + print("\tsudo ./install.sh\n") + sys.exit(1) # Read config from disk config = configparser.ConfigParser() config.read(path + "/../config.ini") -use_cnn = config.getboolean('core', 'use_cnn', fallback=False) +if not os.path.exists(config.get("video", "device_path")): + print("Camera path is not configured correctly, please edit the 'device_path' config value.") + sys.exit(1) + +use_cnn = config.getboolean("core", "use_cnn", fallback=False) if use_cnn: - face_detector = dlib.cnn_face_detection_model_v1( - path + '/../dlib-data/mmod_human_face_detector.dat' - ) + face_detector = dlib.cnn_face_detection_model_v1(path + "/../dlib-data/mmod_human_face_detector.dat") else: face_detector = dlib.get_frontal_face_detector() -pose_predictor = dlib.shape_predictor( - path + '/../dlib-data/shape_predictor_5_face_landmarks.dat' -) -face_encoder = dlib.face_recognition_model_v1( - path + '/../dlib-data/dlib_face_recognition_resnet_model_v1.dat' -) +pose_predictor = dlib.shape_predictor(path + "/../dlib-data/shape_predictor_5_face_landmarks.dat") +face_encoder = dlib.face_recognition_model_v1(path + "/../dlib-data/dlib_face_recognition_resnet_model_v1.dat") user = builtins.howdy_user # The permanent file to store the encoded model in @@ -154,7 +159,7 @@ while frames < 60: frames += 1 # Get all faces from that frame as encodings - face_locations = face_detector(gsframe, 1) # upsample 1 time + face_locations = face_detector(gsframe, 1) # If we've found at least one, we can continue if face_locations: @@ -176,9 +181,7 @@ if use_cnn: # Get the encodings in the frame face_landmark = pose_predictor(frame, face_location) -face_encoding = np.array( - face_encoder.compute_face_descriptor(frame, face_landmark, 1) # num_jitters=1 -) +face_encoding = np.array(face_encoder.compute_face_descriptor(frame, face_landmark, 1)) insert_model["data"].append(face_encoding.tolist()) diff --git a/src/compare.py b/src/compare.py index 281c424..c063d2f 100644 --- a/src/compare.py +++ b/src/compare.py @@ -24,6 +24,14 @@ def init_detector(lock): """Start face detector, encoder and predictor in a new thread""" global face_detector, pose_predictor, face_encoder + # Test if at lest 1 of the data files is there and abort if it's not + if not os.path.isfile(PATH + "/dlib-data/shape_predictor_5_face_landmarks.dat"): + print("Data files have not been downloaded, please run the following commands:") + print("\n\tcd " + PATH + "/dlib-data") + print("\tsudo ./install.sh\n") + lock.release() + sys.exit(1) + # Use the CNN detector if enabled if use_cnn: face_detector = dlib.cnn_face_detection_model_v1(PATH + "/dlib-data/mmod_human_face_detector.dat") @@ -171,7 +179,12 @@ while True: # Grab a single frame of video _, frame = video_capture.read() - gsframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + try: + gsframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + except cv2.error: + print("Unknown camera, please check your 'device_path' config value.\n") + raise # Create a histogram of the image with 8 values hist = cv2.calcHist([gsframe], [0], None, [8], [0, 256]) diff --git a/src/config.ini b/src/config.ini index c658917..7a3b08e 100644 --- a/src/config.ini +++ b/src/config.ini @@ -54,7 +54,7 @@ frame_height = -1 # The lower this setting is, the more dark frames are ignored dark_threshold = 50 -# The recorder to use. Can be either opencv or ffmpeg. +# The recorder to use. Can be either opencv, ffmpeg or pyv4l2. # Switching from the default opencv to ffmpeg can help with grayscale issues. recording_plugin = opencv diff --git a/src/dlib-data/install.sh b/src/dlib-data/install.sh index b966d9f..7fcabe6 100755 --- a/src/dlib-data/install.sh +++ b/src/dlib-data/install.sh @@ -1,9 +1,24 @@ #!/bin/bash -# Download the archives -wget https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2 -wget https://github.com/davisking/dlib-models/raw/master/mmod_human_face_detector.dat.bz2 -wget https://github.com/davisking/dlib-models/raw/master/shape_predictor_5_face_landmarks.dat.bz2 +echo "Downloading 3 required data files..." + +# Check if wget is installed +if hash wget;then + # Check if wget supports the option to only show the progress bar + wget --help | grep -q "\--show-progress" && \ + _PROGRESS_OPT="-q --show-progress" || _PROGRESS_OPT="" + + # Download the archives + wget $_PROGRESS_OPT --tries 5 https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2 + wget $_PROGRESS_OPT --tries 5 https://github.com/davisking/dlib-models/raw/master/mmod_human_face_detector.dat.bz2 + wget $_PROGRESS_OPT --tries 5 https://github.com/davisking/dlib-models/raw/master/shape_predictor_5_face_landmarks.dat.bz2 + +# Otherwise fall back on curl +else + curl --location --retry 5 --output dlib_face_recognition_resnet_model_v1.dat.bz2 https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2 + curl --location --retry 5 --output mmod_human_face_detector.dat.bz2 https://github.com/davisking/dlib-models/raw/master/mmod_human_face_detector.dat.bz2 + curl --location --retry 5 --output shape_predictor_5_face_landmarks.dat.bz2 https://github.com/davisking/dlib-models/raw/master/shape_predictor_5_face_landmarks.dat.bz2 +fi # Uncompress the data files and delete the original archive echo "Unpacking..." diff --git a/tests/pam.sh b/tests/pam.sh index 0f1f7a0..7633546 100755 --- a/tests/pam.sh +++ b/tests/pam.sh @@ -6,7 +6,7 @@ set -e sudo howdy clear -y || true # Change active camera to match video 1 -sudo sed -i "s,device_path.*,device_path = $PWD\/tests\/video\/match1.m4v,g" /lib/security/howdy/config.ini +sudo sed -i "s,device_path.*,device_path = $PWD/tests\/video\/match1.m4v,g" /lib/security/howdy/config.ini # Let howdy add the match face sudo howdy add -y From 1714579e6e8856a93d78ab71c01789d25ce10564 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Thu, 3 Jan 2019 14:53:59 +0100 Subject: [PATCH 54/60] Removing dlib from travis for faster tests --- .travis.yml | 4 ++ debian/postinst | 131 +++++++++++++++++++++++++----------------------- 2 files changed, 72 insertions(+), 63 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6f7d486..6863f86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,9 @@ language: python python: "3.6" script: + - pip3 install --upgrade pip + - pip3 install dlib + # Build the binary (.deb) - debuild -i -us -uc -b # Install the binary, running the debian scripts in the process @@ -32,3 +35,4 @@ addons: - devscripts - fakeroot - pamtester + - python3-pip diff --git a/debian/postinst b/debian/postinst index 31066b2..7843543 100755 --- a/debian/postinst +++ b/debian/postinst @@ -104,44 +104,48 @@ handleStatus(subprocess.call(["./install.sh"], shell=True, cwd="/lib/security/ho log("Downloading dlib") -dlib_archive = "/tmp/v19.16.tar.gz" -loader = which("wget") -LOADER_CMD = None -# If wget is installed, use that as the downloader -if loader: - LOADER_CMD = [loader, "--tries", "5", "--output-document"] -# Otherwise, fall back on curl +if "HOWDY_SKIP_DLIB" in os.environ: + print(col(2) + "SKIPPING DLIB INSTALLATION BECAUSE OF HOWDY_SKIP_DLIB FLAG" + col(0)) else: - loader = which("curl") - LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] + dlib_archive = "/tmp/v19.16.tar.gz" + loader = which("wget") + LOADER_CMD = None -# Assemble and execute the download command -cmd = LOADER_CMD + [dlib_archive, "https://github.com/davisking/dlib/archive/v19.16.tar.gz"] -handleStatus(sc(cmd)) + # If wget is installed, use that as the downloader + if loader: + LOADER_CMD = [loader, "--tries", "5", "--output-document"] + # Otherwise, fall back on curl + else: + loader = which("curl") + LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] -# The folder containing the dlib source -DLIB_DIR = None -# A regex of all files to ignore while unpacking the archive -excludes = re.compile( - "davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|" - "(docs|examples|python_examples)|" - "tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))" -) + # Assemble and execute the download command + cmd = LOADER_CMD + [dlib_archive, "https://github.com/davisking/dlib/archive/v19.16.tar.gz"] + handleStatus(sc(cmd)) -# Open the archive -with tarfile.open(dlib_archive) as tf: - for item in tf: - # Set the destenation dir if unset - if not DLIB_DIR: - DLIB_DIR = "/tmp/" + item.name + # The folder containing the dlib source + DLIB_DIR = None + # A regex of all files to ignore while unpacking the archive + excludes = re.compile( + "davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|" + "(docs|examples|python_examples)|" + "tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))" + ) - # extract only files sufficient for building - if not excludes.match(item.name): - tf.extract(item, "/tmp") + # Open the archive + with tarfile.open(dlib_archive) as tf: + for item in tf: + # Set the destenation dir if unset + if not DLIB_DIR: + DLIB_DIR = "/tmp/" + item.name -# Delete the downloaded archive -os.unlink(dlib_archive) + # extract only files sufficient for building + if not excludes.match(item.name): + tf.extract(item, "/tmp") + + # Delete the downloaded archive + os.unlink(dlib_archive) log("Building dlib") @@ -149,46 +153,47 @@ cmd = ["sudo", "python3", "setup.py", "install"] cuda_used = False flags = "" -# Get the CPU details -with open("/proc/cpuinfo") as info: - for line in info: - if "flags" in line: - flags = line - break +if "HOWDY_SKIP_DLIB" not in os.environ: + # Get the CPU details + with open("/proc/cpuinfo") as info: + for line in info: + if "flags" in line: + flags = line + break -# Use the most efficient instruction set the CPU supports -if "avx" in flags: - cmd += ["--yes", "USE_AVX_INSTRUCTIONS"] -elif "sse4" in flags: - cmd += ["--yes", "USE_SSE4_INSTRUCTIONS"] -elif "sse3" in flags: - cmd += ["--yes", "USE_SSE3_INSTRUCTIONS"] -elif "sse2" in flags: - cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] + # Use the most efficient instruction set the CPU supports + if "avx" in flags: + cmd += ["--yes", "USE_AVX_INSTRUCTIONS"] + elif "sse4" in flags: + cmd += ["--yes", "USE_SSE4_INSTRUCTIONS"] + elif "sse3" in flags: + cmd += ["--yes", "USE_SSE3_INSTRUCTIONS"] + elif "sse2" in flags: + cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] -# Compile and link dlib -try: - sp = subprocess.Popen(cmd, cwd=DLIB_DIR, stdout=subprocess.PIPE) -except subprocess.CalledProcessError: - print("Error while building dlib") - raise + # Compile and link dlib + try: + sp = subprocess.Popen(cmd, cwd=DLIB_DIR, stdout=subprocess.PIPE) + except subprocess.CalledProcessError: + print("Error while building dlib") + raise -# Go through each line from stdout -while sp.poll() is None: - line = sp.stdout.readline().decode("utf-8") + # Go through each line from stdout + while sp.poll() is None: + line = sp.stdout.readline().decode("utf-8") - if "DLIB WILL USE CUDA" in line: - cuda_used = True + if "DLIB WILL USE CUDA" in line: + cuda_used = True - print(line, end="") + print(line, end="") -log("Cleaning up dlib") + log("Cleaning up dlib") -# Remove the no longer needed git clone -del sp -rmtree(DLIB_DIR) + # Remove the no longer needed git clone + del sp + rmtree(DLIB_DIR) -print("Temporary dlib files removed") + print("Temporary dlib files removed") log("Installing OpenCV") From 133f9a5ccb3a6a197f40075cb0f677aaa268b70f Mon Sep 17 00:00:00 2001 From: boltgolt Date: Thu, 3 Jan 2019 15:05:53 +0100 Subject: [PATCH 55/60] Reverting dlib install change because it did very little to speed up tests This reverts commit 1714579e6e8856a93d78ab71c01789d25ce10564. --- .travis.yml | 4 -- debian/postinst | 131 +++++++++++++++++++++++------------------------- 2 files changed, 63 insertions(+), 72 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6863f86..6f7d486 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,6 @@ language: python python: "3.6" script: - - pip3 install --upgrade pip - - pip3 install dlib - # Build the binary (.deb) - debuild -i -us -uc -b # Install the binary, running the debian scripts in the process @@ -35,4 +32,3 @@ addons: - devscripts - fakeroot - pamtester - - python3-pip diff --git a/debian/postinst b/debian/postinst index 7843543..31066b2 100755 --- a/debian/postinst +++ b/debian/postinst @@ -104,48 +104,44 @@ handleStatus(subprocess.call(["./install.sh"], shell=True, cwd="/lib/security/ho log("Downloading dlib") +dlib_archive = "/tmp/v19.16.tar.gz" +loader = which("wget") +LOADER_CMD = None -if "HOWDY_SKIP_DLIB" in os.environ: - print(col(2) + "SKIPPING DLIB INSTALLATION BECAUSE OF HOWDY_SKIP_DLIB FLAG" + col(0)) +# If wget is installed, use that as the downloader +if loader: + LOADER_CMD = [loader, "--tries", "5", "--output-document"] +# Otherwise, fall back on curl else: - dlib_archive = "/tmp/v19.16.tar.gz" - loader = which("wget") - LOADER_CMD = None + loader = which("curl") + LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] - # If wget is installed, use that as the downloader - if loader: - LOADER_CMD = [loader, "--tries", "5", "--output-document"] - # Otherwise, fall back on curl - else: - loader = which("curl") - LOADER_CMD = [loader, "--retry", "5", "--location", "--output"] +# Assemble and execute the download command +cmd = LOADER_CMD + [dlib_archive, "https://github.com/davisking/dlib/archive/v19.16.tar.gz"] +handleStatus(sc(cmd)) - # Assemble and execute the download command - cmd = LOADER_CMD + [dlib_archive, "https://github.com/davisking/dlib/archive/v19.16.tar.gz"] - handleStatus(sc(cmd)) +# The folder containing the dlib source +DLIB_DIR = None +# A regex of all files to ignore while unpacking the archive +excludes = re.compile( + "davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|" + "(docs|examples|python_examples)|" + "tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))" +) - # The folder containing the dlib source - DLIB_DIR = None - # A regex of all files to ignore while unpacking the archive - excludes = re.compile( - "davisking-dlib-\w+/(dlib/(http_client|java|matlab|test/)|" - "(docs|examples|python_examples)|" - "tools/(archive|convert_dlib_nets_to_caffe|htmlify|imglab|python/test|visual_studio_natvis))" - ) +# Open the archive +with tarfile.open(dlib_archive) as tf: + for item in tf: + # Set the destenation dir if unset + if not DLIB_DIR: + DLIB_DIR = "/tmp/" + item.name - # Open the archive - with tarfile.open(dlib_archive) as tf: - for item in tf: - # Set the destenation dir if unset - if not DLIB_DIR: - DLIB_DIR = "/tmp/" + item.name + # extract only files sufficient for building + if not excludes.match(item.name): + tf.extract(item, "/tmp") - # extract only files sufficient for building - if not excludes.match(item.name): - tf.extract(item, "/tmp") - - # Delete the downloaded archive - os.unlink(dlib_archive) +# Delete the downloaded archive +os.unlink(dlib_archive) log("Building dlib") @@ -153,47 +149,46 @@ cmd = ["sudo", "python3", "setup.py", "install"] cuda_used = False flags = "" -if "HOWDY_SKIP_DLIB" not in os.environ: - # Get the CPU details - with open("/proc/cpuinfo") as info: - for line in info: - if "flags" in line: - flags = line - break +# Get the CPU details +with open("/proc/cpuinfo") as info: + for line in info: + if "flags" in line: + flags = line + break - # Use the most efficient instruction set the CPU supports - if "avx" in flags: - cmd += ["--yes", "USE_AVX_INSTRUCTIONS"] - elif "sse4" in flags: - cmd += ["--yes", "USE_SSE4_INSTRUCTIONS"] - elif "sse3" in flags: - cmd += ["--yes", "USE_SSE3_INSTRUCTIONS"] - elif "sse2" in flags: - cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] +# Use the most efficient instruction set the CPU supports +if "avx" in flags: + cmd += ["--yes", "USE_AVX_INSTRUCTIONS"] +elif "sse4" in flags: + cmd += ["--yes", "USE_SSE4_INSTRUCTIONS"] +elif "sse3" in flags: + cmd += ["--yes", "USE_SSE3_INSTRUCTIONS"] +elif "sse2" in flags: + cmd += ["--yes", "USE_SSE2_INSTRUCTIONS"] - # Compile and link dlib - try: - sp = subprocess.Popen(cmd, cwd=DLIB_DIR, stdout=subprocess.PIPE) - except subprocess.CalledProcessError: - print("Error while building dlib") - raise +# Compile and link dlib +try: + sp = subprocess.Popen(cmd, cwd=DLIB_DIR, stdout=subprocess.PIPE) +except subprocess.CalledProcessError: + print("Error while building dlib") + raise - # Go through each line from stdout - while sp.poll() is None: - line = sp.stdout.readline().decode("utf-8") +# Go through each line from stdout +while sp.poll() is None: + line = sp.stdout.readline().decode("utf-8") - if "DLIB WILL USE CUDA" in line: - cuda_used = True + if "DLIB WILL USE CUDA" in line: + cuda_used = True - print(line, end="") + print(line, end="") - log("Cleaning up dlib") +log("Cleaning up dlib") - # Remove the no longer needed git clone - del sp - rmtree(DLIB_DIR) +# Remove the no longer needed git clone +del sp +rmtree(DLIB_DIR) - print("Temporary dlib files removed") +print("Temporary dlib files removed") log("Installing OpenCV") From de6dac1fd10389ef16ac26381ea8506a4d03ea8e Mon Sep 17 00:00:00 2001 From: Kevin Gravier Date: Fri, 4 Jan 2019 15:26:38 -0500 Subject: [PATCH 56/60] Added config option to enable/disable notification Default is off --- src/config.ini | 3 +++ src/pam.py | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.ini b/src/config.ini index 1f577e9..0d09d1e 100644 --- a/src/config.ini +++ b/src/config.ini @@ -2,6 +2,9 @@ # Press CTRL + X to save in the nano editor [core] +# Print that face detection is being attempted +show_detection_attempt = false + # Do not print anything when a face verification succeeds no_confirmation = false diff --git a/src/pam.py b/src/pam.py index ebc7a0e..c49cb5c 100644 --- a/src/pam.py +++ b/src/pam.py @@ -24,8 +24,9 @@ def doAuth(pamh): if "SSH_CONNECTION" in os.environ or "SSH_CLIENT" in os.environ or "SSHD_OPTS" in os.environ: sys.exit(0) - # Alert the user that we are doing face detection - pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Attempting face detection")) + # Alert the user that we are doing face detection + if config.get("core", "show_detection_attempt") == "true": + pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Attempting face detection")) # Run compare as python3 subprocess to circumvent python version and import issues status = subprocess.call(["/usr/bin/python3", os.path.dirname(os.path.abspath(__file__)) + "/compare.py", pamh.get_user()]) From 3c8db931b961f4e5f1ff18c38e47bbe3c5c1d41e Mon Sep 17 00:00:00 2001 From: boltgolt Date: Sun, 6 Jan 2019 15:08:40 +0100 Subject: [PATCH 57/60] Moved recorders to new folder --- src/cli/add.py | 4 ++-- src/compare.py | 10 ++++++---- src/config.ini | 2 +- src/recorders/__init__.py | 0 src/{ => recorders}/ffmpeg_reader.py | 4 ++++ src/{ => recorders}/pyv4l2_reader.py | 24 ++++++++---------------- src/{ => recorders}/v4l2.py | 0 7 files changed, 21 insertions(+), 23 deletions(-) create mode 100644 src/recorders/__init__.py rename src/{ => recorders}/ffmpeg_reader.py (98%) rename src/{ => recorders}/pyv4l2_reader.py (91%) rename src/{ => recorders}/v4l2.py (100%) diff --git a/src/cli/add.py b/src/cli/add.py index 9fd69b0..3106055 100644 --- a/src/cli/add.py +++ b/src/cli/add.py @@ -101,11 +101,11 @@ insert_model = { # Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": # Set the capture source for ffmpeg - from ffmpeg_reader import ffmpeg_reader + from recorders.ffmpeg_reader import ffmpeg_reader video_capture = ffmpeg_reader(config.get("video", "device_path"), config.get("video", "device_format")) elif config.get("video", "recording_plugin") == "pyv4l2": # Set the capture source for pyv4l2 - from pyv4l2_reader import pyv4l2_reader + from recorders.pyv4l2_reader import pyv4l2_reader video_capture = pyv4l2_reader(config.get("video", "device_path"), config.get("video", "device_format")) else: # Start video capture on the IR camera through OpenCV diff --git a/src/compare.py b/src/compare.py index c063d2f..3f472b8 100644 --- a/src/compare.py +++ b/src/compare.py @@ -116,11 +116,11 @@ timings["ic"] = time.time() # Check if the user explicitly set ffmpeg as recorder if config.get("video", "recording_plugin") == "ffmpeg": # Set the capture source for ffmpeg - from ffmpeg_reader import ffmpeg_reader + from recorders.ffmpeg_reader import ffmpeg_reader video_capture = ffmpeg_reader(config.get("video", "device_path"), config.get("video", "device_format")) elif config.get("video", "recording_plugin") == "pyv4l2": # Set the capture source for pyv4l2 - from pyv4l2_reader import pyv4l2_reader + from recorders.pyv4l2_reader import pyv4l2_reader video_capture = pyv4l2_reader(config.get("video", "device_path"), config.get("video", "device_format")) else: # Start video capture on the IR camera through OpenCV @@ -178,12 +178,14 @@ while True: stop(11) # Grab a single frame of video - _, frame = video_capture.read() + ret, frame = video_capture.read() try: + # Convert from color to grayscale + # First processing of frame, so frame errors show up here gsframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) except cv2.error: - print("Unknown camera, please check your 'device_path' config value.\n") + print("\nUnknown camera, please check your 'device_path' config value.\n") raise # Create a histogram of the image with 8 values diff --git a/src/config.ini b/src/config.ini index 09ba09e..70a063d 100644 --- a/src/config.ini +++ b/src/config.ini @@ -57,7 +57,7 @@ frame_height = -1 # The lower this setting is, the more dark frames are ignored dark_threshold = 50 -# The recorder to use. Can be either opencv, ffmpeg or pyv4l2. +# The recorder to use. Can be either opencv (default), ffmpeg or pyv4l2. # Switching from the default opencv to ffmpeg can help with grayscale issues. recording_plugin = opencv diff --git a/src/recorders/__init__.py b/src/recorders/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ffmpeg_reader.py b/src/recorders/ffmpeg_reader.py similarity index 98% rename from src/ffmpeg_reader.py rename to src/recorders/ffmpeg_reader.py index da77eae..8015726 100755 --- a/src/ffmpeg_reader.py +++ b/src/recorders/ffmpeg_reader.py @@ -126,3 +126,7 @@ class ffmpeg_reader: """ Empty our array. If we had a hold on the camera, we would give it back here. """ self.video = () self.num_frames_read = 0 + + def grab(self): + """ Redirect grab() to read() for compatibility """ + self.read() diff --git a/src/pyv4l2_reader.py b/src/recorders/pyv4l2_reader.py similarity index 91% rename from src/pyv4l2_reader.py rename to src/recorders/pyv4l2_reader.py index b0472c0..6d52871 100644 --- a/src/pyv4l2_reader.py +++ b/src/recorders/pyv4l2_reader.py @@ -1,19 +1,20 @@ # Class that simulates the functionality of opencv so howdy can use v4l2 devices seamlessly # Import required modules. lib4l-dev package is also required. -import v4l2 +from recorders import v4l2 import fcntl import numpy import sys from cv2 import cvtColor, COLOR_GRAY2BGR, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT try: - from pyv4l2.frame import Frame + from v4l2.frame import Frame except ImportError: print("Missing pyv4l2 module, please run:") print(" pip3 install pyv4l2\n") sys.exit(13) + class pyv4l2_reader: """ This class was created to look as similar to the openCV features used in Howdy as possible for overall code cleanliness. """ @@ -39,7 +40,7 @@ class pyv4l2_reader: return self.width elif prop == CAP_PROP_FRAME_HEIGHT: return self.height - + def probe(self): """ Probe the video device to get height and width info """ @@ -51,7 +52,7 @@ class pyv4l2_reader: if ret == 0: height = fmt.fmt.pix.height width = fmt.fmt.pix.width - else: + else: # Could not determine the resolution from ioctl call. Reverting to slower ffmpeg.probe() method import ffmpeg probe = ffmpeg.probe(self.device_name) @@ -68,7 +69,6 @@ class pyv4l2_reader: """ Start recording """ self.frame = Frame(self.device_name) - def grab(self): """ Read a sigle frame from the IR camera. """ self.read() @@ -77,26 +77,19 @@ class pyv4l2_reader: """ Read a sigle frame from the IR camera. """ if not self.frame: - self.record() + self.record() # Grab a raw frame from the camera frame_data = self.frame.get_frame() # Convert the raw frame_date to a numpy array - img = ( - numpy - .frombuffer(frame_data, numpy.uint8) - ) + img = (numpy.frombuffer(frame_data, numpy.uint8)) # Convert the numpy array to a proper grayscale image array img_bgr = cvtColor(img, COLOR_GRAY2BGR) # Convert the grayscale image array into a proper RGB style numpy array - img2 = ( - numpy - .frombuffer(img_bgr, numpy.uint8) - .reshape([352, 352, 3]) - ) + img2 = (numpy.frombuffer(img_bgr, numpy.uint8).reshape([352, 352, 3])) # Return a single frame of video return 0, img2 @@ -107,4 +100,3 @@ class pyv4l2_reader: self.num_frames_read = 0 if self.frame: self.frame.close() - diff --git a/src/v4l2.py b/src/recorders/v4l2.py similarity index 100% rename from src/v4l2.py rename to src/recorders/v4l2.py From 77fd423df95a67aea8debb4202bc041578bc02c1 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Sun, 6 Jan 2019 15:36:03 +0100 Subject: [PATCH 58/60] Added upgrade step and fixed lintian errors --- debian/control | 2 +- debian/postinst | 5 +++++ src/cli/test.py | 1 - src/recorders/ffmpeg_reader.py | 0 4 files changed, 6 insertions(+), 2 deletions(-) mode change 100755 => 100644 src/recorders/ffmpeg_reader.py diff --git a/debian/control b/debian/control index 128a891..2b4262b 100644 --- a/debian/control +++ b/debian/control @@ -9,7 +9,7 @@ Vcs-Git: https://github.com/boltgolt/howdy Package: howdy Homepage: https://github.com/boltgolt/howdy Architecture: all -Depends: ${misc:Depends}, curl|wget, python3-pip, python3-dev, python3-setuptools, libpam-python, fswebcam, libopencv-dev, cmake, streamer +Depends: ${misc:Depends}, curl|wget, python3, python3-pip, python3-dev, python3-setuptools, libpam-python, fswebcam, libopencv-dev, cmake, streamer Recommends: libatlas-base-dev | libopenblas-dev | liblapack-dev Suggests: nvidia-cuda-dev (>= 7.5) Description: Howdy: Windows Hello style authentication for Linux. diff --git a/debian/postinst b/debian/postinst index 31066b2..7ceb41c 100755 --- a/debian/postinst +++ b/debian/postinst @@ -81,6 +81,11 @@ if not os.path.exists("/tmp/howdy_picked_device"): with open("/lib/security/howdy/config.ini", "w") as configfile: newConf.write(configfile) + # Install dlib data files if needed + if not os.path.exists("/lib/security/howdy/dlib-data/shape_predictor_5_face_landmarks.dat"): + print("Attempting installation of missing data files") + handleStatus(subprocess.call(["./install.sh"], shell=True, cwd="/lib/security/howdy/dlib-data")) + sys.exit(0) # Open the temporary file containing the device ID diff --git a/src/cli/test.py b/src/cli/test.py index c214819..3c99289 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -1,4 +1,3 @@ -#! /usr/bin/python3 # Show a windows with the video stream and testing information # Import required modules diff --git a/src/recorders/ffmpeg_reader.py b/src/recorders/ffmpeg_reader.py old mode 100755 new mode 100644 From c3649dca3a2b15d887c338d8a170f9dd4a5d5280 Mon Sep 17 00:00:00 2001 From: boltgolt Date: Sun, 6 Jan 2019 16:04:57 +0100 Subject: [PATCH 59/60] Added changelog --- debian/changelog | 12 ++++++++++++ src/cli/test.py | 4 ++-- src/config.ini | 2 +- src/pam.py | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 6e8f309..66a0ecb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +howdy (2.5.0) xenial; urgency=medium + + * Added FFmpeg and v4l2 recorders (thanks @timwelch!) + * Added automatic PAM inclusion on installation + * Added optional notice on detection attempt (thanks @mrkmg!) + * Added support for grayscale frame encoding (thanks @dmig and @sapjunior!) + * Massively improved recognition speed (thanks @dmig!) + * Fixed typo in "timout" config value + * Removed unneeded dependencies (thanks @dmig!) + + -- boltgolt Sun, 06 Jan 2019 14:37:41 +0100 + howdy (2.4.0) xenial; urgency=medium * Cameras are now selected by path instead of by video device number (thanks @Rhiyo!) diff --git a/src/cli/test.py b/src/cli/test.py index 3c99289..c3cbebb 100644 --- a/src/cli/test.py +++ b/src/cli/test.py @@ -15,8 +15,8 @@ path = os.path.dirname(os.path.abspath(__file__)) config = configparser.ConfigParser() config.read(path + "/../config.ini") -if config.get("video", "recording_plugin") == "ffmpeg": - print("Howdy has been configured to use ffmpeg as recorder, which doesn't support the test command yet") +if config.get("video", "recording_plugin") != "opencv": + print("Howdy has been configured to use a recorder which doesn't support the test command yet") print("Aborting") sys.exit(12) diff --git a/src/config.ini b/src/config.ini index 70a063d..34d5685 100644 --- a/src/config.ini +++ b/src/config.ini @@ -3,7 +3,7 @@ [core] # Print that face detection is being attempted -show_detection_attempt = false +detection_notice = false # Do not print anything when a face verification succeeds no_confirmation = false diff --git a/src/pam.py b/src/pam.py index b4a2c37..da98cf1 100644 --- a/src/pam.py +++ b/src/pam.py @@ -26,7 +26,7 @@ def doAuth(pamh): sys.exit(0) # Alert the user that we are doing face detection - if config.get("core", "show_detection_attempt") == "true": + if config.get("core", "detection_notice") == "true": pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Attempting face detection")) # Run compare as python3 subprocess to circumvent python version and import issues From e8d8692f402ecce455a8248789645ed752535bac Mon Sep 17 00:00:00 2001 From: boltgolt Date: Sun, 6 Jan 2019 16:32:18 +0100 Subject: [PATCH 60/60] Typo fix --- src/recorders/ffmpeg_reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/recorders/ffmpeg_reader.py b/src/recorders/ffmpeg_reader.py index 8015726..e9856f6 100644 --- a/src/recorders/ffmpeg_reader.py +++ b/src/recorders/ffmpeg_reader.py @@ -46,7 +46,7 @@ class ffmpeg_reader: def probe(self): """ Probe the video device to get height and width info """ - # Running this command on ffmpeg unfortunatly returns with an exit code of 1, which is silly. + # Running this command on ffmpeg unfortunately returns with an exit code of 1, which is silly. # Returns an error code of 1 and this text: "/dev/video2: Immediate exit requested" args = ["ffmpeg", "-f", self.device_format, "-list_formats", "all", "-i", self.device_path] process = Popen(args, stdout=PIPE, stderr=PIPE)