From 6e7bc84966e22a421809215f44f84ba6adaf382a Mon Sep 17 00:00:00 2001 From: 51616 Date: Mon, 20 Jan 2025 10:31:08 +0000 Subject: [PATCH] everything (before us migrate) --- .gitignore | 3 +- batch.sh | 29 ++++++++++++++++++ batch_gemma_2_2b.sh | 30 +++++++++++++++++++ batch_gemma_llama_vision.sh | 30 +++++++++++++++++++ batch_llama_2_7b.sh | 29 ++++++++++++++++++ batch_llama_3_8b_1k_latent.sh | 29 ++++++++++++++++++ generate_fw_qa.py | 48 ++++++++++++++++-------------- generate_one_big_fw_qa_req.py | 22 ++++++++++++++ generate_qa_parallel.py | 6 ++-- hotpot_qa_lengths.png | Bin 0 -> 15254 bytes hotpot_qa_lengths_filtered.png | Bin 0 -> 16047 bytes openphi_prog_lengths.png | Bin 0 -> 8806 bytes openphi_prog_lengths_filtered.png | Bin 0 -> 13999 bytes post_process_parallel_qa.py | 6 ++++ run.sh | 9 ++++++ src/ctx_to_lora/eval_utils.py | 0 src/ctx_to_lora/lm_eval.py | 0 src/ctx_to_lora/model_loading.py | 26 +++++++++------- 18 files changed, 231 insertions(+), 36 deletions(-) create mode 100755 batch.sh create mode 100755 batch_gemma_2_2b.sh create mode 100755 batch_gemma_llama_vision.sh create mode 100755 batch_llama_2_7b.sh create mode 100755 batch_llama_3_8b_1k_latent.sh create mode 100644 generate_one_big_fw_qa_req.py create mode 100644 hotpot_qa_lengths.png create mode 100644 hotpot_qa_lengths_filtered.png create mode 100644 openphi_prog_lengths.png create mode 100644 openphi_prog_lengths_filtered.png create mode 100755 run.sh create mode 100644 src/ctx_to_lora/eval_utils.py create mode 100644 src/ctx_to_lora/lm_eval.py diff --git a/.gitignore b/.gitignore index 5ed6ddb..a5669eb 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ plots/ *.pth *.bin *.safetensors -*tfevents* \ No newline at end of file +*tfevents* +watcher_state.yaml diff --git a/batch.sh b/batch.sh new file mode 100755 index 0000000..9e1a41d --- /dev/null +++ b/batch.sh @@ -0,0 +1,29 @@ +#!/bin/bash +#SBATCH --job-name=ctx_to_lora +#SBATCH --partition=a3 +#SBATCH --gpus=4 +#SBATCH --exclude=slurm0-a3nodeset-[0-5] +#SBATCH --output=outputs/%x-%j.out +#SBATCH --error=outputs/%x-%j.out + +# module load +# module load cuda/12.1 +# module load cudnn/8.9.7 +# module load nccl/cuda-12.1/2.18.3 +# module load hpcx/2.20 + +export OMP_NUM_THREADS=24 +export TRITON_CACHE_DIR=/tmp/.triton/ +. ~/miniconda3/etc/profile.d/conda.sh +conda activate /home/rujikorn_sakana_ai/.conda/envs/llm-modulator +# eval "$@" + +accelerate launch --num_processes=4 --gradient_accumulation_steps=8 --gradient_clipping=1.0 \ +--gpu_ids all --main_process_port 29551 intx_sft.py configs/fw_qa_large_ctx_pwc_hotpot_squad.yaml \ +--model_name_or_path=meta-llama/Llama-3.1-8B-Instruct --num_train_epochs=5.1 --per_device_train_batch_size=4 \ +--gradient_accumulation_steps=8 --per_device_eval_batch_size=8 --exp_setup=hyper_lora --aggregator_type=perceiver \ +--target_modules=down_proj,up_proj,gate_proj --num_blocks=1 --num_self_attends_per_block=32 \ +--self_attention_widening_factor=4 --eval_steps=5000 --save_steps=5000 --learning_rate=2e-5 \ +--neftune_noise_alpha=5 --use_light_weight_lora=True --light_weight_latent_size=512 \ +--load_best_model_at_end=True --metric_for_best_model=pwc_loss --add_negative_prompt=False \ +--add_repeat_prompt=False --resume_from_checkpoint=train_outputs/runs/Jan18_14-07-58_slurm0-a3nodeset-6_3de73fea/checkpoint-30000 diff --git a/batch_gemma_2_2b.sh b/batch_gemma_2_2b.sh new file mode 100755 index 0000000..dcc8377 --- /dev/null +++ b/batch_gemma_2_2b.sh @@ -0,0 +1,30 @@ +#!/bin/bash +#SBATCH --job-name=ctx_to_lora +#SBATCH --partition=a3 +#SBATCH --gpus=8 +#SBATCH --exclude=slurm0-a3nodeset-[0-5] +#SBATCH --output=outputs/%x-%j.out +#SBATCH --error=outputs/%x-%j.out + +# module load +# module load cuda/12.1 +# module load cudnn/8.9.7 +# module load nccl/cuda-12.1/2.18.3 +# module load hpcx/2.20 + +export OMP_NUM_THREADS=24 +export TRITON_CACHE_DIR=/tmp/.triton/ +. ~/miniconda3/etc/profile.d/conda.sh +conda activate /home/rujikorn_sakana_ai/.conda/envs/llm-modulator +# eval "$@" + +accelerate launch --num_processes=8 --gradient_accumulation_steps=4 --gradient_clipping=1.0 \ +--gpu_ids all --main_process_port 29553 intx_sft.py configs/fw_qa_large_ctx_pwc_hotpot_squad.yaml \ +--model_name_or_path=google/gemma-2-2b-it --num_train_epochs=5.1 --per_device_train_batch_size=4 \ +--gradient_accumulation_steps=8 --per_device_eval_batch_size=8 --exp_setup=hyper_lora --aggregator_type=perceiver \ +--target_modules=down_proj,up_proj,gate_proj --num_blocks=1 --num_self_attends_per_block=32 \ +--self_attention_widening_factor=4 --eval_steps=5000 --save_steps=5000 --learning_rate=2e-5 \ +--neftune_noise_alpha=5 --use_light_weight_lora=True --light_weight_latent_size=512 \ +--load_best_model_at_end=True --metric_for_best_model=pwc_loss --add_negative_prompt=False \ +--add_repeat_prompt=False +# --resume_from_checkpoint=train_outputs/runs/Jan18_14-22-38_slurm0-a3nodeset-10_c9340910/checkpoint-15000/ diff --git a/batch_gemma_llama_vision.sh b/batch_gemma_llama_vision.sh new file mode 100755 index 0000000..03ff5c8 --- /dev/null +++ b/batch_gemma_llama_vision.sh @@ -0,0 +1,30 @@ +#!/bin/bash +#SBATCH --job-name=gemma_llama_vision +#SBATCH --partition=a3 +#SBATCH --nodes=1 +#SBATCH --gpus=8 +#SBATCH --output=outputs/%x-%j.out +#SBATCH --error=outputs/%x-%j.out + +# module load +# module load cuda/12.1 +# module load cudnn/8.9.7 +# module load nccl/cuda-12.1/2.18.3 +# module load hpcx/2.20 + +# export OMP_NUM_THREADS=24 +# export TRITON_CACHE_DIR=/tmp/.triton/ +. ~/miniconda3/etc/profile.d/conda.sh +conda activate /home/rujikorn_sakana_ai/.conda/envs/llm-modulator +# eval "$@" + +accelerate launch --num_processes=8 --gradient_accumulation_steps=4 --gradient_clipping=1.0 \ +--gpu_ids all --main_process_port 29554 intx_sft.py configs/pretrain_all.yaml \ +--model_name_or_path=google/gemma-2-2b-it --num_train_epochs=5.1 --per_device_train_batch_size=4 \ +--gradient_accumulation_steps=4 --per_device_eval_batch_size=4 --exp_setup=hyper_lora --aggregator_type=perceiver \ +--target_modules=down_proj --num_blocks=1 --num_self_attends_per_block=16 \ +--self_attention_widening_factor=1 --eval_steps=5000 --save_steps=5000 --learning_rate=2e-5 \ +--neftune_noise_alpha=5 --use_light_weight_lora=True --light_weight_latent_size=512 \ +--load_best_model_at_end=True --metric_for_best_model=pwc_loss --add_negative_prompt=False \ +--add_repeat_prompt=False --ctx_encoder_model_name_or_path=meta-llama/Llama-3.2-11B-Vision-Instruct + diff --git a/batch_llama_2_7b.sh b/batch_llama_2_7b.sh new file mode 100755 index 0000000..76ba443 --- /dev/null +++ b/batch_llama_2_7b.sh @@ -0,0 +1,29 @@ +#!/bin/bash +#SBATCH --job-name=ctx_to_lora +#SBATCH --partition=a3 +#SBATCH --gpus=4 +#SBATCH --exclude=slurm0-a3nodeset-[0-5] +#SBATCH --output=outputs/%x-%j.out +#SBATCH --error=outputs/%x-%j.out + +# module load +# module load cuda/12.1 +# module load cudnn/8.9.7 +# module load nccl/cuda-12.1/2.18.3 +# module load hpcx/2.20 + +export OMP_NUM_THREADS=24 +export TRITON_CACHE_DIR=/tmp/.triton/ +. ~/miniconda3/etc/profile.d/conda.sh +conda activate /home/rujikorn_sakana_ai/.conda/envs/llm-modulator +# eval "$@" + +accelerate launch --num_processes=4 --gradient_accumulation_steps=8 --gradient_clipping=1.0 \ +--gpu_ids all --main_process_port 29552 intx_sft.py configs/fw_qa_large_ctx_pwc_hotpot_squad.yaml \ +--model_name_or_path=meta-llama/Llama-2-7b-chat-hf --num_train_epochs=5.1 --per_device_train_batch_size=4 \ +--gradient_accumulation_steps=8 --per_device_eval_batch_size=8 --exp_setup=hyper_lora --aggregator_type=perceiver \ +--target_modules=down_proj,up_proj,gate_proj --num_blocks=1 --num_self_attends_per_block=32 \ +--self_attention_widening_factor=4 --eval_steps=5000 --save_steps=5000 --learning_rate=2e-5 \ +--neftune_noise_alpha=5 --use_light_weight_lora=True --light_weight_latent_size=512 \ +--load_best_model_at_end=True --metric_for_best_model=pwc_loss --add_negative_prompt=False \ +--add_repeat_prompt=False diff --git a/batch_llama_3_8b_1k_latent.sh b/batch_llama_3_8b_1k_latent.sh new file mode 100755 index 0000000..374af09 --- /dev/null +++ b/batch_llama_3_8b_1k_latent.sh @@ -0,0 +1,29 @@ +#!/bin/bash +#SBATCH --job-name=ctx_to_lora +#SBATCH --partition=a3 +#SBATCH --nodes=1 +#SBATCH --gpus=8 +#SBATCH --output=outputs/%x-%j.out +#SBATCH --error=outputs/%x-%j.out + +# module load +# module load cuda/12.1 +# module load cudnn/8.9.7 +# module load nccl/cuda-12.1/2.18.3 +# module load hpcx/2.20 + +# export OMP_NUM_THREADS=24 +# export TRITON_CACHE_DIR=/tmp/.triton/ +. ~/miniconda3/etc/profile.d/conda.sh +conda activate /home/rujikorn_sakana_ai/.conda/envs/llm-modulator +# eval "$@" + +accelerate launch --num_processes=8 --gradient_accumulation_steps=4 --gradient_clipping=1.0 \ +--gpu_ids all --main_process_port 29555 intx_sft.py configs/pretrain_all.yaml \ +--model_name_or_path=meta-llama/Llama-3.1-8B-Instruct --num_train_epochs=5.1 --per_device_train_batch_size=4 \ +--gradient_accumulation_steps=4 --per_device_eval_batch_size=4 --exp_setup=hyper_lora --aggregator_type=perceiver \ +--target_modules=down_proj,up_proj --num_blocks=1 --num_self_attends_per_block=32 \ +--self_attention_widening_factor=4 --eval_steps=5000 --save_steps=5000 --learning_rate=2e-5 \ +--neftune_noise_alpha=5 --use_light_weight_lora=True --light_weight_latent_size=1024 \ +--load_best_model_at_end=True --metric_for_best_model=pwc_loss --add_negative_prompt=False \ +--add_repeat_prompt=False --ctx_encoder_model_name_or_path=Alibaba-NLP/gte-large-en-v1.5 diff --git a/generate_fw_qa.py b/generate_fw_qa.py index e709d13..9a2d2f3 100644 --- a/generate_fw_qa.py +++ b/generate_fw_qa.py @@ -93,30 +93,32 @@ def parse_args() -> Namespace: if __name__ == "__main__": # Load the datasets args = parse_args() - ds = load_dataset( - "parquet", - data_files=f"./data/raw_datasets/fineweb_sharded/{args.shard_pattern}.parquet", - split="train", - streaming=True, - ) - os.makedirs("openai_batches", exist_ok=True) - lines = [] - c = 0 - for i, sample in tqdm(enumerate(iter(ds))): - if len(lines) >= 20_000: - with open(f"openai_batches/fineweb_qa_pairs_{c}.jsonl", "w") as f: - for line in lines: - f.write(json.dumps(line) + "\n") - lines = [] - c += 1 - jsonl = get_json_request( - f"{c}_{i}", sample["text"], args.n_qa_pairs, args.gpt_model_name - ) - lines.append(jsonl) - + # ds = load_dataset( + # "parquet", + # data_files=f"./data/raw_datasets/fineweb_sharded/{args.shard_pattern}.parquet", + # split="train", + # streaming=True, + # ) + # os.makedirs("openai_batches", exist_ok=True) + # lines = [] + # c = 0 + # for i, sample in tqdm(enumerate(iter(ds))): + # if len(lines) >= 20_000: + # with open(f"openai_batches/fineweb_qa_pairs_{c}.jsonl", "w") as f: + # for line in lines: + # f.write(json.dumps(line) + "\n") + # lines = [] + # c += 1 + # jsonl = get_json_request( + # f"{c}_{i}", sample["text"], args.n_qa_pairs, args.gpt_model_name + # ) + # lines.append(jsonl) + # client = OpenAI() - - for file in glob("openai_batches/fineweb_qa_pairs_*.jsonl"): + res_files = glob("openai_batches/fineweb_qa_pairs_*_res.jsonl") + prompt_files = glob("openai_batches/fineweb_qa_pairs_*[!res].jsonl") + unprocessed_files = set(prompt_files) - set([f.replace("_res","") for f in res_files]) + for file in unprocessed_files: print(f"Submitting batch {file}") batch_input_file = client.files.create(file=open(file, "rb"), purpose="batch") batch_input_file_id = batch_input_file.id diff --git a/generate_one_big_fw_qa_req.py b/generate_one_big_fw_qa_req.py new file mode 100644 index 0000000..209bf63 --- /dev/null +++ b/generate_one_big_fw_qa_req.py @@ -0,0 +1,22 @@ +import json +from glob import glob + +if __name__ == "__main__": + res_files = glob("openai_batches/fineweb_qa_pairs_*_res.jsonl") + prompt_files = glob("openai_batches/fineweb_qa_pairs_*[!res].jsonl") + unprocessed_files = set(prompt_files) - set( + [f.replace("_res", "") for f in res_files] + ) + print(f"Found {len(unprocessed_files)} unprocessed files:\n{unprocessed_files}") + # Concatenate "body" from each line from unprocessed files + with open("openai_batches/fineweb_qa_pairs_large.jsonl", "w") as outfile: + for fname in unprocessed_files: + with open(fname) as infile: + for line in infile: + # Load the JSON object from the line + obj = json.loads(line) + # Extract the "body" and write it as a new line + if "body" in obj: + outfile.write(json.dumps(obj["body"]) + "\n") + + print(f"Concatenated 'body' from {len(unprocessed_files)} files") diff --git a/generate_qa_parallel.py b/generate_qa_parallel.py index 9455195..624cb67 100644 --- a/generate_qa_parallel.py +++ b/generate_qa_parallel.py @@ -467,8 +467,10 @@ if __name__ == "__main__": "--request_url", default="https://api.openai.com/v1/chat/completions" ) parser.add_argument("--api_key", default=os.getenv("OPENAI_API_KEY")) - parser.add_argument("--max_requests_per_minute", type=int, default=5_000 * 0.5) - parser.add_argument("--max_tokens_per_minute", type=int, default=2_000_000 * 0.8) + # tier 4 limit + parser.add_argument("--max_requests_per_minute", type=int, default=10_000 * 0.5) + parser.add_argument("--max_tokens_per_minute", type=int, default=10_000_000 * 0.5) + # parser.add_argument("--token_encoding_name", default="o200k_base") parser.add_argument("--max_attempts", type=int, default=5) parser.add_argument("--logging_level", default=logging.INFO) diff --git a/hotpot_qa_lengths.png b/hotpot_qa_lengths.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4cbd9d5b1c7f91a0f232ae760246934cf9c301 GIT binary patch literal 15254 zcmeHucUV)|+V56W92+`{2q;((L@CmxV*w^gks3NGO7ERe?W0mgM3KyLw!8zJaJ-b#=6LaJ99%cG&%fvx}93 zy@-IMfH2=-OIKG%7b!tOyWf65z`@x<@Q4~iCp^gyjz8(UAPCb{^zVij@~Kt`BF%ug za8}zhYP#3oQJYe>K8HQ`fhjFA-~;#Dt=TDue|&I@Z}5?(p!d$u{G=NxKQ!3=qSU&` zwteTrD=YEAF1PhgB|8Uo8AP4hcRkmW(b9UyWdjVurrj$?Som(`+U_=cy?gVyMKZl| zaNs5)w1GTC_NkA0K$D!!8FP_y`Q*FODQi&~D5L}z_e#mr&;!0Aru-WZBS^rFtpV^q z&yFA)5k&7EvK2wDu>SuC{wGVqoscQr{P^y6G{HFWkM~Ey<#U*xvPrpSpPQqV<$L+>HIpUn`m1dfiBQZW3LaHoRgclvAxSv9Ssq zA*n&$3m=kY}kz; zZ-h4~z?=EF8$lm9|IZ$1n?wp72hUNayRj`TE%PfrU4>3Vic{f&ri3**?Ua<1L0Vdx zK^ZR3rc6jF$D&F1+__uVu3Z~mqUCwanqXB`RfC*eTt?bL4SGB##2)sb0OSEs3~`^^2zr@{96ND1}r`}rRX#Pm}dtv|L+V z!Oc~%h*>m72@+Xg<<)9)-!;ddZ=f&r&&t@_+KN7S@F1nIu&|ao>%UIp77=M9j*?gE zL;P3G%mRhtFMoJnQxlmQgR9dwH8iwINJyyXT>Huh50$u23y0RHs76NN<>?dZ+5J@?Vt7N zdRJLFvP9F-&}bPJXJ%$5;4pO`J~&P;&Gu(093Du25ES&ZY0Sm?yL?~IsV zh3VknVEW6Kw$2r_#c3@ot2CwHgPmW>VFS48^6v^z4&l%-GfONr$;#-RqMY2lRkTR; z@a{rOdPGHd`UEi}+{X99g*&)~ai>1N`%IjK@o~%Kq@?j+>6zxC5c$3@<)S0QwNJKf zxlKTCU*ZGHsa-~xkI(qqvdwB18l`8)CT4AUrgw#{yLK#mCNzcyC*7vol3uG11#$w0#IQ^CfH`~B2 z@5+p8mpxpCu$ny<6->(4_&#$s=; zTz>lWshTPdS8Q!#qoboU(*9CEM=AdDPja!dx9B_Xp0l>JynJGxwXP}tM`q^ZAvHq= zu%c3UUEfVc+S*A!?B%xn@XHZ4Dc2XHO|e;2Do!=(j7Df!cz9}GnRiBEp{TOh3z}e!(-F&QvafgiZ<+a zu8EXL`_}Q6L@}#YuBTyPFXH3R-o1ObuC`X=+O-5OtGUlrlU;cknp#@0N0J*NC2Xn# zS?d}bbx8!{$X_>hW4g|U)6&w0oW2W>&6{E}6%NPc=88Uj_DqTedr-#n^5CEa4=Z}J zk6(IbIa(iq8-A=D78;tsd`j1H;LT07hFq&QZBx^%Temh6J36f2|GeiUKfjKvYpzy~ z=iD{s{rj!kUubM&Vj{u7$i4FRRt_Wco_L;EAIzclB zd&UFb1q!8PO1EfizJ0c;x;mXe2oAa3GUK>sD zWI-=>n-X>ZqIaB&>xE%~{l!a{+CEo3GH%MYY&i;hwCLIR__%H`kShfmDIF=a?G%PR zYSkDe+4cIyqb)nxk^%#F9FlZSs-^B^7q?tpo~vtWB6VaM!eLB)`I2w?Q+8!qgoH!P zem=dp(9j=sbam6=Wnc<6KiJC?h41Mxn(ismf}?Cu@QpFvgs=K zE#X#+dQn;`13=J9tIWG#%Z>waFbAz*G=wI#wrU2kiYVRRbx0Fn^NDXmeSH{d zig-z|jBA3-`i564LIIysB_>bDL~Qyq__>JU2AimKqWo8j9XiSXpvHjnDir1`a6+ zs9|$U?iqwb7N;E)6a;uqaL*!TC>(Ac7Qd-5kU+6mGf7XuW|%_ioR?A-prCi6GH-{9#goIh%7#bGl`W7Z@ zz+!rv>E=@RX#;eQ3YIS?*q5)Er^?F88hd$pq1)`k<6{)+RMu3NO%{>dB=7%r3@>DM zZ*p=nYNV1$e)Z%o7&8N}t(}lBojIw+t`iB9lh#;oH@7^P_kaO%a%$|idw8( zCLWI`FVey*Ru%i#77Hl#B26a*1!og#+VX6$y|}5&t^$Yt%_ztZ&v_bchYhXV_8B?A z%9{4}He*I`F4)YOv6<7qEn)~Bhfspxcv9x~r^unXx7Yk>w;S3JeBluK; z7&{A`op*PBU=zOn^Sxb%(pSi18Rg}DD+FT`lNj96Oy=j$*D$Ss&SK8PKgrS;+Un}- z+gp<_<$00K%f7zb9-8#()oIlTVMTSBxjUMgnqg5<0CMKMLP8q)`ud?sk@m%yMCFi< zB+L`o+zI#YZGq8#l82|JXrt$JS01&apgg(u36D)rp;My=!?9z>qPL&r@LzR;qpKp( z=a~q|Nom(opLlbVp?J2OW+1`^5IJpVMz zU@%#XA;X-}(bIdOk*LHgBVz=!tnJq3?NJoLiq+S0^aU+u78dD2txzC8X>L;;m{7Tu z;k~MOQ4G9(Z;1zK;O*_atCd@TPsE9x-)Q9C^N0y?EXtdd3&DZkai9KYUTH#TYamp}gaV>>8< z3X;A@gDqn1Eg*+eaW5f&D99scl`drHFgQ{3E8%_(_# zQ@|J)jn7`cew}Mpvn$oSuhh%n)s>ro2ip4jY4*LvyvL56=TVDtvJst+9J=C+<}Ps4qE%Xl0E zV;iQhL9XRvXJ_YJ?Q@0m1K$H6@($=T zD=VuS9dse{)=frYFuFl6s;Md}-u?XfbJSNJ%x^lR^osw~m~sM|IyiGYaC^A#DH_po_N3yb1>dMd+zYdwsz%SAHE&Pp-Yb}5bwn=X#&Q@FN%x1h$hCynaj(|+yxIpLMpz= zA<3nqPvCB3q@;|N($_`={aXqu=ytN?dJ)i(G)-Tti`v>@G8`eO;uyCyIEcVZ6!ZLg zj*%P#zc6)g7E87ZzNxWn8dHBq_DEwGTr=JcyfapM@^0*1}IY7!9GT(_Y-xwiQ;pGMZc2fmj;wQjv5+|xmBLWf!MPgZ;r>y`?%=VoW5O~I=8Y82BOgXr{OrOqF~y)YL~#q2=%hS;{5UFlu3n9Y{S|d80OUl5gYT3fUdHQnbrAcQ zPnMvtaBI=-;ct}wr2#XNlaoVfQRcK-{L%^c5?~tDpDs>SfRW4`e(s@80Qd&4uRkzv zj7n4H@Vdau%WIH*?e3Oc2glo0BE?l<$DcfL;xgc)Qs9AjAWXnirNthx2sv{KGREB7XOg z0^-V5>Q6R&16!}-_fA)Yn*T9N#8lRP|4w9@{o8N_b)b;Z>9biBalP{q?udcij}%X&%xnA^3#1tnl}Tdv!`o zOeX`I<(?@~Z3%ne;!i(aR#6Fr$+0-oJCzRhkp@^ZaA06agvG{Yfs&V=Qja$?F zg-0L${PSg9-3~9hUV(k|yLayz4L9CY_{a$ENF0OZ|2>~5J6l6YNQm0meaQ(;x_lxD917X5Zy4}$zEm$t zXJ==6Ru-x5>8a@atCjb7`T14hNC{V;0KTP_sz$ucBzFRno{{kcL_mV#qp&AW5`mf6 zyb0LQm236n-VWBI7@$eS=R#&ck&nRWFJAPTEn7;@&({TVlThOo2sg+ zyz%ARZ{x0+nSqzW6H?QbFs4w`{;OU*cc1)yvj6m%ZfIS#V<1f{RU14G{MGGDOyT{r zSVcv}C*6RHQ4+_(A3q*!pY5+Oy{YgVZso18mc6bO-w($r5P(TA_4h{ksae}@F zfyluvZmw9TRZIbrt+jSDSVok$VWSHWq@3*!W|PTRZ`a?X!e~#3)v=>TQD6|H(8~ba z!P*$lBbl_>WR<1BLi&;;``e%K8wwOQ0O@4jvBmgT*1fl-?APF+y z&cUEpYk-Lhct1>DF~FS(O|t9G=RI;{@YYn~@5M!WNWdfTM6bTvw3Ai%!uk8Vh^s4P z9WY@4{w{_BpJ*@fZ~&5fDU@41=H=sK%99hRvAQ53o(UMIg9$Wsm&N24F3{jsbz!`? z&kuM|LuYvSI=uKL@HHFDR_%)?xPv%k4W4kTYJ!Q%#>S=%d^#%XAc^@6IGC;ICehML zG^+`=>dvf&?;+&f@2c0Gl2 z36ziFf>`h*m=7JwY;V`jG%4%K>pPIxnPYM4$dR)!bHU5#D)Gny!j+;_R8%zYDf95r zBP~C_@?cK+nV0gg<7Ud1Ou(l)dGzQx(5$M9H-IP=Pv>{<1M8FBp;Y71etzo~RIa&l zWo`=qiVt?kW3V(6`3>_eo8!)+))5>Q{LB7VS8rE`aArYJ0b~n~s6NcJR!C-|@LuFm zbZbGzqH*I!GB{i*V5UT$ae9|l+t5I4jFtxCmh$uz)*7Y|&=toH332h0+}uj?w9Y1& zkC9(K0xy0V5s_9hQ+x@I4$8M&`+b)tn*7&XZ0>{r`j+Vuj3#nXiH*u;Uf#z-N^pGfQf}!SK3~sbG+{V_ zm%pFiAPG+HbYGbv!jHID}z3GpR*%f zC&Oq^goj5Nz6)q$*D(h)`I{rF27!})cN~36+E>TWV*|_FHxLQf75sbqiNKl=9m4Dy1w9--|Ao;5HPhw(bz?g$nDpgKWQXfJN0v=>o zUERf0h$M{R27uafwg%%r@$w0-*e24KHPduK)dvqBhSm%@eV0rY$nmrnFMis~tn zMpIAkd5TIz0#A(RIpE+I)zsisbHbiKAMg1%`_Iw_C*uvJHY9;)upPk*mU92{Jm0RH z8`G%rS>11bFUo=N;&ynyg+xv(6cQ*zY@Ri9&RN*)E;c$yePd&XGN*46df0bwJpp70 z6l!A?Gb0m+w&!vurh2gQzD;fDalE8U3WwM59tfQ*s~$45opFrQ60z$NC6Y)Pad8T; zN^C;c?trv_Au`?0XHu#M7{?}N9R^{Un0?O~e!W+3hy_As)#KnEH4Yg%lT9B;Zu$?1Ii%9=OIiJ8>J4X@);BjmjCe#-+WqCe zaBulzn^HmQndJJd%#Td=S5$yW^c0UzCuU$vI@rxby%%jEbT|QH7pw;Fr5QKK2-{Cc zNMJcal)>Xha|AGRjK#VO97u;edg1|wV7gj?lS7~YNT4Uc=0R|O^w5 zNh^?vc&v$+BG@>n#)vAti@Ept1IsrWGbTckU$67p6$+pidoM zJ3#z{Tk7>Ne!CZDyNESW`3>ktv`Rsl|0rm)G}B9+Q1?&&eFn}dVt$4K$gB%|1jQqC zAK?~Sl+k1YGKPzxAofLX)a{dQojCrTk4nV2Ws zXl#iC(uA7-KzTqHUkvs8dYkivu&^fBz+FWysh}EDOxLL-)b^v!FAs%GHAwWg%dgEb zq5YEeInMQX2F6|E<+K@_?{c1hZL1!2HDBOQ5^|&O3AxDV*TKrX>$N{NL`iCe$jtu? z2}&-UiJb?}G^a%X@_`ShbNO;ySC>K10ikoS9SD)4f`5un`kd_S8Q@N8E%p0Xpj077 z*4rBPHNktc-+V0(Ueqddt2TmX8`@|RCu zfgNwS=Z{16_pw4-It|&VVA0ZUcL(oc1N@T_v3v0Q0bZ&6265crQ@TAa=O~g;`8l<} zdHXI zX%vG1p90+D()1n7cWp4@h4)nWZuufZz~a4-060>7l{*f19n3if%r5WW&_D{(RqAyc z3N?QNJ*4@p=-AljWsD@!a29!w4Q7{TK$`QHx1ueC@8zkla3QW&8dfeUx>zsA9KOP` z@i5^;`79#@H0Y}RS0WP<(84uyd<%riib(F8r&LMab4Q!Ka))Wf4J%82MJ7C+Wg7&t zbp1D#{?%nGog819d#_W?A!u6ZYHEg#HbgEZ(^@;w+KqwKt>8}<2x8lo&idxY$7d*s z1Uv-S9<`7m1IdM=7KHy(rGHD}!AXX|kHXKd|M~)`qhAC2T?bEK@ZaP3a8p11@9r`B z>%a`b0K60mfr#7k*Q?+rr$J9;FOQlwbg!QA=^w=aR20LpMjK6#E~4qCJhdeRZ7$uq zbqm6Q9P5d7%-(Utr)31kf0dhQdGao+naU-J#TB1o`eHZbOHR|p&~x#>Ks>$hhJncv zX8#z`!omVFP?J+wf@>Fa#Zu5-OIX;41BuYDQ;n9=VUk;p<4PkC)J(FlDD11L1-sAo zWo}^DVhO=Cnxt~2<>qReRR^}fhzADzVl2j6tzx-KaNpKV`&e0dF<|Bu>%P>BN9D*r zCMUU9HVG1r3x?hiMe;2hXAc()dr95;$eduea|lbNmmIU4`{T8NxfQ+Vm%TwUzF2nVHt9Si99G261XVW3g_vrIV-MiNK zWvrGbwjCNb2{XMVrmqE6CB5d8Kn+dE5WrttSb5-j{EnL6B(A63Z%g9}nYmK}$@Lg3 z=Z>M_J6p%BE?zRR@sN4uR27pdIm^`GG($F8Cy($?HjOyXEE}cyMzdz=*57pV`~#j! z<=Bp)p-l(l#tjzqi2O&yDB7I!cYT(QQB#wfm27-D)mKJ4PHPQ=cv^Pxli64v4@5SO zkso>8*RZeIk@4LEB%9Aqadz~Rv?ZN#dDj%*L(=Xlum)Inp6Pwq4gNm>iaIv1-8**# zNZvT!hM=LR_vuD2_VfYBsYB&fzn-^AO>Mfu*LaPu=Rio#f$b92LwwbrUy7JHeH}o% zQXqb_GfUddA)@)0kq;PyU}!oLlaiAq#gu~&I?2|26MjRun3P3wm9Nn^L8b}0PX@n$ zz|1X5`0bjZ>^06WtbtYffp^)5oc5ayR(nQO=|wTKv)j=1a+k$VKYsj}O~&&T09tfD zxWpg~lT%YAiqN)MhDj*+4pCGv)v9W0N~~|aje|C0G#(Nos9FI*tV@H4J_xqGk6f%) zjvpN-CMsIE*al?^H;6&?e+`CmRZj647q?$fRE$u3v_AsqK?GE__Oh^80E`G#KZjc4 zeRDW2YV>Z03cI66kJh6Fy&Q-PMWAzuHXO(^C9_guE@O>iz@0~fB>GMRZqRV=I?GEEB90F&(iC6slNhaHyw{OdXCMJJx{qF#FfnJS=*l z=+SWJhrLD=H2+(vmMFi9J`R9xtD9*6`QWy@^`Kn?NmF7P8XD$c4?C$J;4>l~Gd*OgUs`!?GEA%IkPJVE zueom6u7hU3-ONHE4hy0E=pVEq0MmZl(}1q!i2g(G&&tzRq;vmqx|j*dGARp#niEt}3$4rHy@R<~pSL>9Bkx2+DMv&^L@}&ldj?iecA@#a6u8qF=6`g% zid*k5CCgIB6UPqOfVCD)fmpg38mw71gd!zVS{F&wzNe6EZ_uY-o#4=4J{F`1%4eox z-47GJUaALqbvb?7;S@v?SFc_jqwg>Jx2wH>f;Ju|rqBMdEljx~-}k8Klb)!k=r|Zo zy4Kd|sG|ns84}A0U}@n~l6a}u(Z=Yh^ogxzM~taGg)nNHq&pxRF0r;fBf%xM!uI3- z{V8bEHf=&>tolYv0jF5 z$*~G8yq}9gJnR%@tavB8~$JLrb&g28Bp7L-WYe!yxQsj+YyxuK#B z{m)47;v*sci2z+EJtf_ycTm##z1S|OtSN=+Ls%`8LXKsD%uF1`ocgJ(3VW^yV5%Vm z3VIr02%3WnG8*mCC)B^v=z%X4oQykryB<9nWUw)aJ)T2B1X@A|k;s}wvH|dI01NZi z9`fG3dtLf`HA-A3t^pCSaG&nF0kP}K(|#7pH8Tw;EJG}(56x>dQ&NH8o)t0=R+v&# zk}xUE&|VK|Wxk3O5iGpF+KAfo{PfjZtg^V=DLor&Ya=o7DE8_Dqyq=#d_I*zsSB+* zm#(kT)Ko2`Bm`JCUXd07YszJvz9b#O&d#n1JRb6T`$`jI6Bw&Pq4lO~^DL=$pqI?S zref(a2kOBsBhyn|TVgyiL;Hu^aFTi#lDNbtvcLfTB?yL7Q?-0o=V}_I44Z#$@_^}Dg zDJvFoU$noj;?d)DA3k>Q%@FxO?rSeKnLQptt}lK>%q_@XMyt}$-qb}&Vw-uJmlHvR z?vOrfDwA(ghAZk&zHs3M6z>W6;o)I&%uszXO4A$z8)cNeT|U46K^Arto4j8sB;##s zIk9w=f?oGXsNlz=rC4y8rF@oO`B5@VF_T7SLeS3eo%Qb5g6evo|GKa2{D))3z*)65 zG~%JkqUUX23cZM8>SP9`Y}U7lXx~=UVzf!YCmEgj(5F4`51F0OG}P%D{Zk=Gf#4-k zDX10AP_xj_p}0w8z3`qXs#%#ev@cSGjNg~K(2|i=-eq6;0XyhXL5rR#8smWFl(G|# zX0eQcmZ0xCtv_5ysY!Mz%ElPt7IJ?>D`fUf}1!Fg)V3obbY&MpG`f%3tu|5jEh|*XCF4fJ^+SP0CzbS zy5!L3)r8M;5aFXG9xVp3O*|MVXvT8!%E^`2I!WftToZ%z!k7`7_h)>E*!!EIv#^ho zGYewDwEX-I9deaRoJepLY>{7sL2v>}ETdJ&sv_1*zfca#$)QuqDO3J?BK&cswa>(( z@lFM}1}~u0DMlmh1A7vxK~oUo|I%Jm{n<#O$MH69@yi6Y;A&gZ5e&MNu+d^Jl?VUi z9?i~j4zX2+75S5PP-RSBu#ggvR4T023#f!fNi_6@K`4v~g%%qZ2C{=+-4;Phi#`Mj z#RK0D^inozfT3Fed{E1;18>m}0Zg4i?Xla8Oj0#1tTmre{DT%%a(#XMqmE8j6RvNe zG;!%$?m#NKY-pH~o_;db92|QnJge!csjHKylqq6!^FTYWlQfuflYM0+T5Wwb<0{MO z2oQK@DX+E=-FbJ6@;3FdL^zK(9J!gi{t%7nY9BxL=K#HZKqRYe`${_@tVcUr7PLmu{qSHi4W*?V ze#=*}B|FEeU}V>$90C3Yagj4j>2_N{m6LKZzS~L7mCCc87AgLbf?E`lHZgoDqLKMX^m(lu_ zItK@*?Cdju34s6QW@v7aW7jQCn)(otAr76zD=}W9tmt>hYqZ%&nA%lF-qU&9f`VC< zK~>4sL!YwEM&B}Wih|fQ2ZA^X#-T7eU*JlF&qSdvf3W@3iE+DZ`a~2Qr9m=U)px=$Z z&w=~kRv}>)xH52?sUGZPGpM|)po9uO-lTf|{Ot^LXcTkv^EX^jQo^Hmvs2kSG&Y6ujH?cZh&;a2q&1rHY|0-sbNSEJih9Lh%$C_fIY84?1* zFIp3P$c0!6>cAX6--6PDg_+*&`e^B;((+Q6rlair%l94x28x1jm!qF&O=OmyNinkJ zTb%9pe@l8SvK06-JzZEXw&{I!H6FqSmo`<2h;?e#y7T6vW>VF92VCanmZ7cIfNoYo z*`fg|yI_KFideNKk-4`4(QWixTNzV@!cq$LETN(XxbQ7k|JK|p#ygoIvf zAktevLQ|xMCJ=hyzDwP+$JsOY%sFSDbN{*X8)xP>gq5|v?|a|peagChMpK1t4c8h3 zLD*DJozOuL<^Tj?>SkRD|3|vM{R{l-kn2e!S6xSI*GuP|tq_fKt{3ecUG448?{K$r zcCmAGkQ6y2B5`1ct*h%r7dcT;{BIu+adfs3-Kn|aBV1(l#Z$&E2*Q32{lk=`m}rL} z3fomr9M$uP9O>|N)oU(V{;I_+aMf0DhlHwFh>`Awqp?TUeTr?WG`(8)Bs;B{#f3Zm zL3YuNV=LaB^-QUByJ{qKGFKTdoG!HaLi6XMQjH*{(?WIu$Vp!Rv!3^#tUj;4GWK%m za2KD{s`aWn1WxhRERZN^0{uR7z&xAJ? z<7`q~`pVwnPQ|ZTz1nWD4^~!LtZZOvu<_3A+uF8ClI5>i1FFY^{TGjCW@ZX^tV57G z7C!&Q%+bQhnkNp*cXuE%Z}2%Cf`gw|Z{E1E{xuPHC1@in%VutFTv71hjZ81LVMP~| zPnyOM>l^Bvu4c?%lhJUgruL9b5TC*pO&J!akm#8srbHe7?k3z;)!ikr`#2)!~vV_4V~b?Ri-~ z3eoF%kJzT}6BRY|^2*<}YuDy&+mfrQ)T0i$l(qSHmomvuyyu_rIO3dVn!hkwAdRCO zXl`mUH8g?yY>Tu0rS!3o;r=~)R9yONnx{vo(q~JN-Fx=XzEnJ%xH%}^_5@NX4}^9>h14OjgLQJmhYqQH#x%<^slE>HcsybqvdiM5df?7}0+S}XZ=*h{+DJdxp1Zi9v{`k%H`sdHbPE1Z( z1!}9S2PSAlBn&nts)g(q66*cxk?lID^Zfa9yRKs2A!<$r*`Xul=+%{~A#2vGk@A|d z!KXqnD-?p^UXV z&!t}vgV`Tldug!d*zw-UIXzQT(=l<_GP0NIX-!S?5Idj3fs!uARHuTD39ljp4JW6} zUHtsS@ja>v(OS=*J=?!;U-FC-JC9ual`G6aoZ_+d_~hD;SvFf(S?pzD5y%M@Oyf<- zy7?DBT{*%Vj4vqfdC)bMF~eEX<=;Ht7TuCESRZ#2?_Yk8ruGC0APIA>OG!#PrK+k*=Y9C- z(S_8|_}8zGr79>Wm}_fmlL<;YVnRZGO%>d?Pj$<)eSN|~r&xh~{QSq|y{Gle z&7TU`eR#BwOZ@ybbDys#gSJU33mK%c17 zy7nnCEQ}M1;Z(?I(TsTzm-Oj}f*Lx0e#LMHkD{W8+1XOKmE$k1Dq%DC(8szgK7IPs zM#e{2*F+{aHR-txH6?4~p?BG45Vjz?y1Mj=J<+x`k%uN07^l_M^^P9BES>kcHPdnp zTancJgRsfM7R9Dn*3}J?wMXKvU1K4d7hxFl^en7(RoJtXl>Js#R>`rk$KKpzH-z6c z6$#bPvi~SyWn+W;^8UdZHn!$mryi)+ST(H_OBMO$#mRa9<+0@o&N%ZTuYHFPn?PF* z&PWwjikPZ>ZgDR+U3(RBG0mE|V!$RC@NGu7RZl3Lh`1PF;S|4q!STmQB<9X}`teQ5)Qi3Jl;*)kbn_|bU;L9$H(e-E~~ zEbFqRO?RzCq&EGb-`3qR!+D10wv!Gptw3@eSd`#K{|u<#$OQyE%uLvU9Q+loAYkTQ zCXU1~&a!N`?yw1DZ0gjO?4Z&4(Z==UIN95_SwmOWw&lvJSbYg#7Es zV09L`nZ!uR;ZNsqU`1lyiGN=Ycp&^Mwy-E_{1{vDqEo-VOaU7bK)H;tW}n|0YHc@Y z0PDal0*~>316irVh=}pa6HZP}(BGluw84?nrx_A4&lP;<-}gEv`!6qHavY-YCF061 zeO217uGw;zMh`^SCSF~|-iG~9S^4_ zcO8s<`}Tye3AxIhPc2kL|J12lBYn=9$3)=lF2mV1OgBxAjND!wb=Z)a11p}VTK9owTB`NBaZm=~{k2^l$NI*OsKL~Nsv1&SvmuktQ3XX8C$ba$)h6MHe+*{?k?y(H%lEz1HQl=swgI~ML7{LI=7rLV88 zUEh?Lp|oR14wd-f!|9VJPDsu9Arag!23%a;>Wk+12MGag5v_t1HJW)?Cq77LRYX?d@y7b9b>nQ?F-N_S5&W18BQ@0Kd48EK2B zbrj@udi1ar!9?LjBj!NUm4+q-uv+-4-)DN*_!nj-DjR~t5bb8N0%Yx5V_?sQ=q(m4 zzB3&*c&*c?b(EEFz?w^+f6H1lS#vnQ=icF|q0|f+4+~FEPv?RTim;5#wDpl+02H}X zDwtk)&x{V$J-hnh!v}k6<%bWOw`|cL69-fhN9c0nh$fAG`4B420==7Zf-6mIa%A? zo!rpSkhZOqTgJYwrDVxXBV6KSPgziw0yifIhqVTa=k!M#Y1e@>9WJ%<@RW6HMGIr% zRDy>9s_ZpGp|NIrRj&zvp=|!kLoF$rn(cE8zukg@DKRmngttz^t>V{jm~&m&E@L0| zMARbPILmr4+~%qFv13;ZGR%p7jCo^eN$Vi{}y)mKR-M#4!G(8=@S@`7DTA_H>BC!muRzV16YQW(DrerI%Nb zp!Lv4s5ytsU~}t+q;Wh-iIzM&rA$T${-GI}Ew5>a%q=&BDSK0)zpM+(2Bl5elmLLd zK=+b$z&ViN?+ozG?z1slZdID$7=CZv9v?#x2jnMA_-lBP5GxIGpOf_+r`sU`2DhN8 zGpm>e=eTYHa`1Zh*}p)g-xz0r^6g5qRDdy*0+q7;1S>B#NChb8WgEHi7k9)@Q_su_ zZbob$b29xa@*u1};eC0czP#(<9zr&o<_oevl)}SE& zb7Z)9EobggY{^*Y*!(X@w);;&PT)a84;aVh<{pG07D@;I@nvrcJ=K7y6RqI;#W}C3 z#NQw0+!}HhXWSu|zP)mCn5e^-p49d?zPh>!FAWFbw3e3Pi4)gg%6=Rko(#jR(Soc) zds3!l`F{8?%1eMHJP|f=@4z!TJmOC;Cvqc*FwvOlV(*8?AE4;k^IS;23+`;3VoHEP za-I_xis%utjuhzX=oNVmyYJn-`{cfT``U`UbM&*$zG4=}WS@c>f>~ZWRKyI0yP+X$ zs-V2QnfLUt_PKM=O|&xNsqU%aTAv|KvU> z<=wk?vypRNzSIFCi*q$Wq|QEFXkbI?1f@N21LU$L61F36 zUcZ*Q*sTPF#h7~K6^bs89zD_<69?!3*0}$`f$X84o*wwIRqARMW;j%t*pQGAv>!G! z=%iZ1kiTZ-RhaB3WaxF+sxWb{rMZ5*+2|ChKJv+x^3IGp^sUK6B82xs=5j4^|veX{24TYgw-8DKpWq5(E|sn2&~RTG71)ke+d?*|7EaH5@~rZYGg*X z4}Y1JCGGs>)b$%Tu8{mnvoqEcYb6{&??rV~TteGz@etPwOJN-LtC4PJKmgfm z!ozv#I;@DT6L5t8f?{}avf9O>kO{%C{0Hh|f~A@)qO{=lmOg9cuTM4t!RhCA3cRSD zb+TRVGj>oJaPQ!cUdtb#2604d~cO9>OwCh+%g@F&y&;JR4UmuHM{A$18qSP-lq+>f0*V*2vJ?a!Y-L(l(0 z_aa$UK1royU`VHZ=cgW2_UbGzF-Q&_a#TOdz`m;RxPbv%x6yWE&{S5j^JX_c3Jn#4 z?z?g0#yf$5dLUK-k+vMkNKdD1(mL`CbhA`oGpAKmlN;|r4eb{Yh_9(0n~^P&gzs(( z_+OL2manhf+LY&F!x&Iegkim4$mQV0?f}imgXcQDrUvRGMNmC}{$(KxHDO$Np@ z7`gT)Z+1?jOj)_r%NsjWh zr+mw%O_ttOd!Bk6gBFA-@*?3Epmyo+`GW^QOwzq@;ljhG{yR3@r;Zo^rvQ18;L2xv zwJ*;k{}+5?;fG4UlGd9}&6W7wDt*Cu;lj+_XJDeTWElroMFpCm7f_KvXOeSsb2}|j zya;>`@}dd-COh8~XzR_n9S(r|sQ@BI4<0-)n0+V!+_bLl42;*NGn1!43jr3oG}5)C z!RIsnN*`DIR6bQ{$Jqi{t88fv^Ob!+t7Y}D+cf#Iv6&VVi-o)bR58n&kih@Y%V_h9 z=5RS^T+%RS15_B4%r|FDkurQW0GYhTU#+6a3xam0xbU%-i@}MAz!ZjK)JVu7buYIU ztUo)}S=3x`$&og8?#+$CxL}0_HPNE@<)yLZ^qH`5NgI$+%Tesv3)Dr;Q3%5%vcQbA zJrJ~D9_=hDkaHb~0l|zqjjCoRPd0n2>*+P=({TRgseK<*1^a8G4PnT?8ca1heq&wz zv*S0p+WG#$6}~YkXJp;lwT&>{>g(xUz^`3-b^reTK&o|$$^~}s{y4Nd`NfO6l;GfC zLp{AmM8OTLN%8S-Q&fR!ojiFRaGOY=(^`Z$*L|STW$1&aLfl8&lLrO{tUFf0AcAX2 zQ!D+SL=Pj}T!;5q5tlUfk)Q@49;O&jq4$FF1TzbHTPe`HW>j7^H&1U&)WY@GM1_cG z&fkxRlGzXP-%Q7)Xb_j_sTPdWw3dt(xKaz$%S9fPLiv?AD~loBm5pgg7*KjGg}DnyzHOkJ+5$ZuYRQP!m$WQf2a^^| zZE8>oTnaw9@Vj4}&E}hC|CEo|#|*)I3~008mDGTmd$e7 zo$rp8Ec+ELFD-a|d7wgQ+ztJPXr4u3a+RZOblxC%*=O)`N@&*l9RU$nW*lKo2Jh*= zJ#PPdY!1|~L3XGDXHlD6nkz5-@Wg%%lI{H)pdc6`fPovCCtNY%7Ys8pvi1)`97+?$ zw<#e+%Ep!+${4f=lNY;@x?=EUvgJq*74PL@a(5zinog_Hr~cV-Q&_^C>5lmEN%km1O-2-mNkkDW3u>y&S`cD~n)$0S)o*d9NHH`$R6l4^# z{YU5KdHqy_WUXigP|}9FN=hh16C0{yV148vm(4sp#G0tXmHm^0;7yPT6BEwQ6BA+d zItD%KLseB16n`3{xw+Zv^X)w-XK@>D)dtEyCtCq|Mf=JYsATWaJhUO>b@&k5og|#h zO9y_$H1z)!{G{dxLl35eiCa!Vv$utcBgna>JoTASWqe}yxBWrzcb0KBHeD?;&sfRM zoA&PRR<#hAVb5DyN&`>o?dzi?YiVde(L4sqV~PK_=xCYpeJE<*xw8f|?lv-GFfp3a zM#AAgNrD6ig}Hz4UfZTgb{1w3iBi(i^iG^O5qIw>_jql6eC|*$MX;EV_Bh;dt~Po! zpNe#I{oc93a-Unv#`YL=GSEwl$~S|ww(Wu1-}G(lTo*Ea_zIS~>_^;&9*LOd?g%co zq>h5!1Tw2v@K+GfC<_cfoc{;z4~8CGhY?#lEBED})Z~f7uTUCpxCz#?V7WCvJH84;tB>T+$B*~z z-=ETH85w>LHn6$Khw9mwC7&`e&x-wvew`|^Q^ib#?&*6l+I<>2T zZ*H(PPV`oyuB!ZGl_dB>bwkam%^4Posn&2|U|%{022TK}rF>>D!tcKC&383(`1sQ5 zLro3k{R93jTwE!@N$l!lPm;+&z|%p-CN24OUtT3(W@?McKiHP*K7wJ)mMc<3{pZv= zJo}?yV)1+a<;#~o*VO>rsV!-4NYp*IYi&34qnQeG`}k-G`Ft95&}|;e)*NE+AU#sF zU&ZRo#a_3No9?wqSaKtT8{c`rIq*A>xGV6icYY!Up#e-TjuzP%7XE zEg(OS0L)$gomhpjFsmd>a&I2#1WXd{U_or%ev-{DuI8*6uXX#By9nCMw@147<3>c7 z;>=RbR@_r7K@iiwev)&)vbJS-ItcnB$QkzE7*c6HlpCh<7p4H+pHd|M10ZBCUEn^_ zaGYIU00IN8twzE|FG|V&gALC?9nS196|n|!GhjO7e@p#p<6~u+8i)%{G0ZRrHqeYJ z$expZgQOPotUo$8F{H3>NRH6gh?j*W@D9_xq&>#Z3Y!-ig@C=Vg_}FI;^7`4S=k&- zUn~|1D+OdUE*$mWA&Ui?d-iT&OeHElhN02OC`@3VtgKn~?ry|^8(dEA==u5{c#wBs z*H{T^*5ke*61fDp@DPOn^i(Muz_` z@yYvfKk2ApEYs^F^97ca!vwjV@28VdQW zSW;~4E+B9~sdRKgz$ja@b}ey!cGd%a{1FS04)Af(2w>v?aZ1Y0Zb~sO@hgHk2KCRf z>>34uiL~-2UK;BhfUaJIalzE-p$Pe1U=H)j2Sg+Xc;BxvRyv9 z;0iXf`_CQ+IJ5iw_I5}-7&g_BhZ<9&K?VZ`@l9j{{emFt_!Je{KrU0&0T(qvGb*M3 zski3xq~dZMyW-**SXeX!b^7!jfx%AivF0T0I4QdZ0g%K`0`K%$eF*!{B3mnmo%x^Za9tzrw4#~LMqMrW=a*NkN&&7%khHmnCzjSKET}_n zA_S@q)NyH$N%4?4@?Dt5|HEIxtg0I{Qb}@4E?V?{OZQlt!-B7nZedC@Gjuk$YMfqS z>js+L_&3ci5laCCu%(FvaY|lUReFduz?QEs&+V<-hy;vL-@u{#H*i2X2MAxtDZ1ZX z^{Z-cOnYW&ht?w)WI zO!3O+Zajv4HkI%WWv(;?p} z)%M%SErWd`mxLVyZL_d%qFkexGTf!^KTtv}B!C;XpKV!8xbNw(bah3{N%7Sz2qqke z99jDWl3Nd87!Yx-mce8z`~w%2k^0XfnzOmH;mI&u3%7HDV5Z2t1M?W?=fQgsp>@4F zBF@iQ8hQm-88};S0OQ*Q0xzzx6-IB1&^#l3%amhfo%$c2PZpjpD>v{LLJS@|t?f!?Ki?6Y8fslFZ# zQ^A#y*O6PIwN{%Huq8b+w^E;Tff|n8h&btvdn!V=U9Wd}QtynqG8)`whzwH8lZdPBaUFYDE9AGQZ7n zV453Lr<)Z_HR)>Efh>pm-%`M-s>8&4^4l8v7%nWC?##->)MDG^$*`4sa7~h#J?G`4 zzpgmb5`+mO{E~i|JM}jh*M{H`G&2qn)1)t7F7O<@s08MHlI}kO7|@yL=UYnBdn-eQ zK*WcfhGB^xLqPRM3S+7-!Vwi&fRPwLh;MqdLnxGXe!r@gRtwDMdPYV`1Ok^v$Aq&zBGdl?= z+`kxN*LVwW2q}*fxDZjpt|T){Kjq%MgGlVQ5NOizZ|0OqA zpHoa1hBOH6(@j3|Ym1SdBWQ|iIIFgagloZ(pDVy1&&fnqwKV_8!o#~&87cmFeA`IA*VC>o5}ot%7s;RSY&

eu!|!H0kxebRP}-p-IOo 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 literal 0 HcmV?d00001 diff --git a/openphi_prog_lengths_filtered.png b/openphi_prog_lengths_filtered.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e832a6a264e472e51b20041215d63705dbe59a GIT binary patch literal 13999 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