From 286b2b8f57e13e68ca15c55e1d70ada0dd248643 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Wed, 6 May 2026 15:49:49 -0400 Subject: [PATCH] remove e2e --- .github/test/selenium_test_editor.py | 347 ------------------ .../unit-test-coreid-CG0006-negative 1.xlsx | Bin 30298 -> 0 bytes .github/workflows/deploy-rule-tester.yml | 6 - .../workflows/test-rule-editor-preview.yml | 48 --- 4 files changed, 401 deletions(-) delete mode 100644 .github/test/selenium_test_editor.py delete mode 100644 .github/test/unit-test-coreid-CG0006-negative 1.xlsx delete mode 100644 .github/workflows/test-rule-editor-preview.yml diff --git a/.github/test/selenium_test_editor.py b/.github/test/selenium_test_editor.py deleted file mode 100644 index 2844b505e..000000000 --- a/.github/test/selenium_test_editor.py +++ /dev/null @@ -1,347 +0,0 @@ -import os -import sys -import json -import time - -from seleniumwire import webdriver -from selenium.webdriver.chrome.service import Service -from selenium.webdriver.chrome.options import Options -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from webdriver_manager.chrome import ChromeDriverManager -import brotli - -# Get the Preview Deployment URL -RULE_EDITOR_URL = os.getenv("RULE_EDITOR_URL") -if not RULE_EDITOR_URL: - print("RULE_EDITOR_URL is not set! Test failed.") - sys.exit(1) - -print(f"Running tests on: {RULE_EDITOR_URL}") - -chrome_options = Options() -chrome_options.add_argument("--ignore-certificate-errors") -chrome_options.add_argument("--window-size=1920,1080") -chrome_options.add_argument("--disable-blink-features=AutomationControlled") -chrome_options.add_argument("--headless=new") -chrome_options.add_argument("--disable-gpu") -chrome_options.add_argument("--no-sandbox") -chrome_options.add_argument("--disable-dev-shm-usage") -chrome_options.add_argument("--disable-software-rasterizer") -chrome_options.add_argument("--disable-extensions") -seleniumwire_options = { - "disable_encoding": False, - "suppress_connection_errors": True, - "request_storage": "memory", - "request_storage_max_size": 100, -} - -# Initialize driver using selenium-wire -service = Service(ChromeDriverManager().install()) -driver = webdriver.Chrome( - service=service, options=chrome_options, seleniumwire_options=seleniumwire_options -) -wait = WebDriverWait(driver, 30) - -username = os.getenv("RULE_EDITOR_USERNAME") -password = os.getenv("RULE_EDITOR_PASSWORD") - -if not username or not password: - print("RULE_EDITOR_USERNAME or RULE_EDITOR_PASSWORD is not set! Test failed.") - sys.exit(1) - -try: - print("Opening Rule Editor site...") - driver.get(RULE_EDITOR_URL) - - wait.until( - EC.presence_of_element_located((By.XPATH, '//*[@id="signInName"]')) - ) # wait for the page to load - - print("Waiting for username field to be clickable...") - username_field = wait.until( - EC.visibility_of_element_located((By.XPATH, '//*[@id="signInName"]')) - ) - - username_field = wait.until( - EC.element_to_be_clickable((By.XPATH, '//*[@id="signInName"]')) - ) - print("Username field is clickable.") - username_field.send_keys(username) - print("Username entered.") - - print("Waiting for password field to be clickable...") - password_field = wait.until( - EC.element_to_be_clickable((By.XPATH, '//*[@id="password"]')) - ) - wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="password"]'))) - print("Password field is clickable.") - password_field.send_keys(password) - print("Password entered.") - - sign_in_button = wait.until( - EC.element_to_be_clickable((By.XPATH, '//*[@id="next"]')) - ) - sign_in_button.click() - print("Sign in button clicked.") - - time.sleep(20) # wait for the login to complete - - # Wait until the value attribute of the element is "QA Testing" - name_clear_button = wait.until( - EC.visibility_of_element_located( - (By.XPATH, '//*[@id="rulesList"]/table/thead/tr/th[2]/div[2]/div/button') - ) - ) - - name_clear_button = wait.until( - EC.element_to_be_clickable( - (By.XPATH, '//*[@id="rulesList"]/table/thead/tr/th[2]/div[2]/div/button') - ) - ) - name_clear_button.click() - print("Login successful and user is on the correct page.") - - print("Searching for rule CG0006...") - rule_search_field = wait.until( - EC.element_to_be_clickable((By.XPATH, '//*[@id="mui-10"]')) - ) - rule_search_field.click() - rule_search_field.send_keys("CG0006") - - time.sleep(5) # wait for the search results to load. - - search_result = wait.until( - EC.element_to_be_clickable( - (By.XPATH, '//*[@id="rulesList"]/table/tbody/tr/td[1]') - ) - ) - search_result.click() - - print("Rule selected: ", search_result.text) - - print("Switching to test tab...") - test_tab_button = wait.until( - EC.element_to_be_clickable( - (By.XPATH, '//*[@id="root"]/div/div[3]/div/div[1]/div/div/div/button[2]') - ) - ) - - test_tab_button.click() - time.sleep(4) # wait for the schema validation to complete - print("Opening upload dataset tab...") - upload_dataset_tab = wait.until( - EC.element_to_be_clickable( - (By.XPATH, '//*[@id="tabpanel-1"]/div[5]/div[1]/div[2]') - ) - ) - upload_dataset_tab.click() - - print("Uploading dataset file...") - file_input = wait.until( - EC.presence_of_element_located( - ( - By.XPATH, - '//*[@id="tabpanel-1"]/div[5]/div[2]/div/div/div/div/label/input', - ) - ) - ) - file_path = os.path.abspath(".github/test/unit-test-coreid-CG0006-negative 1.xlsx") - file_input.send_keys(file_path) - - print("Waiting for error result to appear...") - error_result = WebDriverWait(driver, 30).until( - EC.visibility_of_element_located( - (By.XPATH, '//*[@id="tabpanel-1"]/div[6]/div[1]/div[1]/span/div/span') - ) - ) - print("Error result displayed.") - - # Give a few seconds for the POST request to complete - time.sleep(5) - - screenshot_path = "login_screenshot.png" - driver.save_screenshot(screenshot_path) - print(f"Screenshot saved to {screenshot_path}") - - # Find the rule execution API call - rule_exec_response = None - for request in driver.requests: - if "/api/rules/execute" in request.url: - if request.response: - try: - raw_body = request.response.body - decompressed = brotli.decompress(raw_body).decode("utf-8") - rule_exec_response = json.loads(decompressed) - print("Captured and decoded response from /api/rules/execute") - break - except Exception as e: - print("Error decoding response body:", e) - - # Expected content - expected_json = { - "DM": [ - { - "executionStatus": "success", - "dataset": "DM", - "domain": "DM", - "variables": [], - "message": None, - "errors": [], - } - ], - "FA": [ - { - "executionStatus": "issue reported", - "dataset": "FA", - "domain": "FA", - "variables": [ - "$val_dy", - "FADY", - "FADTC", - "RFSTDTC", - ], - "message": ( - "FADY is not correctly calculated even though the date portion of " - "FADTC is complete, the date portion of RFSTDTC is complete, and " - "FADY is not empty." - ), - "errors": [ - { - "value": { - "$val_dy": 18, - "FADY": 35, - "RFSTDTC": "2012-11-15", - "FADTC": "2012-12-02", - }, - "dataset": "FA", - "row": 1, - "USUBJID": "CDISC002", - "SEQ": 1, - }, - { - "value": { - "$val_dy": 5, - "FADY": 3, - "RFSTDTC": "2013-10-08", - "FADTC": "2013-10-12", - }, - "dataset": "FA", - "row": 2, - "USUBJID": "CDISC004", - "SEQ": 2, - }, - { - "value": { - "$val_dy": -34, - "FADY": -30, - "RFSTDTC": "2013-01-05", - "FADTC": "2012-12-02", - }, - "dataset": "FA", - "row": 4, - "USUBJID": "CDISC007", - "SEQ": 4, - }, - { - "value": { - "$val_dy": 206, - "FADY": 230, - "RFSTDTC": "2014-05-11", - "FADTC": "2014-12-02", - }, - "dataset": "FA", - "row": 5, - "USUBJID": "CDISC008", - "SEQ": 5, - }, - ], - } - ], - "IE": [ - { - "executionStatus": "issue reported", - "dataset": "IE", - "domain": "IE", - "variables": [ - "$val_dy", - "IEDY", - "IEDTC", - "RFSTDTC", - ], - "message": ( - "IEDY is not correctly calculated even though the date portion of " - "IEDTC is complete, the date portion of RFSTDTC is complete, and " - "IEDY is not empty." - ), - "errors": [ - { - "value": { - "$val_dy": -3, - "IEDY": -4, - "RFSTDTC": "2022-03-20", - "IEDTC": "2022-03-17", - }, - "dataset": "IE", - "row": 1, - "USUBJID": "CDISC-TEST-001", - "SEQ": 1, - } - ], - } - ], - "LB": [ - { - "executionStatus": "issue reported", - "dataset": "LB", - "domain": "LB", - "variables": [ - "$val_dy", - "LBDY", - "LBDTC", - "RFSTDTC", - ], - "message": ( - "LBDY is not correctly calculated even though the date portion of " - "LBDTC is complete, the date portion of RFSTDTC is complete, and " - "LBDY is not empty." - ), - "errors": [ - { - "value": { - "$val_dy": 11, - "RFSTDTC": "2022-03-20", - "LBDTC": "2022-03-30", - "LBDY": 2, - }, - "dataset": "LB", - "row": 1, - "USUBJID": "CDISC-TEST-001", - "SEQ": 1, - } - ], - } - ], - } - # Compare result - if rule_exec_response == expected_json: - print("Test Passed: API response matches expected JSON.") - else: - print("Test Failed: API response does NOT match expected JSON.") - print("Expected:") - print(json.dumps(expected_json, indent=2)) - print("Received:") - print(json.dumps(rule_exec_response, indent=2)) - sys.exit(1) - - -except Exception as e: - print(f"Test Failed due to exception: {e}") - screenshot_path = "login_screenshot.png" - driver.save_screenshot(screenshot_path) - print(f"Screenshot saved to {screenshot_path}") - sys.exit(1) - -finally: - driver.quit() diff --git a/.github/test/unit-test-coreid-CG0006-negative 1.xlsx b/.github/test/unit-test-coreid-CG0006-negative 1.xlsx deleted file mode 100644 index 30ff10cde5673297358b993e90808ee035f7220a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30298 zcmeFYW0Wr4vMyM*vC6i&R@t^~+qP}nwr$(1Y+I}BuJ7CX-gA1NeMa}6?my?|7&&v~ zJLY(EW@N;CBA$qll>i1o0RRJl0000W0H|RL&lm;-0BC{&06+$S0MZb!v34}FcGOXH zvo&(iqII>h#Lou-BF_Z?`kw!Pj{m_Dm`vWbSf@uA*@k|@i_{jWELm6TNmn`*Wozk)6*~?EI)5N9DFp?pZxIQeHAFpl4X-cgNvUB*^QK7PYreBG&@{F zY3K9gaIb_SI&NVU5F&m7Fy#5TtMA?t;R{;xs2Ubb?wx>i4wl)^D0su!05e9hx7-*n zw`kD>`pGsf-;BtvBWbI|e?C)wPf?78l6#v?xHHotZ2Ygt{1f5=p-DwOXqV3|%* zSg(!w=ZUNhwnPd#GI1*MxlkdeYki@q|cuB0MAz>BYc7%-`aD% ztw{6))9$k)DR$0G;QmCKt!5W8xE&2hTFys|cru$EeXR2j+mk=BLNaVDlz!bL)%6v9 zfY}x~JNQjIFr%C>TG{oc;9q$Y^I~7_0Vo@ICPf6cEEIwlIROEt72sho*wrlt%Y%r) zpKd2Jvpvi%hC9EAZ2(-@A=`6COPcewxWd1ZUIK_(#JVH^8og4%HWxi|inbm-(uj^2 zS+W{@zBTvj3m8E5|7QNk+TBJ#-{!ylZQan{=C5OKWa&Uh``7q?%>I9{t^cQ2uZ)+H z0A@f4zV`njnC#+MrzD)Wq!T)kGW-B!Nc+%bNsBFP|9BGSbIfbTbaP# zGgd@I6nyUKrd_cLEPuZXy>)_eRkbo`Cb02r4{{Uhh(+G0*#UYH~(9XRXg z<$@Kov9nOf0oi9GP1y68zLOEYMAe#ZEdPn2j>}+LWrhW5daM5R-Jbj@fTWFDy>@Y|3dMioAp7sua5m~tQN{t+id1*NNT%L=!H3p zgo8Mz950Rya(CU8XgOjR-k(LGt3c@H=$hg{H^XCfHtwp=|ED=E?EoeN%;Hb;&eXu< zyH}c;pP8sohQG4afbkJ@!cj?tjt`rU_0WE~6&@_U>A@s*(iwlCp>}=xctf)R>_w%9 zoC2uAt*;>&I*s92YB`mm!9_v(pJ8kaemf|U4(+>4605D{N;#r1T~sCAZfZ9&7fUB^ zC@rZWgKaf84Hw?JJyaDs;4-t{Zmuu0jsDe?wjKhU21Gl@139|r7n@?W54)x5$N5Q@ z>REt4F{3_rc=|$PT?ke@Bm2xGX^}3%&atnmkUrtn53k$aSs49&(xZGE!KwlgI`Ite z9-CK>hF;QDF02!)`8uwktDK4{7fMSN&H7NOjE_KyFPS`A@Ly@q+(0`X2kU^5wJr`l ziC|=Tu-cMIQl2!jGKBk<8f$(dfpl~Hpd5ZGX)eLwrN0wrn3EmaYnIEMsp{dW81mzw z)sXG3)Af1Kq$g*c#Tf(;P7iS;u_>jD(pEGuBuUiQwoS_!i-%fj>cnUwC!jN0|6qil-qnok%V6eTL8;=+6 zuWPqFaar0rE#F9s9)?d@{~_CHlpki*ca4QqzGi5aR>zZ`Bxa0GOmubrVF_xqeS=W) z+jahvPYJy-T-#w_Z?k@W0s~+IAtiG#Le4`f{^4k?n2s#VeWbJ0f~7KuDWG%QxO>R4 z5r$Chcb~vd05*905wDgDWdiP^L)lww!8NB08yvnJBev7gyS8JOt0DT_%-!lZ1AL|) ztvsSGXoZ=|ZPo-g==qE!t`~Hc1=WS^tRZBI6w70_x1Rnb)j0 zXHxUTQJhs$UR}XoBP2}B5wqL_`bXG`DIq) z;LD<-+#K3fc}UK85E|k4&g?24gnhLIudw(2tUd8PDmKUm~Mpr&` z?=s0w$7R;2HR{T#;j*Z#wol=WpLFA^EayQ@Y8{Pk_v{~7)p?!*Rw?VAkdq5Oh9|4u z6W-r?^IyF^B5xOP+iy>=`5V5_zi0dtx*SZ6j2s>4{=P8$g<+Ws5;1G^2mm`CMW5gk zPr69>5`_Iw5Tza!<;^bplA%F(WmekduiG4u{#s$s>J-WssxQW**^}Bc>TyJ@bX63l zoapjE!YktGT6{hq8-fbro;$^RYTUj{?W^EUjpR14qdYXAJvV|?hct1@#Ov!l+4c|K zQK7|1RnwdGKI{OD+)Xa8V-z3jR&*^;5kkM=drk%08Lu-M&$P{JvCYnPw4&@?02I%~ zDb}bK@{LWJu9}w4!D0~zT`d8_4SrhgE8bt9^Y3q3PcbbjMPnyME!NmTF;1sKUa!Qc zC{Io+I!OgqUm2N*LJ1>umX($l z^*u&;Gb+wQ3e7{%mcchdSYyqC?O6d+3a=PP8e@$TYmgutl8~A@pAmUN|NZEHK3`N) z=0S>Dd}fkLc~ne_s!oYsKIF#563CT+vy|%EqzPLGJs7YmE zY;ukc(EiE#>PgBmnh}~wVR7=xU;EpC)zW)5q4Aq@pdp4{Qb`QZf(Q;1(Xw1^z_l zXLd~ly*T%b|ElLtxIHCJ5VJ(-03{?;J$A^1R?)B7!~De7flb9h{-gz^R8&Z#38Cv8 zJS6EWDM@w?>!?+iFcV8AVSixId?v8nR_tA5@}vd*;ONgqCI&%#tWcYMEUyKu=L!-M z#rNFz2sSUkwhFH7WRQ_F&$y(NpR9htgTn=-DHM_XAlzZen`8U}w+=nohNtJ5(;{Z^ zgA0zqD0a46CppW4D`A*Wc6hJ+nqR2WwLp- z3-`DxupxUxlm;1Z9Zp;A-io|3n!d@uYL@}1cwwM%UC5+J(i({$B{m*GG$8!Phayt2 zpTJc4+HU_0c94yCqS3KkZDOivkxjR{kG++zEbG~md?Y!rCf-X_3})-Cy!Mk@+{(-V z4rADaOqPirsGVdI^Db>ae(Ur9w$lHvt;B1@I;;~C06>HFzqJyke^|+S^!HvKd`g0Zc$V_lOehfxT#3J4Kp5tgdoet;k&T6cNTN)$5&pld6k>#Fs?0R7zaJA|vb^ zQ`_IrI2W_ju1Hp$F`~!)GF=#WqC=qG{$rQknFRUgB_y&JyZ~y@POYpbRbDffpuiCI z8B3ArWE$xU7wg!)@j9#K7#Jdz9HhrZZlWl+oBFbNgHlj8y!I$7o2jR#XMjVh^(SdO ziY8S76bEnpx3devUF8l5YgMGavE^CAl5|{h!h6eF29(%?SkWH(T5HkwJRHxYESVSpD zhBNBDR_~T(RG3i(TB)x_FF7uW@=u-IT8Gl|#O^&ojXJ8LUzcNK8%%@vuoZsTI+&eL ziNRkuSVUSRrrJAJ9U1xaB%o zMd?$>W}C*5$*weAFh9R{+J7o-WyZRFhA4`V&rlIOIFuF4_F zZQ|kBc@4&y3NM>d1H=F_xp>^jk~AY$0vg+^Or40)LTai_M?OQ>wdSF%iI3v z)#D)93-D6DkS8*d|W7gY*H$IY%&EOJ{^<) z{qJUCkkg9M%mci&dVES*-y%VESzi%(^x`;ur|mq1zCca+gKPW?T!ZgQcE+jFli3dB=*OtcwPnW~xanx==jDEE4kX8W3hTK%+cSO|I*E}~+gT&)A$ zENx6LjuNN+Wor1Oa*P2-JrIn9D3%}!|3rBZ!s&WcXZYHROu$&13Oz-M$fv9J0~zG# zu2Ap~V%IW=pBvYiD=p`FKJJwOk4Ajrez9L8Jk*mQ!gC%fAAXjFe=m}U07C8JQe{0; zMIlHVy`!OqjnN4?`wLw2G>Q>Xian^$x}l9vA!x?e=OdEL4{dUkabm{dn+p2pB0~BL zGgn+pQobRL9ThLMJpEe! z1JEAHHt1sTt_tF7&V8!V%>wP&4btYpry=zH8j>ZD2?DZwK^?Y}*b0cLSfnWaaL8-q zLNNBaj!{;LNQZre9KVkr*I04NTJ{O3C3r9c>H7%+5r62xxCa`8kdZ+3Ib53o0*I?6 z(5eynfNOj)?zKG1O5X~zI2;`&fc1-7AmD(9V=MBLSu|?h-hv?arG+%1%LJ05^dm!J z6@~KC&ky|)Uw|qyc1io8)BON3kv z4YV9e%4)4ISw+KR*@-DSX#OObIi#biId0oqG-;mv?JCVU?;r>cPYqlW2sP8B7x$}t zuW5KkMalqd*F_2$t06Zk6SD8pMR#BTriQCVG)x zPZ>Al*(5=NOBsR&$7lH|8s);tK|WZT<$R=EO?#aC|C`>P))?{mQ< z<^jx9(zMJ}mg;oPS_yfU(C+Y%fyk^?tu^R>SW|$Ab6^#DfhviF?un0QU&a^Rr9>?^ zINqMg^Vo?CtEZp#{zhaaajbW2pxYQ1yn!f0DwBE8$1%@Ckt3;tYmyaD1V8_&=bKhB zbGcg*0sY|YDI}auAw{Y|v78zo=Rl|zIHD>XID$^hX`I(spafKu$cu)S{apR=^vh#t z;@q>LOwA2Rls%L(tROa=aw~IJB0EmN=;ni|ME52~)htL^QIO*O{a3U3^1Wo%lh>j_ zN=iJFlB8FEk~t+8nthin=Laco=9!)KauE3=iVU zL^#etQKH$RrRKXm=b_Y0EsKHf>ZY6se{QZV(4Yb8R4WZ2>7c*kRn4-MxwVuko@O{Tb!`T0=$H)A)$Cvn@J-&oNwmAI$a;ZpBRA?$C5Px0H~n+A-HC07qK#Gd?`iads2C@H9%%eEj=RM6c6MZXO$lV`2~ z`g-n0H$umd$cSGm-v#Bi3&=6f;gNzDx0y_Li13|F1*)mql=j@N{h9LH)qDbLr7SV| zcYlHQi*W@TjYeGM2R($mj{MwCH2qu*y`mE2@NxJhv5h78Txao*GZu@wpTJV}BDV2o zQ`Q{%;?{t5C{48`Kf>b-6PA?pW+4+^9q7xAXJzO&3byqh(Q;|OUK=LA3M@* z)@MF8N-iYZFTV(2!n~%Q`eASUp?H*$#HK56fFigdBxdMcG~Mfwjr_g_XY^`A$2=1a z-RQ%6`e`D57^0A=VR}u7#S8E1aAqU}kzTa(r>lT|@{`&G>iYb$g1uL`320L%Ivy#K z$7;ESas%Q;*LFC{^dk@C@;P$S+Cf7KDDi1gYym6uG1jgD|IB~5$q*)~IjL^GKD+53 zGPl|d63b;Wi4t>5cNpkRh+Tt57BMOZ1KEf}xjF=rnKQtG&u=`J?m8Hz4HVEDbRMRB zso1_i%tDv0MHRpvtVSmHj?qc8LXJUPUN@(MeyK* zD2XSb-~1}{|H^0<3>7G!#Y(`B(adp?Kk7o*!;i$3fNVY^1CHRs(#*Qbsx(B8)X;2< zLAmH$z}Pd#KCmA1wkY%Yk9aFH_0m3{{yW|p+67Yf$1@#aZ-65AAE#lhX8KsXR4m!- zdXtjvy*o;({X9=4BOBY@%}iWSNku)03j;72; z^T*zD1>x_52Bk+nHTg9KuMtZOlqm=>Nm#J9E+Evm;6of(iy@3^3L=1pMPM)ixgbIL zaZr7q7Epbs3Q&D7EGYgkhA@}{Q1;(HYJ8s@P<`v|CNX&SYV^foMYggQ#MqW}e!;X8 zCR%`~nU1@{$=1Y#5QbFFB4Qh(<588HqG!Uttce|n+OSsJ6B)dIkq&05*ynPwI%`%t*?sxyrk_k=n%+)01lz97R{{@lA1~T6>BS@ zb65qPv`)hWO{)lXs2^#x44b}XvlxPex)>L!yRvY?sEcmEPfkSz#aE%duqew2m1pG0 z#;UmlIu2=Arp(l2;g~><{N4VrSW;HBd!EfHM@+nK*+$?FG+a2ddu3#THaCJyn9 zsbV`;0w=6T8mR{T_OJWM)A@zGvsl#1xJUWp8Q#5c9YM;(&|FM)wyu%1 z)j7oi%tSPUVm}h?|40?CGIimPx=52hrn{7L5t4hbihYF(+9N)Rk3dIW>ztSFfkTTL z`fj%52F8V8)*o8mNQE< z<~Ly+1oz*<&d>ivH2h7+{Y^ADaR0@|#Y_E8ddx3(Z*`7@RHiR(c2HIFdcqOaB@zms z74L;vxtrqI*L!sQfy&NU)K3|YBUp%3sNx!ny)GZbFxfg<0ymd2qTTq#KZg}DIah!S!JWsNj4HhO2@fL(NKeL z(}a!~B@0!PdxI~h_{}>-%(lERIjGL>LX&wrg~zEFE)V#$`%?~`&Jl&<&m#bj?C0?} z)6n~eN4Jkm?-syfy=WeIhUwj=K5RLx1EMnNoJ6_x9@zr1BM;Rw`TW7KEmHaF4^Q@t zJsjDFau5m?W9QBMG6ct+8VgSk8^yBA z^@=$)GNgAJ4yZXq(z=jS6h7;muuq%F3q2ujtz=oZ)@yA=I-fi;LHRwPach>-_EmK| zn$&uyY03iy>Xp_D+@#UCgrn2tKkOngdDGgT7eQDj=)x1ZMaFnMLB#&5oRXEaW zySrhn^v+3qnPb4kS?!3PXs#72*kBE(gO$D0i!~%_ejH=F<3qG($-O#Lrt9MM;ar71 z@}ri=`uBy~RT=9U?7O}xVaj-(Vc|rHD@I!htNj}uF(N_?kp`fe9Wg4xWeD~-F?p&T zIU2!K9)I8wHl>hhU!Hhiu5c5Gn{Bc12Bi3E_-s`wty*_EX@}%PH1_M3&-fIjy!3`r z8~ivZF~A`Z&@TnRIeeysRDkG&2n6g>1Oirh3O<6&G9-dnHHlfeefcuE*1`8(k6T#_ ztaQ$rD^3g7@In7ob^5YF-WH=DZwEgl_4*QjNE-G1{vm15*SPSYCnZ(z?Dt}28h?>P z))E{~Mjd23k6H`OvZx*vsYG|z1F--mAARhlbtA*r}yHU z_%>Ib2LK5zkk~KpsQ=k4!*Fjq%o4bM$QgtKo!xIrsdhH7X3kjkGJO-xT%3*N^tG5L z;EJ&ZT@Y|5z_WSfjkv$n?b-eRCvh2Ti5u_)3;-biomBX5l2E_?v7bnM)B7kvPk+(- z*8vP}QnI6_Abd<6sN2Id@eN*~u<2qaAMzve_aX;(a-usu6HxiO^Rb~@{= zgxydSfT|jk%v&%%UJ9_e#lzxG*PEN9Ety}rZ^L2_4sJwmuyxj9uCLiKNV2}u zP>AuXLU&yspc?c9HiaHv@OsaIY^=h#oxYH%kQtLb!ux`!LQeHYmpI;C0v}mY;s5UwX;m#tvZ|VpK6o->G0f9ux_ zxOjMiHdz5(B~z@OIm9U+19cAa>hF_d7>ZXQ`l;wE_B7DT?j_1udMhfKGNupCWsXGL zVpDKuzQyhmw>|ZxZ>Lar#mnZ%8YUch9N-jxk}YcXp#Z6)~PCEhE#v%pR1%;bq}c+@&{5e=rK$QapAZM;s8HZ zF$Xb|s0=0G4|=%RF(uD9~K!?77hI;l*Kf*!VqLb-HE$aAiiWq!KSA`&h7&GkeO2 zCPpF}L0Z2+Q@=~B=Xl#AT8%-BtN_0VTIMC=iLtFy{uqJ?j%)2TX7$@9jT{l}C(8LT zf{hcfmHLCKNWKc4DE?X7UtiY4i;;ln0yat9$D^!MW|tw3A2yPFTcx~?B(H9Npq@W8 z=tTYshhXiGUN!>4oxBM;{v>OIZ#C4i>P{z=8nE9~b<*0Fl9vagGI9V*vK6F;_Qb+j7V zaLQwXmU9(-YJ>4$+INJYYxpR*H3venj7v<;mvd2cGzOL>F12M_?k!{m#q3*yX@i=~ zUE0=A4f{``k+)z1_`2dLX5?aFD=y>}BvlDn4%H*C7`Xv_f#iwB_Qr-_WM(1iTO-KX zb_Ul;79fypf{{pdTNNo_#g(3GxcxqhiNc%d84HuNbi-7!GsJS@7wy zxja5^PVYi`xP0zUUIujP+nOjPtieeX6s{IybiO`5(6)4XK5x!$Sx$eG-S!XmyuVDO z^nBg2Kh*ARpwe}F{rPj6fVS=Ra4Zvpv$l?nlX^oCR(DgqYj8~(q2~wpb_>XpHAv4t z7|)A%;#_()F$$!ufq&NTRD0RKj;%Tj+R52tvD%Jz+eRFnRwG;ox?vFMjPAm|Q=UF? zb7Pw=xtVa+7S<6q8)tDvD_#lkbj*~ivM0Y9Rcmwv8;%rK%-T1v&{HQ6iBr)b5PG=G z#keO~8+Lz%P!kZkKq6qTOCnF(D4-uY(Qkwwxb|mi%c^Fe)MAm#(~wB-dmZ%Np=F1| z6Q;Cs7xHX^3_o$YBMc81?S1-0NUQ0H1>M6b?p_V310{~wLmn{sdZ1wT;ofky27kp% z*q_X|MW8dqaXGI<$#OcZNyd*3dXvHt2*tSsh@pALta1o)31G|CGi$cpl_jlpper~=4x@Xta672Z>M>0m zx6P>#>L%e_h*wgLPAffR>H-?Yms>1R*rz~H89m)5TGg7^*!jEuAP+;_E_}fh+!WVh zJe&x(eV+W84|h<6aNK(P#ZLLcAJBX%AIp=Ofe{^QD1%a+R9reQ=^XN&8y8wA7C z90UKc<#7r@&cdHlFBk#}25r+n6!lY6Fsnk{@+vW7CF2)7Fp98p7jnWu)X+>=J=wd< zIIatz0~lzG#_d}odj`4Dv7lcA@pOb8v&bmV;g2bx{(4h`~7cY>`xkzyO(sj9ZvNm(TX~O69 zpQ+Rvi9|H}cBDLHjB7EoFzNzEo4uLgk`IcmOr*I6g&|H1EKM@h`3vno$BN;>9QGT-RGwzt6o-6kXI(z{pn@(DfvZvE-c4<#gcqQM640wO7+r z=Nwh%WY1Fa)P?O1q3EqpQC$xocZ9kQL-^MCf{n2gj}1^u8q+!>tD&aTgxwRE%F+O3 z_34=KV;mJ$+wI)Uoy^L+gbHbhA{`r|=;!JE(RQghrjp;(hTGFZelyCn>9=9oGo3}j zBU%U%lC}Dgk}Av&a#+7KnM1Tt5;0r6AfKQQEW3iW5&hOc%U5W1#t_T4es?1M@-b9zn zmd5kjRj9W8EFap&sU%*-?(f2jis=GoKW0HJR8^&;0*?;!jR>$mn_}?Gs6~xCd~w;+ z9XDO>44-F9j3#1_kaf;aHO%h+8CE?xCqspYF0-26mv>IfnOY9~*d?>cg10#C0A_Y% zQanU?_S-SxG=$>-w&IV#?|RB2>kny~?~*OrHaMh3H}THh-(C^Gee^UrlZ;Yoozes0 z4GnVZjZD-KFfzY?JzF^mvvS>5lktpZO{zQbQlE=wJ-?1`bS@f$yZCXs+xoDU$e+ma z+oTYYzs_TgCjQcm*ho-|g4ph4Bcu89rmzIx6knl9#MJ9SPz;dILu{@Haz>JK8Cj;i+CQY33POyCkkpw(YubI?>(*TLw7W*c&w6Vb z&sDQ>HV-mx;vxs>k}jCNSYi*-uF|-Mb>FO=!{)r{B7%imTeOxvXMt+6Z_$7-Co%Fa zP%8yb66Yvw!TQMkz^5|MJ*4n5>;`x;?`Zz|I|TSw_*FJbV?+9;oL86u0KQ8a|0)=B zaCEaYa`?+Zzrb3z-V?s>lK<-a!*L6m!5g?rYe-X-Xk9>>^lCndUR=lJ$Z4oo@#!&x zvF@75YwJraZ{*sGYkag(V*t-nm7wZD%vnJF;CSBu`)7QxrSL*q$(P-=%WHdb7=9Kg zgG5+~jcBnC=EwU2J#t3s1`Pxvre&OQb~l2)n-RKNE52B)RxOFxZcgYeF@o*Hv2gPN zajH=(c^K?EvxhL!tm2GIt9Ux#+u0Z z>^qs*VgZ2%Or(60C7FATL+7*(szHEifP=`>qwjUcb@N(P8_xKz7UES=8;kder>83wJQ>+a}z= zjc43y>nvMd{3C}PgHPeYouGx*i#7*fc69frz(cP%jk|2!-`qnaI zPMgx3m?0FzOtF;J1j@q7tu71!<(r@WhE}fze@>!|* zWG1%r3;}yEX>3x$nl#5TJEgouzD3OkVzrxe9+!aN8ZxrZd4cs^Ybk|3j}U6ER*KN& zRHfaYYEfb&*+@}q3?vm{$f&sD9&yYj6~t*jl#G=ft<+|h5GW!oks_I33#YZhxg?#% zz&4HmeKD)^L@T>#A$Fq9A|Wk$>Efp*ZHUb{YP5hJK84?bCT%(aa=he#Pku6l&5Ymu ztt#?%2(X@F4-i-0@8NGW{Ti^+3HIx3mUaj*sMMj9fo>WQr*@71%LDYxaY9UR8I;N5 zbwhCD%$bAv%`rF|G^`}K+!|_c#iX3AKpgYzmqv89gdKN(Gu+t%ZXxz!BIY-}iI&us zBXgLM3-SExR_r=be~RFz;H}j&Sg(tFd2xP{-Z>ZN+sOI8*{&&GL5|zpd_`xhKDjq^ zefV%*RrP_#z*St{5ddiryz3YamE7Io)MM*D7rrx@qwG%iVC!<8N1{q)+B648F6M*H z`EU$<23NE9i+9~IvxW)^hI?~TI+w&3xBMCGLJM+caHVW6sT@>|`f3x6F7pM7$16)^ zm_CWFj0$sb@LDsWTQ_g4Jv(_FPBDU_j zN6c&%h4am(r_92@0=;AaF0N~2J_(HQ+wC-82M$gv5DB>ia9EB@A^80oB~sJIHb_Q0 zf!htlBV%akg%FRUh0X^*lQ3J!7pzBlJD_rzqMtONRWRx_{t8N~Wt=Fv>Jrvoa_3S{ zP6_Lw!M80B#Z@d;OdU&bwQ$xA;lDbp_xUWqtvF5h`LN*EUURG9|J?cgqI;d~gm~+* zbtbw2MR+;bdIW$xTgC|USE9aZ@o{%|`k+diQ~FNO4pnNrjs|Y@FI1dkc~UQ*=~ZB` zud-lp3PJa*g)7K>9Zx*l+kOnSaCkXvT(fHJIfGq2x9_tj+&(n%&|5kDsriFB4oR0c z+G4z;_G_YTT;EkG2yO7k=(dtUcJ;==$%HUlZq*)lt;dncG9!ogawEGm-HFR z)=xf?i@geYr}!@V^HS z;0w-q`)}}g`wm}G{s|tYdiF+!3Xb+>)+T>rNTTYdLxwPd&$Z-N2o_fpysGcT;MK}B zK5L}}VyP#qoen!h7Ku6}3Tx4$&o<}*u`wEnSHh!nOxNbNw|0-mn$@a_+M=7hR*pWBasC&0Ls|4j(mCa(&7aDv93i_s zP6+TY5C@58FLNZ4g{M?D`H)2>WGc1NcZL+y_DajGiOR$J_?$aMzoxmV%R4nk)lV8G zr@d-X|Fm#P#;;n9J(<-E6fa!Xx10tX#8v2B&^qf_6ZOdg)rH%#GOS`_^fkfjiM$AQ zWrc+)ZYsiAXV^`0XZ;R3oc0Z}F+A`U9=IFmj80>|dXC%39kB9q0?DvcgG5!A&KZb8 z5XifjlfL9Ap@Ft2S&JZtdq@s2%D%Pvxa)wym;vxYWPg$X026Z}wTKUbPg(Bqav_Vt zd2t3ZC41~+)>IwaFC|~J3cW|Vr`kVpZEm2er4fDTj8SWR*!c*aFZM*cMPCZMC{o-B zRK_VnA6@HMQ@cdauD02S9*i40T)lu~hryVUBuLa(f_165*P= zisU&6f97Gv=$g&sd}%7p!5>xg97LAXlCCqTm)CZwIQor?;Z7e#=<2&|iGKf5DsUI( z7U|6q^rUrq;jm2AG!fTBy5^Q+hZ!#xG{U5l+X$|AVW3p? zD;im|_eilhorAnthtDou1wCBT3W~R$9}Lb&Js<%KpErg+IPzvugt{hA&`K`oDvyZb zk?tAY@tO+u(!L`IN-S}f7MS(aA)sBaxw!V>L-&j{u`J9uKY!_mcsq;dGcCV~zh?+1MV(tOV{9U;9*d`;3Zx#Ag)HxO-O6#wROk*7T!{>*P!~( zLNl3rz#!V6cj3yY(y>o`iw>qb%)nkHb$=u`rleEdl51E*ICL-*vtn#=VGU2xy~RwS zUVDMdknsax&iV;C4mM1xNjixIQ`yhxO=&)0t!N-p_(sx4>tOBoV>K8=+|Eh?J}?6Q zK=>YK`ig>6(f9lMNKFaWSl-v?i*CFGgm>WpJtFjzH#)ZWjR71;S@Ao~+|09pQ1;{i zBl+yAeclv+`8ol{3Gi1#lD~q?V{oUDX;c5e1;QdXx}z9Zos~7TSA#pq1a!%^Abo(U zt*h1pa4vud1n*Z1=^@C~GCT4$*fGRst`6;WstWy@^U1Yv`@DA91zO0!4AO8$+XG*w zU4|;YzC~>gD#x}BCK#EDM&+{nq$DPMyM$iWNHgFFH#LBEYc7s zHLe!qne+8GWq2d66-qF#*|?a#-*}2I>~y(PBpz4B+A>TeR7;RCJ#mr0!`m)#i@peI zCe^hvq)X(!gi4!ab6&V>9BNV9Xm{Qi1qwnU#(i|x#a4P)M(YI@rCfkGK`@g{A9@Eu zT!)WO_;-7bovDFx05e$w=4U_8ee$a?9IlASMc%t-u*6gi`4ZTF1jU1LVl-9U_3jc3 z%IetjS-Q`ji9AaK_2)7o!6(QL0u3!1h+pPQ6N%aq%0NgT2SjhFh}aU|gOUm0af<|Z z?+ESyA%a$u*I(wX;zqwL+@dw~LGM7K!vq)H7h=03KExR)5^gbk3H#C2ErTwb9U0v7 zkHUdx^X?#aU!In7WzG;ypH)^GBIgHBD~?T$VaNjnCWQ7XE;mAcRnsx>aYgFMPPwqm zpgTSRks!GcI!ZXfW&Q?&ulceU>+|X;EUoRJsUX$ibUE#0;!+oNRUpJ%g9=32O9ZH7 z8S>>K709>kOlK_Un$(q2%1kBFiOS&Vy_R|t=U4(JYLA$9TInUzCpGdeThYu16=GTG zPkogl;tD?exco<*!@mYNd_B*)tKZl({vG}h{R5-^YR39!N6bIEv;MyMyO#Rz-mJ>F zzP~6~-fPi!fddY)4q$%MQ(6c!6?D9vB5SNUb~#IgHxGa3yai&~OzQPNcL`maUNj9a zg@g=sAxpn>Lj}%=VsN+MW?bNP1>-z2krP6YAurn3GcKX0N}WWDQ->6xB0|J|^01TX z<%13tOKNfmP(qtaO`I?WyI_x5r5|l2ZNr=>OEz3{C3^J$IPVtkEBr|Oo*QKtvLuy=QSz)*l>z@JU@@ml2F#)Tk=xSdI=Su}U;IbA!N0zI zZn2-a-nUpF2mt`d{-GAO-#&|@k-dVEqvK!B3*EomGtlarS^qJB(7iFNHKYg7cK~C; zuj>u?wua( z9lZ&s${_+3y<-xjX8=5fAT`dV#H;;8s#VjqLP3m_-Na9a3{~=t{NnYsE{!PBDMcE9 zrbXLA>-X}anYmTNj21#NhL?ou1Ajp|aUtfagqhSG^!VU>wq?dzb&VLUyZW@ zq9FM2kMJW{VHt!*(FcNI@$HnO#{?=M_^*Qi4~RAd6TNFNm@7HZ8v&}r*0kf~4`&p% zPoL(2aVuz2>g+8$n$_n`$E%>Ti^EaIz7ZYhFL!2iuXuD%r(3V zc(Hr(xmx>@=5#ODMrt{pZcS}!x{5!}4mJBgHG0u0RMx2Aib{R{nAc%=xeWf$G@}{< zrKv~Lc2WJ^v!8kzT+p94Swr+=2*)X!O$W6x^h;niqmzZ_E7bF&jp!y`Yvd(@%!j7# zX>ud)Tv6Yy_V-D$b73uV%%o<7$nerr46%&P>nE_x^x9$Ex5MlVzJ6uW-np;gAWxdM ztkhp@TV}aNd(FcxyyYgmt#WasHh+wJikCFs{PYxjVX`3IG2OjjQJsfFq~^?G(y&ED zK~NHnJ*E(OYn}47wLE(4{&M}^+<@D0_2rTMvehTDyko9cYqz^~y(i&)?Sc8J_4QI% zQs<0Um8KuP6uzB&c6H#Th_0)P{azHg_`w~^1Ar4X^LJZECJ=Gze z@2RmLbMChwY4cucy71v5&31N*>10H7e2RsZ_2Aa`>1c9Z(vkMyj0ZQv{KLD4+Ip>p zDd*+*Jgn!g&A@@;_I!DNZ|}`Gi0lilhviy3%X8gu?#)C!<~nRo))LVc2r=UKC5AQ= zb5Qir`y2u~tl$5Oq3_3ci^9K44zWU198G+ujjq0_sec9-j(Ymv>=fPKmw&V}s;pbD z3nTp9j{n>}w?!v>p<5FbzCuBaA&QHU)*K|B&o>_yMfkOqhZ3Ql0Wb7`uOVSEJ)OyB zGJMU$X~mLot+Y^mzUjudwW}|Gsr)eI?&6}YNryZ?RCqbQDb-fyvgmfJ*)$XqvF+or zowWUH5v04zVkY9P+JiMidVSHWiDup9L7*vsti`E;hU0lS+~$0$-D7Knl5~A>^}DO^@sAZ_19((@V?@Q%S(5qt~R3Gh2q!lD+#7R{V%3u&S8I#Dx2ITga$T`3!je> zgct>UTsuqRy(Kck!Uu9z5;uKPP&1z&30iGI2gzR1k`mgI)=QTI#h%^nUR#PS$3Y|} zONerk?d?=7mz|$=tu;OX6TP=wv2s6cQL?Q~Y=OaA+9*2y91_veZl%O%Wi4e?o0GbA z?l;}mp!w$%`wT!Nd{+5{4GiQA-S5p(cW-f8yIdM7@m#gv`J4ByxXkVL$)Y?~P(~XR zRYsG?LKM}F5r#1Esk@fcp=C2VRF3Pr;dD>)CxiX0>3u?PqMD1q3~qASa47fG7=QAy6CbheJ?} zwtO|SY*xwulk3xq&)h1ABa&$fss%!<%1>`m zq&uJ&(|8PrZ|W${Fd53hKe?cfk<3k(ggy}af3-={-5q?E2hcY~yKBPAep z=uVODZb|7zx?4J>8>LGS2}wZ&-Xq?>2R-sW@&A3U>k!vI^I`Vzo!M(<)>>15_lAcW zpDh?2H4k%&GzU?1>YiAoKuHEnMb2(Y$G9-EEPsJnDL&b>C$RVf{*gXOC6&QO6keAG=AEDt88Prp(cz{5Ph_L#M%!s?1(fqR!f5Q7=33HC3Q%}Xz3PwPL znzsoJvvxX3tJ>Jef~_d|B%b&LM)x(wv2?_PG@vx~vkJY;9B-W@7cz|sC)-jW8D}Uh zAdwfgVFW|m2z8n-Ue7-h5*_c`3T3#@9&M;nv|cN%&t4OjOt`MSw^E2GQmShiuEr^c z^m9X7tg(hV407CD1*Hd{JB7L*x3EdzO>>;enaycmrbvs>=`E1X-`A?3ntYX>oKgr~|m95>uZ zUEwZ{21-amp(kqrH_30L2^2-#Kp7%FPvg9a%iLsGR!ih06(G!poU%|L z6eY5_Ypw_$Ltrg~b|8PiyQTu_FIJZpA9Nf?Q_Sm{OBL!bu2u_97d>XRWRWafpL1Eg z)Cm8E=~SoMvv4JYc})98J&1`=;oEn9?Tt0vdk6m|zU8?g(1Rfu^Z>YL z@c$Jd9H(P5&xsv)0KY4U&|=bUqa>c{OHB5ObhzRJ(U{D1f}wt_sib2{=C&8HQFGno zxd9#%#i6A8d3x8k?dvX?c?#Vk&q5C_*mG2$+#NMfotL93724bYVOIYtt;C3fA{v)c zxUZ|Lv%34D7maUY8=4;F>pkkUj?M2f*Q(vL-Fm5tyKL#coIomnx#c)_s@h0Yr~2?C z6(vGQ4Z|1I$B3_;PjyMGKHO95)+s|XM!rkzvl=>A>m%frJ*IIszD zK^Ij3({Q+JF)Ei;MOJk`3{4*uzxz>~Y1Xj>3_a`z0~jZ!A6)U?jhI<;czBO!Okfe8%dBQx2hT z)afy&7%p06i1s4ds_A}Z8fsT{*ZU_Zl?SciGoTE9 z1gt;(VgL|^P7aPXRvK28OlFQoR=1W9Nj3!pAd}>$>Ga>ecD25MItlvC3%wh^OpiLs ziNAXWSM9s-FCD+!o&N?u zs!Al)|9Gcd)v%=a!68fS;~URX@dYA=sc#2M2Cbb_TisjDTiy$+0*BF1XgAu$MQd5R zCaZa){p1!-GIkq~$?nBp_lBKIciA)} zqP4MX;yOW!uh_Ge5;;h|ebbneR5%qNc{uRefYLX-nBrv;97&;j>b5XK&}m*se;yAD zfwz`4c=l$cDi-;WK}@u z&)Irq9oOboiAd`o@P`NgFy-s6O;RN6Y^r45a>!lZg!+Jl+_o~9%+j1nw#Z&lbZ&{6 z5&8U zr^xZRWnjek1Sq=7O!uQ64d?g(Sv15k(FIOoG--AJ6dPVz^ZNN&Q6 zvJS?;zD*ZMl*Y9!_-Qi%27!HEkAh7$*EP)5a%Jz@=iEn*kQJZXDd92TS+U5M$q@)X zY_Ud79b3ml?Nc6GR-?2;f62F0;Uuk`En-gAGT_;c^p9FmtPi2{+2gs!4bMRz5>~gk zG^Mx>#uE(dQ0@NAv~fY_)5vQobo0!-kG z*J*+s5X+2WKdI{$k3mA*bo1ASj}3|MyYK?gXuL=lmfzZU#hc{r7UG`Z=7MR^inMc2 zfeSu(s@6Q!njP)uVV&9VfTqFN4eubeTnknpmb{5skkLg3$_(*?>E<~OPl;-OTCI%ZXT&r&5l)Kd#_xQ-*))+)|_cy0Vdy9WvH23x|-&TU%J+)$WW)V_)@$ z+Dr=S0s;)6ghPu$eJ=0qLxG$?Di|p!()O>+%+M33TR5 zqdk$fmR~s#u3%zagW5g(50YmZ$l^DAX$RtIrq- z8gba}U`#wJ)QyTQ8Wu0hNv~A~)$<{!o<4y)!_Uf6%P3W_q8MGxviVdfmw&+PZeVNj zX6VRpI))@WQwbpDi@y*kDTujVrcW`ja^88y*J1enCT+*-ol0q!#Vgz7)Dd}>MzWR0 zK(fk^S7Czedf5ZykeCqY@f|tv=M=r10ZY$F{OTccxOskfVW&JiScV``@`=lQFOZvL zzLCQ2YrM!C_z@>2*LARYc>a|tM&`it_}7T0WmlIf!Kp%>vpWxaNnqO`p8sRo?! z4-dBNoK;AO7kcY6>m5U`g=q;>!7DQhyLoGhTNUEQD%nXolbK~YYN&S#lDBz#zhUe_ z!)O0a4$*?RpwUGTB*SBR@+md_UBu%II~c<(Y|>hLfA(Mzb@PeN=h>9`_=ci`%dl>A zE7eb-F67RrU|Wu1j^1$Y5^x*?)QICKw>-t_@F=gvDpRR}#m{3t^D?ueg)FG}Qd(qc zovSRAvcQqxSJv~?fFs%r+aKB1{oO6BNYb*{dwK6;9yj)X{; zOfaJ>@1QpCINC`^pMT2E9~%;$@HstTGv5H!z*=zxK0teBM1K<^Zm4G=s{qE%m3H_z ziheons_Gp1DQ~6>s#5Xeb6b*H(d-1`*DdN@(o?H{mXy=N=DSgj6y>mgw+0< z7Ub$^e%@^C-2ny%ndJiQ-kK9BUNLE6S_Us?x1b(`GAJxUiNatScLi+0BUwz^DK$J- ze-rj+%A_AOK6E?+AZQDd&}!&G1=|Q^r3XkwLp7>}KsC@npOV@RCJ1r5G>M=unGE#` zwwPfu5ZS7|#1MR%x0s$j*RWOxu@HgyTi~ z{IrtMYd^RvZuV{COnOySC!k8CO5-L9ifX0tD3S(C)RdklB`0E!N2j#fF6MVk`2@hL zFx+?F$DlrPCE<`HbktEJN`;FZ zund2RCVo(5Fle`{T#$?6)A=CBBCEX0F+Nx`HfF=vaJNmtnNNH+&auRUb#^V?;oy)u zBi&&B&h!ZeHWU6_dzHZ2kVMF~yM)A(7J_(WL7nNwqxNm||bEkPyBQn|Q8l#c;p8R%;l zsO-mY_d2>o&C-lX6Rc%Q;zGMV9try)Qe+HEcLtf3A24&bK1&!$GkR`fMUt+ zR3_UV*uK~hX*I<U+-^0)C(mKrNV5wwY7X1dN$>*Sj;9FtqeA}FokfpP)A z-1H>C<@ar-7nf02k3bFfcNc@yN&QL=YQ|5XH{M?}lG`r!e`?R%7zGQ^He1hupGVM2 z^OqkMujBG5<#4yH!cm=1A2+get5qzr;9c%JY%?y-nNc57oVY2NR=dp_p1{q}uyaV^ zu!OWD?8fuVZd^=_$BKbKEadL^Qyae`>%MJaT5E)(Q+2GUfAOkLa@@ zMQO?v@3rg>mxSKK&=8r5SteJCd7e?HOT^sfc!!!W)i&)KOdLY#HuS4~rZ}%_%w_3K0!6PP}H=9$RDg zd7!ij)yo~4S2BCVNW4r0FYFWNnr=+wOwr=>cv^x``Y5df%Y=YG??X}IaM&k6kg>9y z8-(3!YB~nkL`|2e85SQ|&dY96T7KuRwPv*)8afkryME7fSp=H-rl)wctA~xGNPmzJ z*$B^46Z_)cX!juro%31WACS5`yF7LXx=Drqzta9scMFW}_?cu<>>%LUZ+tOf(;wY; zkE9RJo`K6RMkxx}$ zj2I(DLa%J!7RkF;(`R{vW(CTzFj9|5DXd^WZ17gd?^t;z%euf#V90S&s1E<+sE8g- zyBzUgX>sUd>FB{J5}s?ERxQVz7q*F$kO&r1MC4>H6uqg+xkn$z_ayE^2gufGlHU0@ zH$Il%R}uHn?(Mi!y5g5rpr+&p?RR2;vXTOA3~zfYlc9~h(N8~LP$KYulaYd&&OKJf zW}X?j?*RIY5IK!gFVd3Qf{WbFN5J*DH{|e`6PKKU4#NyIrpoMcYiug_fZ_>Ntk?B9 zdZM~Q(I8RBE3=c(xN2WuW+R4jJ>8LoLz)*^vP3@Ym+-)c`0cNYKkcPZ)^l*7dh!}} zWWi*>#-4G2KIUy|AuZqq(er~I;E1sFr~nUcvUZBK)reuN2*6kf1@tA&!AP19kvx;^ zpw3-vWQ2q%81sRONKdGaC8|Y`zre*(-Vl3Bfyy~lWAiPJ;T$h@O5ufkXX}B<6@M+p zcc#w=r%@^F=8R4Y58)^1Vat^a;D=+0GFCTVdfhM#l7HOBEx8xY*UxPJ|!gjbj;d7Kb(7{MPGuMomNRyhp%> zd8Wh^T+^c~r0#B=lj>RrKG5u5WAmug*aN|L2wZTJERL13@|`MqYf> zxQLGIQ<5#mbuwlE8S88!o^O~{MIl*)aWESdsWiLaXT%lDbhSqMG;Gk&unI?XY6NH3 zJ*FDD)IP5+$X8(3Gwn)GQ&vxgdBmWDH+)yw^NNhK;}x=$;ZT2PukSR?#ltP7={X_o zXiKTL+NLB*1gHzD@oFyXQx1NdhhhA>_WV>elnExD>_ETuBDouj=e*O$J$*V`h#H}E z2N7z~rqZv=S#$*M} zD@OCN#$1UKx2o`F;v=I*T~M%qe8+PH0!y-zRx3&Q%0m{|i@tyY4f1>dHwSW$3in=G z@AqcybOJyU*BKl%0-{5AnmpY4fjKm(hfqr@W(FSI66BWr0kpsM1Mci4p=_nClN=4s zup9+qPxX$1*j@$7YA?EBV^6kC0S#`wOr!Aej~qmn5_v35lV>zf&eL*~zHXLoJ*_My z)sxy{S?bh4uRj^;h#ufz$kzSAPdwRB)e^3{vWMFK%|bzf$Vls_|>ySF}Ng`(O9%_c^0W@I}>}+kkw%7VojAHZ?Ang4f~0(+O0aK*3kt z+)*S)zM-t6@NFmC=}+9yp<#^L&7VKh#gm)2^^P&mPg!sBX&KZYf6K^GkjJ$XbOivC z5fMm6ce@O~Jmdarui@7H>t8$Jm#X|nJ3^sYK#FQ!;fq^H8*xF8`Rt;J(-P9KQtQad z)?=pf2Jrn1M}dxhmj&_SI(Jd9vt&Q%g9`iDGY&v_q${xmwBXjkG!AxH#Je<_Y#(aY z-R8|~fmO>q`oj&Z;%qTa=8)X9nO!R61UhNFL15Oxn zYY~)^;cpdaCs31h{SPX*o!b4Yf?oo-{R&b6XjTDIfm_yro}+H+8MAcAqzwKBr#R9( z0tqQu!$A#cvt`fx0vtF#X^~|njv%+BX%sfMP&iIilm|IEOMT<*7bmBc&^-o*HYTB_ zD?Z3U&hN}UZR?a1T#iCimB=0?iA}t)aK?fgd`KB?#Hxs@CY>yiR?_?tN#ZHk`%uffhAz_xs!3OO}fhHDO@ovKP z5uTUjSNDeEyB$O2{7*8t^OF5{F!-;*;2#<2-^#%8rwj%GAQ`|n6G+$%84POdX#A3a zz)u;R1}!%f5z{{g;BUXd!KRW>kz8uu`h4C3lEEZUUD|ZT7ddFvY|?ARJdg1ZleM^r zg0mucx8`)#YB`Qoq901}D;@;79M=6=emPLI0d)@SlTtzzhF* z`o>*R2nb8ium>vq>kt2Q|Nal+-b#QUqHssr1NkBTQ;B~Z$Zx;ht}KJs20Y3A9pyFp zy_DM#7Muc}1pJQD2+EdmPhD<1C^!W?vE&`4nDAZ-`%eQBoC2OF?2bZ4aWCaIYZy2M zJUh@G#U5}k<<|WioC2OUmJnZeRs21<9 zqToSr-~{lXgge5G5O^Eh8=?RX1o!2?1LBMPH^4j3esCbTfBYQ~NAwm5<{f{pw>&r$ z+@1Fh+9G}n{mZ!*oB-|36^<4RFBS zz7sg*&wYvCDc8@zDfiyTpR4h|1EjRU0e5Tj;MMqZN%?omdmV7fy(7z?OSQiPs$YNu zZmV%G<{ diff --git a/.github/workflows/deploy-rule-tester.yml b/.github/workflows/deploy-rule-tester.yml index bb6b2c14c..908c45f3c 100644 --- a/.github/workflows/deploy-rule-tester.yml +++ b/.github/workflows/deploy-rule-tester.yml @@ -43,9 +43,3 @@ jobs: with: app-name: ${{ env.functionAppName }} slot-name: ${{ vars.AZURE_WEBAPP_SLOT }} - - test_rule_editor_preview: - needs: deploy_rule_tester - uses: ./.github/workflows/test-rule-editor-preview.yml - secrets: inherit - if: contains(fromJSON('["push", "pull_request"]'), github.event_name) diff --git a/.github/workflows/test-rule-editor-preview.yml b/.github/workflows/test-rule-editor-preview.yml deleted file mode 100644 index 1523e932a..000000000 --- a/.github/workflows/test-rule-editor-preview.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Run Tests on Preview Deployment - -on: - workflow_call: - workflow_dispatch: - inputs: - pr_number: - description: "PR number to test (for forked repositories) (leave empty for current branch)" - required: false - type: string - -jobs: - end_to_end_test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - with: - ref: ${{ (inputs.pr_number && format('refs/pull/{0}/head', inputs.pr_number)) || github.ref }} - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: 3.12 - - - name: Ensure setuptools is installed - run: python -m pip install --upgrade "pip<25" "setuptools<82" - - - name: Install dependencies - run: pip install requests selenium webdriver-manager selenium-wire blinker==1.4 brotli - - - name: Print commit SHA - run: echo "Commit ID ${GITHUB_SHA}" - - - name: Run tests using preview URL - env: - RULE_EDITOR_USERNAME: ${{ vars.RULE_EDITOR_USERNAME }} - RULE_EDITOR_PASSWORD: ${{ secrets.RULE_EDITOR_PASSWORD }} - RULE_EDITOR_URL: ${{ vars.RULE_EDITOR_URL }} - run: python .github/test/selenium_test_editor.py - - - name: Upload screenshot (always runs) - if: always() - uses: actions/upload-artifact@v6 - with: - name: selenium-screenshot - path: login_screenshot.png