From ceaa47a2aa86ac476400683f3d78519f1ea79d5a Mon Sep 17 00:00:00 2001 From: Ahmed BOUDJELIDA Date: Thu, 12 Dec 2024 10:17:25 +0100 Subject: [PATCH] contrib/firmware/angie: add new spartan6 VHDL code This new code implement two FIFOs for handling TX and RX JTAG data transfers, its simply receives data and send it OUT to target chip in respect of JTAG protocol timing constraints. The IN FIFO receives data from target chip and send it back to openocd. Change-Id: I17c1231e7f4b0a6b510359fe147b609922e0809e Signed-off-by: Ahmed BOUDJELIDA Reviewed-on: https://review.openocd.org/c/openocd/+/8715 Tested-by: jenkins Reviewed-by: Antonio Borneo --- .../angie/hdl/src/angie_bitstream.ucf | 94 ++-- .../angie/hdl/src/angie_bitstream.vhd | 473 +++++++++++++++--- contrib/firmware/angie/hdl/src/clk_div.vhd | 33 ++ contrib/firmware/angie/hdl/src/dff.vhd | 23 + src/jtag/drivers/angie/angie_bitstream.bit | Bin 340704 -> 340721 bytes 5 files changed, 514 insertions(+), 109 deletions(-) create mode 100644 contrib/firmware/angie/hdl/src/clk_div.vhd create mode 100644 contrib/firmware/angie/hdl/src/dff.vhd diff --git a/contrib/firmware/angie/hdl/src/angie_bitstream.ucf b/contrib/firmware/angie/hdl/src/angie_bitstream.ucf index 9eb0c85c3..48c5b9407 100644 --- a/contrib/firmware/angie/hdl/src/angie_bitstream.ucf +++ b/contrib/firmware/angie/hdl/src/angie_bitstream.ucf @@ -1,8 +1,8 @@ ## SPDX-License-Identifier: BSD-3-Clause ##-------------------------------------------------------------------------- -## Project Context: nanoXplore USB-JTAG Adapter Board, Spartan6 -## Design Name: NJTAG USB-JTAG Adapter FPGA source code -## Module Name: _angie_openocd.ucf +## Project Context: nanoXplore USB to JTAG/I2C Adapter Board, Spartan6 +## Design Name: ANGIE USB to JTAG/I2C Adapter FPGA source code +## Module Name: angie_bitstream.ucf ## Target Device: XC6SLX9-2 TQ144 ## Tool versions: ISE Webpack 13.2 -> 14.2 ## Author: Ahmed BOUDJELIDA nanoXplore SAS @@ -10,41 +10,65 @@ # WARNING: PullUps on JTAG inputs should be enabled after configuration # (bitgen option) since the pins are not connected. -net TRST LOC = 'P48' ; -net TMS LOC = 'P43' ; -net TCK LOC = 'P44' ; -net TDI LOC = 'P45' ; -net TDO LOC = 'P46' ; -net SRST LOC = 'P61' ; +CONFIG VCCAUX = "3.3"; -net SDA LOC = 'P50' ; -net SCL LOC = 'P51' ; -net SDA_DIR LOC = 'P56' ; -net SCL_DIR LOC = 'P57' ; +# Timing +# net IH24 period = 40; # Constrain at 25MHz +# net IH40 period = 25; # Constrain at 40MHz +# DCMs placement on Spartan6 +# INST S6MOD_CKMUL.H48_DCM LOC = DCM0; -net SI_TDO LOC = 'P16' ; -net SO_TRST LOC = 'P32' ; -net SO_TMS LOC = 'P27' ; -net SO_TCK LOC = 'P30' ; -net SO_TDI LOC = 'P26' ; -net SO_SRST LOC = 'P12' ; +# Clock 48MHz +net IFCLK_I LOC = 'P123' ; -net SO_SDA_OUT LOC = 'P140' ; -net SO_SDA_IN LOC = 'P1' ; -net SO_SCL LOC = 'P137'; +net GD_IO<0> LOC = 'P48' ; +net GD_IO<1> LOC = 'P43' ; +net GD_IO<2> LOC = 'P44' ; +net GD_IO<3> LOC = 'P45' ; +net GD_IO<4> LOC = 'P46' ; +net GD_IO<5> LOC = 'P61' ; +net GD_IO<6> LOC = 'P62' ; +net GD_IO<7> LOC = 'P65' ; -net ST_0 LOC = 'P29' ; -net ST_1 LOC = 'P21' ; -net ST_2 LOC = 'P11' ; +net PA2_I LOC = 'P47' ; +#net PA3_I LOC = 'P64' ; +net JPW_I LOC = 'P14' ; -net ST_4 LOC = 'P134' ; -net ST_5 LOC = 'P139' ; +net GCTL0_I LOC = 'P70' ; +#net GCTL1_I LOC = 'P55' ; +#net GCTL2_I LOC = 'P67' ; +net GRDY1_I LOC = 'P118' ; -net FTP<0> LOC = 'P121' ; -net FTP<1> LOC = 'P120' ; -net FTP<2> LOC = 'P119' ; -net FTP<3> LOC = 'P116' ; -net FTP<4> LOC = 'P111' ; -net FTP<5> LOC = 'P112' ; -net FTP<6> LOC = 'P115' ; -net FTP<7> LOC = 'P114' ; +#net SDA_IO LOC = 'P50' ; +net SDA_IO LOC = 'P64' ; #PA3 +#net SCL_I LOC = 'P51' ; +net SCL_I LOC = 'P39' ; #PA4 switch +net SDA_DIR_I LOC = 'P66' ; #PA0 switch +#net SCL_DIR_I LOC = 'P57' ; + +net SO_SDA_OUT_O LOC = 'P140' ; +net SO_SDA_IN_I LOC = 'P1' ; +net SO_SCL_O LOC = 'P137' ; + +net SO_TRST_O LOC = 'P32' ; +net SO_TMS_O LOC = 'P27' ; +net SO_TCK_O LOC = 'P30' ; +net SO_TDI_O LOC = 'P26' ; +net SO_SRST_O LOC = 'P12' ; +net SI_TDO_I LOC = 'P16' ; + +net ST_0_O LOC = 'P29' ; +net ST_1_O LOC = 'P21' ; +net ST_2_O LOC = 'P11' ; +net ST_3_O LOC = 'P7' ; +net ST_4_O LOC = 'P134' ; +net ST_5_O LOC = 'P139' ; + +net FTP_O<0> LOC = 'P121' ; +net FTP_O<1> LOC = 'P120' ; +net FTP_O<2> LOC = 'P119' ; +net FTP_O<3> LOC = 'P116' ; +net FTP_O<4> LOC = 'P111' ; +net FTP_O<5> LOC = 'P112' ; +net FTP_O<6> LOC = 'P115' ; +net FTP_O<7> LOC = 'P114' ; diff --git a/contrib/firmware/angie/hdl/src/angie_bitstream.vhd b/contrib/firmware/angie/hdl/src/angie_bitstream.vhd index 6004bf2ff..a1b86862d 100644 --- a/contrib/firmware/angie/hdl/src/angie_bitstream.vhd +++ b/contrib/firmware/angie/hdl/src/angie_bitstream.vhd @@ -1,103 +1,428 @@ -- SPDX-License-Identifier: BSD-3-Clause ---------------------------------------------------------------------------- --- Project Context: nanoXplore USB-JTAG Adapter Board, Spartan6 --- Design Name: NJTAG USB-JTAG Adapter FPGA source code --- Module Name: _angie_openocd.vhd +-- Project Context: nanoXplore USB to JTAG/I2C Adapter Board, Spartan6 +-- Design Name: ANGIE USB to JTAG/I2C Adapter FPGA source code +-- Module Name: angie_bitstream.vhd -- Target Device: XC6SLX9-2 TQ144 -- Tool versions: ISE Webpack 13.2 -> 14.2 -- Author: Ahmed BOUDJELIDA nanoXplore SAS ---------------------------------------------------------------------------- - +library work; +use work.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; -library UNISIM; -use UNISIM.VComponents.all; -entity S609 is port( - TRST : in std_logic; - TMS : in std_logic; - TCK : in std_logic; - TDI : in std_logic; - TDO : out std_logic; - SRST : in std_logic; +entity angie_bitstream is port( + SDA_IO : inout std_logic; + SDA_DIR_I : in std_logic; + SCL_I : in std_logic; - SDA : inout std_logic; - SDA_DIR : in std_logic; - SCL : in std_logic; - SCL_DIR : in std_logic; + JPW_I : in std_logic; --Devkit power - FTP : out std_logic_vector(7 downto 0); -- Test points - SI_TDO : in std_logic; - ST_0 : out std_logic; - ST_1 : out std_logic; - ST_2 : out std_logic; + SO_SDA_OUT_O : out std_logic; + SO_SDA_IN_I : in std_logic; + SO_SCL_O : out std_logic; - ST_4 : out std_logic; - ST_5 : out std_logic; + ST_0_O : out std_logic; + ST_1_O : out std_logic; + ST_2_O : out std_logic; + ST_3_O : out std_logic; + ST_4_O : out std_logic; + ST_5_O : out std_logic; - SO_SDA_OUT : out std_logic; - SO_SDA_IN : in std_logic; - SO_SCL : out std_logic; + SO_TRST_O : out std_logic; + SO_TMS_O : out std_logic; + SO_TCK_O : out std_logic; + SO_TDI_O : out std_logic; + SO_SRST_O : out std_logic; + SI_TDO_I : in std_logic; - SO_TRST : out std_logic; - SO_TMS : out std_logic; - SO_TCK : out std_logic; - SO_TDI : out std_logic; - SO_SRST : out std_logic + PA2_I : in std_logic; -- GPIF IN + + -- Clock 48MHz + IFCLK_I : in std_logic; + + GCTL0_I : in std_logic; + GRDY1_I : out std_logic; + GD_IO : inout std_logic_vector(7 downto 0); + FTP_O : out std_logic_vector(15 downto 0) ); -end S609; +end angie_bitstream; + +architecture A_angie_bitstream of angie_bitstream is +----------------------------------------Fifo out (PC to devkit) +signal rst_o, clk_wr_o, clk_rd_o : std_logic; +signal write_en_o, read_en_o : std_logic; +signal data_in_o, data_out_o : std_logic_vector(7 downto 0); +signal empty_o, full_o : std_logic; + +----------------------------------------Fifo in (devkit to PC) +signal rst_i, clk_wr_i, clk_rd_i : std_logic; +signal write_en_i, read_en_i : std_logic; +signal data_in_i, data_out_i : std_logic_vector(7 downto 0); +signal empty_i, full_i : std_logic; + +signal wr_o, rd_i : std_logic; + +----------------------------------------MAE +signal transit1, transit2 : std_logic; + +----------------------------------------DFF +signal pa2_dff_clk, pa2_dff_rst, pa2_dff_d, pa2_dff_q : std_logic; +signal trst_clk, trst_rst, trst_d, trst_q : std_logic; +signal tms_clk, tms_rst, tms_d, tms_q : std_logic; +signal tdi_clk, tdi_rst, tdi_d, tdi_q : std_logic; +signal tdo_clk, tdo_rst, tdo_d, tdo_q : std_logic; +signal srst_clk, srst_rst, srst_d, srst_q : std_logic; + +----------------------------------------clk_div +signal clk_div_in, clk_div_out, reset_clk_div : std_logic; +signal clk_div2_in, clk_div2_out, reset_clk_div2 : std_logic; + +----------------------------------------MAE +type State_Type is (IDLE, WRITE_OUT, WRITE_IN, DELAY, READ_IN); +signal state, state2 : State_Type; +signal reset_mae, reset_mae2 : std_logic; + +-- Add Component DFF +component DFF + Port ( + clk : in std_logic; + reset : in std_logic; + d : in std_logic; + q : out std_logic + ); +end component; + +-- Add Component Clk_div +component clk_div +Port ( + clk_in : in std_logic; + reset : in std_logic; + clk_out : out std_logic +); +end component; + +-- Add component FIFO 64B +component fifo_generator_v9_3 +PORT ( + rst : IN STD_LOGIC; + wr_clk : IN STD_LOGIC; + rd_clk : IN STD_LOGIC; + din : IN STD_LOGIC_VECTOR(7 DOWNTO 0); + wr_en : IN STD_LOGIC; + rd_en : IN STD_LOGIC; + dout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); + full : OUT STD_LOGIC; + empty : OUT STD_LOGIC + ); +end component; + +signal state1_debug, state2_debug : std_logic; -architecture A_S609 of S609 is begin +-------------------------------------------------------------I2C : +SDA_IO <= not(SO_SDA_IN_I) when (SDA_DIR_I = '1') else 'Z'; +SO_SDA_OUT_O <= SDA_IO; +ST_5_O <= SDA_DIR_I; ---Directions: -ST_0 <= '0'; -ST_1 <= '1'; +SO_SCL_O <= SCL_I when (JPW_I = '1') else '0'; +ST_4_O <= '0'; ---TDO: -TDO <= not SI_TDO; +------------------------------------------------------------JTAG : +-- Instantiate the Clk div by 10 +clk_div_inst : clk_div +port map ( + clk_in => clk_div_in, + reset => reset_clk_div, + clk_out => clk_div_out +); +-- Instantiate the Clk div by 10 +clk_div2_inst : clk_div +port map ( + clk_in => clk_div2_in, + reset => reset_clk_div2, + clk_out => clk_div2_out +); ---TRST - TCK - TMS - TDI: -SO_TRST <= TRST; -SO_TMS <= TMS; -SO_TCK <= TCK; -SO_TDI <= TDI; -ST_2 <= SRST; -SO_SRST <= '0'; +-- Instantiate DFFs +DFF_inst_PA2 : DFF +port map ( + clk => pa2_dff_clk, + reset => pa2_dff_rst, + d => pa2_dff_d, + q => pa2_dff_q +); -SO_SCL <= SCL; +DFF_inst_TRST : DFF +port map ( + clk => trst_clk, + reset => trst_rst, + d => trst_d, + q => trst_q +); -SDA <= not(SO_SDA_IN) when (SDA_DIR = '1') else 'Z'; -SO_SDA_OUT <= SDA; +DFF_inst_TMS : DFF +port map ( + clk => tms_clk, + reset => tms_rst, + d => tms_d, + q => tms_q +); -process(SDA_DIR) -begin - if(SDA_DIR = '0') then - ST_5 <= '0'; - else - ST_5 <= '1'; - end if; -end process; +DFF_inst_TDI : DFF +port map ( + clk => tdi_clk, + reset => tdi_rst, + d => tdi_d, + q => tdi_q +); -process(SCL_DIR) -begin - if(SCL_DIR = '0') then - ST_4 <= '0'; - else - ST_4 <= '1'; - end if; -end process; +DFF_inst_TDO : DFF +port map ( + clk => tdo_clk, + reset => tdo_rst, + d => tdo_d, + q => tdo_q +); + +DFF_inst_SRST : DFF +port map ( + clk => srst_clk, + reset => srst_rst, + d => srst_d, + q => srst_q +); + +-- Instantiate the FIFO OUT +U0 : fifo_generator_v9_3 +port map ( + rst => rst_o, + wr_clk => clk_wr_o, + rd_clk => clk_rd_o, + din => data_in_o, + wr_en => write_en_o, + rd_en => read_en_o, + dout => data_out_o, + full => full_o, + empty => empty_o +); +-- Instantiate the FIFO IN +U1 : fifo_generator_v9_3 +port map ( + rst => rst_i, + wr_clk => clk_wr_i, + rd_clk => clk_rd_i, + din => data_in_i, + wr_en => write_en_i, + rd_en => read_en_i, + dout => data_out_i, + full => full_i, + empty => empty_i +); + +--------------- clock dividers +clk_div_in <= IFCLK_I; -- 48Mhz +clk_div2_in <= clk_div_out; -- 24Mhz + +--------------- DFFs +pa2_dff_clk <= IFCLK_I; +trst_clk <= IFCLK_I; +tms_clk <= IFCLK_I; +tdi_clk <= IFCLK_I; +tdo_clk <= IFCLK_I; +srst_clk <= IFCLK_I; + +--------------- FIFOs +clk_wr_o <= IFCLK_I; +clk_rd_o <= clk_div2_out; +clk_wr_i <= clk_div2_out; +clk_rd_i <= IFCLK_I; + +--------------------------- GPIF ready : +GRDY1_I <= '1'; + +-------------------------------PA2 DFF : +pa2_dff_rst <= '0'; +pa2_dff_d <= PA2_I; + +-------------------- FX2<->Fifo Enable pins : +write_en_o <= not(wr_o) and not(GCTL0_I); +read_en_i <= not(rd_i) and not(GCTL0_I); + +---------------- FX2->Fifo Data : +data_in_o <= GD_IO; + +------------ FIFO_OUT->Devkit : +SO_TRST_O <= trst_q; +trst_d <= data_out_o(4); +SO_TMS_O <= tms_q; +tms_d <= data_out_o(3); +SO_TDI_O <= tdi_q; +tdi_d <= data_out_o(1); +------------ +SO_TCK_O <= data_out_o(0); + +-------------------- FIFO_OUT->FIFO_IN : +--data_in_i <= data_out_o; + +-------------------- FIFO_IN<-Devkit : +data_in_i(0) <= '0'; +data_in_i(1) <= '0'; +data_in_i(2) <= tdo_q; +tdo_d <= not SI_TDO_I; +data_in_i(3) <= '0'; +data_in_i(4) <= '0'; +data_in_i(5) <= '0'; +data_in_i(6) <= '0'; +data_in_i(7) <= '0'; + +-------------------- FX2<-FIFO_IN : +GD_IO <= data_out_i when (state = READ_IN) else "ZZZZZZZZ"; + +state1_debug <= '1' when state = READ_IN else '0'; +state2_debug <= '1' when state2 = WRITE_IN else '0'; --Points de test: -FTP(0) <= SDA; -FTP(1) <= SCL; -FTP(2) <= not(SO_SDA_IN); -FTP(3) <= SDA_DIR; -FTP(5) <= SRST; -FTP(4) <= SI_TDO; -FTP(6) <= '1'; -FTP(7) <= '1'; +FTP_O(0) <= IFCLK_I; +FTP_O(1) <= GCTL0_I; +FTP_O(2) <= GD_IO(0); +FTP_O(3) <= GD_IO(1); +FTP_O(4) <= JPW_I; +FTP_O(5) <= PA2_I; +FTP_O(6) <= empty_o; +FTP_O(7) <= not SI_TDO_I; -end A_S609; +process(pa2_dff_d, pa2_dff_q) +begin + if pa2_dff_d = '0' and pa2_dff_q = '1' then + reset_mae <= '1'; -- Reset State Machine + reset_mae2 <= '1'; -- Reset State Machine + rst_o <= '1'; -- Reset OUT + rst_i <= '1'; -- Reset IN + reset_clk_div <= '1'; + reset_clk_div2 <= '1'; + trst_rst <= '1'; + tms_rst <= '1'; + tdi_rst <= '1'; + tdo_rst <= '1'; + srst_rst <= '1'; + else + reset_mae <= '0'; -- No Reset State Machine + reset_mae2 <= '0'; -- Reset State Machine + rst_o <= '0'; -- No Reset OUT + rst_i <= '0'; -- No Reset IN + reset_clk_div <= '0'; + reset_clk_div2 <= '0'; + trst_rst <= '0'; + tms_rst <= '0'; + tdi_rst <= '0'; + tdo_rst <= '0'; + srst_rst <= '0'; + end if; +end process; + +process(clk_div2_out, reset_mae2) +begin + if reset_mae2 = '1' then + state2 <= IDLE; + elsif rising_edge(clk_div2_out) then + case state2 is + when IDLE => + read_en_o <= '0'; -- Disable read OUT + write_en_i <= '0'; -- Disable write IN + transit2 <= '1'; + if transit1 = '0' and PA2_I = '0' then + state2 <= WRITE_IN; + else + state2 <= IDLE; + end if; + + when WRITE_IN => + read_en_o <= '1'; -- Enable read OUT + write_en_i <= '1'; -- Enable write IN + if PA2_I = '1' then + state2 <= DELAY; -- Change state to DELAY + else + state2 <= WRITE_IN; -- Stay in WRITE_IN state + end if; + + when DELAY => + transit2 <= '0'; -- Enable READ IN + if empty_o = '1' then + read_en_o <= '0'; -- Disable read OUT + write_en_i <= '0'; -- Disable write IN + state2 <= IDLE; -- Change state to IDLE + else + state2 <= DELAY; -- Stay in READ_IN state + end if; + + when others => + state2 <= IDLE; + end case; + end if; +end process; + +process(IFCLK_I, reset_mae) +begin + if reset_mae = '1' then + state <= IDLE; + elsif rising_edge(IFCLK_I) then + case state is + when IDLE => + wr_o <= '1'; -- Disable write OUT + rd_i <= '1'; -- Disable read IN + transit1 <= '1'; + if PA2_I = '0' then + state <= WRITE_OUT; -- Change state to RESET + else + state <= IDLE; -- Stay in IDLE state + end if; + + when WRITE_OUT => + wr_o <= '0'; -- Enable write OUT + if empty_o = '0' then + transit1 <= '0'; -- Enable Rd OUT & Wr IN + state <= DELAY; -- Change state to DELAY + else + state <= WRITE_OUT; -- Stay in WRITE_OUT state + end if; + + when DELAY => + if transit2 = '0' then + wr_o <= '1'; -- Disable write OUT + state <= READ_IN; + else + state <= DELAY; + end if; + + when READ_IN => + rd_i <= '0'; -- Enable read IN + if empty_i = '1' then + rd_i <= '1'; -- Enable read IN + state <= IDLE; -- Change state to IDLE + else + state <= READ_IN; -- Stay in READ_IN state + end if; + + when others => + state <= IDLE; + end case; + end if; +end process; + +-- OUT signals direction +-- TRST, TMS, TCK and TDI : out +ST_0_O <= '0'; +-- TDO : in +ST_1_O <= '1'; +-- SRST : out +ST_2_O <= srst_q; +srst_d <= data_out_o(6); +SO_SRST_O <= '0'; +-- MOD : in +ST_3_O <= '1'; + +end A_angie_bitstream; diff --git a/contrib/firmware/angie/hdl/src/clk_div.vhd b/contrib/firmware/angie/hdl/src/clk_div.vhd new file mode 100644 index 000000000..e69850d57 --- /dev/null +++ b/contrib/firmware/angie/hdl/src/clk_div.vhd @@ -0,0 +1,33 @@ +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +entity clk_div is + Port ( + clk_in : in std_logic; + reset : in std_logic; + clk_out : out std_logic + ); +end clk_div; + +architecture behavioral of clk_div is + -- Division factor N = 4, so we need a 2-bit counter (2^2 = 4) +-- signal counter : unsigned(1 downto 0) := (others => '0'); + signal tmp : std_logic; +begin + process(clk_in, reset) + begin + if reset = '1' then +-- counter <= (others => '0'); + tmp <= '0'; + elsif rising_edge(clk_in) then +-- if counter = (2**2 - 1) then +-- counter <= (others => '0'); + tmp <= NOT tmp; -- Toggle the output clock +-- else +-- counter <= counter + 1; +-- end if; + end if; + end process; + clk_out <= tmp; +end behavioral; \ No newline at end of file diff --git a/contrib/firmware/angie/hdl/src/dff.vhd b/contrib/firmware/angie/hdl/src/dff.vhd new file mode 100644 index 000000000..c5ccf06d3 --- /dev/null +++ b/contrib/firmware/angie/hdl/src/dff.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_arith.ALL; +use ieee.std_logic_unsigned.ALL; + +entity DFF is +port ( clk : in std_logic; + reset : in std_logic; + d : in std_logic; + q : out std_logic); +end DFF; + +architecture Behavioral of DFF is +begin + process(clk, reset) + begin + if reset = '1' then + q <= '1'; -- Reset output to 0 + elsif rising_edge(clk) then + q <= d; -- Capture D at the rising edge of the clock + end if; + end process; +end Behavioral; \ No newline at end of file diff --git a/src/jtag/drivers/angie/angie_bitstream.bit b/src/jtag/drivers/angie/angie_bitstream.bit index 7b3a88f7c8739accf2dc2512a6eab0480ccbda27..fb1c73497cab3ade4327f613c94a18d23eee6520 100644 GIT binary patch literal 340721 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 literal 340704 zcmeI*L5~|}835qVn_aa_i<%sP173tcT&TUfikd&iBi6)00ILt;! z|N_!+hc!Y&*Nw_O4q4dhq$DpFRA|N1r`@^!SU15B~7e&p-a;XCFR#_{Fb&@j>s)UrrwBqxAOO zN5B8_-s3-h+CM!_AE&pDd&ej5_WSQ1-%FpQ!~W^}r+44)-AxbE!SSDlGmn4#?Ze;o zo~JjussH>|)xZBi>OVOAZ~vS9bo;B`%k=Nwi*(ja(VvsEpZ}|W_U75?QA)?1^!@(J z;qc@r9h}@x`zM`FI({%(em44fKKgkv`gxhs$@B01=j59-dYnh^{os6VR7vO8zfF68 z{pa~JkH!de8&iownj`S$MJeOIU#}`Jnb)3Dw8s7<+}_3X+3UeC=JWPf8rHU;ySB&z z6KJ-;QM1ca-I@gs*BoDX0t5)GEYM#$f&kkjP?aopd~Q;*f>G|_;fPh9F03i?J4Dv?TzAl3kW!V;8}keOnzSWB>!OfF4&R)0RjZ-6*#Cj+(OaHe}vYA zcLocQS(yL<0tD73;Ok7OzaffMGxYqI&6b5KS`l=CCD1t!S1zd^O_9H<52@oJafB*pk z1PBlyutfq@@mgoU1YEqJxdlX(M(rsXYoCj&fdByl1PBlyK!8941NbQ~clQ8NJo1PBlyK!5-N0&5U3+P4PO z#X=hGTg-##vMdZQN+OAnX z?^W#T#)~d_HfMu*%jc|aF#!Su)+kW^t-6!?HSS)a2@oJafB*pk1U4ej4YEY-DaC69 zDcaZ^ok~RQ@%;zl2yJvP+-Ezb@D7lk009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK%f?ZZV)AEkMC+5M+i#T<>u%%r%}7R+wStwp>G5T5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5)O zMj! zQXK>c5FkK+009C72oNB!YXZ?ZdDQNleb^N#q>GlpN=mG%(1PBlyK!5-N0t6Z( zF!UHUW@jjbK%)f8e*{xC%0n>(2oNApyFff1P%o73x2oNAZfIvBc@`HBe z`Ytm80$Cs$Q;FJhoO#n#x1SfcNy`tKRE%1R3*_VBsCXp`*rY)Ix9)J0NyoV+pTDo+ zll{&2MMeSy2<(PH9vLlm%Kh5-bX9^hk59V@qlCVk1PBngR^U#4ak{qELIMN`5FkK+ zK)VH;zP5Y+H>mfcPjp)Q=#G0nXf1$_6Cgl<009C72oPwYz}GkHvjL8qIa!MU0RjXF z5FkK+009C72oOkVw}xDIt2d5M0t5&UAV7cs0RjXF5FkK+009C72oNAZfWXZKo(8LS zgZ7l7H7?tIy)?AEvO>P!;+2NW1<@K&`(>c^%{1VE95hC~oyWFLrUd5wu1u}u$<7HBypn2?y0depIz)f~fvpuN{%zOMx6iARdKWKE zgOU}G4-<7%~wkoOv|LmmgK0 z+4yvjl8;q4t}fwD3qh@9mSMAPUUs;%Ig1}J|icrHQ1gde8`;%Oo`&aL> zb6=0=I+M3*&f_m-%n%?zpp-zqMmJA4UdQMqp*l~Rr<*PyU!$9+o6avEfn@~ZcX81g zQTsAg*@i&<0*=)BO+_R?fB*pk1PBmVN?_zdByU00rE y-Olr!7dU$FsGAo1(|ex2HTt=gx0*aZ=)FwC-ivhB+e_cM_mk1mZ|60xoBkgt^rsU5