From 4ef7947a0d4d7322c9873c32df07edf781e45352 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 18 May 2026 18:00:19 +0300 Subject: [PATCH 1/7] Commit native theme .res files; add native-themes-sync workflow iOSModernTheme.res and AndroidMaterialTheme.res used to be regenerated on every iOS / Android / website build from native-themes/*/theme.css via scripts/build-native-themes.sh, but the .res files themselves were gitignored. That meant the released codenameone-ios artifact, the BuildDaemon's sibling cn1 checkout, and every local build could each be producing slightly different bytes depending on when they last ran the CSS compiler and which compiler revision was in their ~/.m2. Commit the six shipping copies (Themes/, JS webapp assets, iOS port nativeSources, Android port src) and add a workflow that regenerates them on master whenever native-themes/, the CSS compiler, or the build-native-themes.sh script changes, committing the result back directly (no PR). Pushes via GITHUB_TOKEN do not retrigger workflows so the commit-back step cannot loop. Downstream pipelines stop invoking build-native-themes.sh and just use the committed .res file: - scripts/build-ios-port.sh, scripts/build-android-port.sh drop the compile + cp staging step - scripts/website/build.sh drops ensure_native_themes() - cn1playground / initializr poms drop failonerror=false on the Themes/ copy - maven/javase/pom.xml drops failonerror=false on the simulator fat-jar copy - Ports/iOSPort/build.xml, Ports/Android/build.xml drop failonerror on the modern-theme copy step scripts/build-native-themes.sh now also mirrors directly into the iOS and Android port staging dirs so the workflow only has to git-add the fixed list. Run scripts/build-native-themes.sh manually for local iteration on theme.css; otherwise pull master and the .res is already in place. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/native-themes-sync.yml | 84 ++++++++++++++++++ Ports/Android/build.xml | 10 +-- Ports/Android/src/AndroidMaterialTheme.res | Bin 0 -> 82114 bytes .../src/main/webapp/assets/.gitignore | 5 -- .../webapp/assets/AndroidMaterialTheme.res | Bin 0 -> 82114 bytes .../src/main/webapp/assets/iOSModernTheme.res | Bin 0 -> 85528 bytes Ports/iOSPort/build.xml | 9 +- .../iOSPort/nativeSources/iOSModernTheme.res | Bin 0 -> 85528 bytes Themes/.gitignore | 4 - Themes/AndroidMaterialTheme.res | Bin 0 -> 82114 bytes Themes/iOSModernTheme.res | Bin 0 -> 85528 bytes maven/javase/pom.xml | 9 +- scripts/build-android-port.sh | 11 +-- scripts/build-ios-port.sh | 12 +-- scripts/build-native-themes.sh | 24 +++-- scripts/cn1playground/common/pom.xml | 13 ++- scripts/initializr/common/pom.xml | 13 ++- scripts/website/build.sh | 21 ----- 18 files changed, 130 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/native-themes-sync.yml create mode 100644 Ports/Android/src/AndroidMaterialTheme.res delete mode 100644 Ports/JavaScriptPort/src/main/webapp/assets/.gitignore create mode 100644 Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res create mode 100644 Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res create mode 100644 Ports/iOSPort/nativeSources/iOSModernTheme.res delete mode 100644 Themes/.gitignore create mode 100644 Themes/AndroidMaterialTheme.res create mode 100644 Themes/iOSModernTheme.res diff --git a/.github/workflows/native-themes-sync.yml b/.github/workflows/native-themes-sync.yml new file mode 100644 index 0000000000..bffdc0890f --- /dev/null +++ b/.github/workflows/native-themes-sync.yml @@ -0,0 +1,84 @@ +name: Native Themes Sync + +# After every push to master that touches the native-theme CSS sources, +# the CSS compiler, or the build script, regenerate the shipped +# `.res` files and commit them straight back to master (no PR). Every +# downstream pipeline (port builds, BuildDaemon, archetypes, website) +# just consumes the committed `.res` instead of rebuilding it, so this +# workflow is the single producer. +# +# Pushes made with GITHUB_TOKEN do not retrigger workflow runs, so the +# commit-back step cannot loop. + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - 'native-themes/**' + - 'maven/css-compiler/**' + - 'scripts/build-native-themes.sh' + - '.github/workflows/native-themes-sync.yml' + +permissions: + contents: write + +concurrency: + group: native-themes-sync + cancel-in-progress: false + +jobs: + rebuild-and-commit: + runs-on: ubuntu-latest + container: ghcr.io/codenameone/codenameone/pr-ci-container:latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Use JDK 8 + run: | + echo "JAVA_HOME=${JAVA_HOME_8}" >> $GITHUB_ENV + echo "${JAVA_HOME_8}/bin" >> $GITHUB_PATH + + - name: Cache Maven dependencies + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-m2 + + - name: Build css-compiler + run: | + cd maven + mvn -B -pl css-compiler -am install -DskipTests -Dmaven.javadoc.skip=true -Plocal-dev-javase + + - name: Rebuild native themes + run: ./scripts/build-native-themes.sh + + - name: Commit and push regenerated .res files + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + # All six committed copies are written by build-native-themes.sh. + # Each downstream consumer (simulator fat-jar, nativeios.jar, the + # Android port jar, the JS webapp, the BuildDaemon's sibling cn1 + # checkout) ships from its own committed copy with no extra cp step. + git add Themes/iOSModernTheme.res Themes/AndroidMaterialTheme.res \ + Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res \ + Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res \ + Ports/iOSPort/nativeSources/iOSModernTheme.res \ + Ports/Android/src/AndroidMaterialTheme.res + if git diff --staged --quiet; then + echo "No .res changes; nothing to commit." + exit 0 + fi + git commit -m "ci: auto-regenerate native theme .res files" + git push diff --git a/Ports/Android/build.xml b/Ports/Android/build.xml index 7fbc590bae..6be4303383 100644 --- a/Ports/Android/build.xml +++ b/Ports/Android/build.xml @@ -74,12 +74,10 @@ - - + + diff --git a/Ports/Android/src/AndroidMaterialTheme.res b/Ports/Android/src/AndroidMaterialTheme.res new file mode 100644 index 0000000000000000000000000000000000000000..51ed4378853b12df9f8a38cd05b33aa01b8e0adf GIT binary patch literal 82114 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 literal 0 HcmV?d00001 diff --git a/Ports/JavaScriptPort/src/main/webapp/assets/.gitignore b/Ports/JavaScriptPort/src/main/webapp/assets/.gitignore deleted file mode 100644 index caa62305a9..0000000000 --- a/Ports/JavaScriptPort/src/main/webapp/assets/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Generated by scripts/build-native-themes.sh. Mirrors of Themes/ so the -# JS port runtime picks up the modern native themes. The CSS sources in -# native-themes/ are authoritative. -iOSModernTheme.res -AndroidMaterialTheme.res diff --git a/Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res b/Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res new file mode 100644 index 0000000000000000000000000000000000000000..51ed4378853b12df9f8a38cd05b33aa01b8e0adf GIT binary patch literal 82114 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 literal 0 HcmV?d00001 diff --git a/Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res b/Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res new file mode 100644 index 0000000000000000000000000000000000000000..304a1ec93f137fa2d8f87f124a170be1ae10feae GIT binary patch literal 85528 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 Zf*c6K5XW#BVAH - - + + diff --git a/Ports/iOSPort/nativeSources/iOSModernTheme.res b/Ports/iOSPort/nativeSources/iOSModernTheme.res new file mode 100644 index 0000000000000000000000000000000000000000..304a1ec93f137fa2d8f87f124a170be1ae10feae GIT binary patch literal 85528 zcmdsgOOIT~mFATna<}y$>%m8n6h&KZd%D}EDY7Knv;mhWx7un*wjk2z?%gD-QdGgk zDx#`rSu+^Gi&+~D^lE;_X!f(TXEB=wdZ9ny&Gb&dV3sv;;zZo|zH?68Dkg=7ND5V? z;)^(s?>r*%-kX`jmyU*Ecy@SZczzf@8@_ty!}Z6Cby!M!*4cJ}s%um9Jh;k=uH=w*jK*qnf zZCF7Nb*~|yYVQ`qZ{GaL5Wscy)_*@5ishf+~_i6-Jvwr^bzbj_ZYBtMgu4|8uj)seD6jLImg%eQ1 zl}G~WckT%>)xE%b%bT)3x+gG;zrYqScviu^`w#YZ=evhQds#SQ$h#O8;pqCyMz*X+ z?MH*vj;l4tQw*JAOX%d<{x-Nsra(4n6rn{_>fEElC#;gR_YjVJPW?gLPOhGB% z%+=j6mqDje>L5Mq()223W#2V2YGe>Kps>83hHM!8tZI-vOuXJl6WH&P>ns zUrx?ssXaR_tvx$EdD=9UJoJe5GKa0l*J6@TvTbe7G>1HowK9io=5ZX_nJl$u=QM{+ z=5ZXhnXFg$WM%r!_Tf%D`v`m3Z4|Y<#WS!Zb!R{gBI7tKPy)tTt?*p;=AazRDwM;v zc#muh;u)yP`|RU`-At`vJ5_(1smCTCiGBv7}OVRqjg=6(6-afwvJsu z1=_^Jp*?!s%Jy)k311FGtMuhDtnAq4grJ2H7}}|g1++19z&_@w3A#Y&0tCH4(dz*t z8_oAnXgmbn=R5GoJ}u|4zcaf#-x(8Jb{<`z^{JXR5T|L*-IvET+-5KLG<&VuzR3)YXf zVBJ}u75dBFUw-hx?T@w(H$NOVGPwk(xriuMXn#hHl)QA&Y_&2t8@&}ML8}iXaD|E; zy*VgHE7Z$jTfEO$q1XQ99|Be|v!r;u&oYDcX#SuzjO!WWy}btyACx;D6dGMlu#HV; zN~J^$)s5CkK}$X>cU5T;%Fs=MU>~3EB$T9Qj6f3G6ZnN8l62@yL1lsKHb|e9v?7bx z7R}uEXItBQ-5m~58zap&JEPhuH?1|7>gu?eK#@u*)tyugmhE2I2_&IK^%j(whH|tZ%><5^WckE2l%`kULTPMQ z=p)8Wly)bf%8&>fyJ66qOU5#`NxRqW`ObXvaK3eCc9#w?QXtwNaYnVIbtXiWN1Wqz zh^aV3U+3MPr>Bc%hkNa%_z!=0v%Jo07-o*(m9V5M7RFf$L+>MsT~?ltcqz$XE^{Js|2khcjO6NE_PcK{=EJnT zJ~Q+_LSzGLFLm-@w(HxhUJ1B8VwS%M$GDd|qV=e~UP)~laCOPvakb|;o`Et-6&e|A zgZ09)9^t6NdTC=Z?jEBRllt$>f6Es~OBL4D8Ml$>%|Sa$6*@V`TZ2+c4U!Zenf@%4 zRdO_t#WqFW*(mkqpuUI!A1xEl%s1Pk&jJN6jrICS0We1L^234EG&#_hRMuD9zWb2I zx=uDrJVC_=2CV#yP2S2{IpRWENEk85Js$uxkPk$#4 zls|7=ssBoU|Fry+J4#J9+N67Y!_bdE0WTOH(X2Tm>l9II&8V^U=mfU5NQhjtwDIi& z-q=I?A+B$y(>_I9Pl?I?j9@hhgC0do^wkWmozjXcwcFQ~oCTsc!g0NJ4_?o@*>a4U z_scTOep#05ou8_m^=i2$?CyN)J^LW>m}C`1zU3yac63u&1hpf#U>4^10N8S@IPVGhNf z{w$QG=LxpRC)g+Dx)#qv?t2W#9Ml&vU<36@c{Rz}LXPJ9huh)h4&A2j5RMU(Tqbqv8O)^WtE5pve>4`JB(P50gPCW0UNP;!G!r{drHx! zqdGkpE6u5Ff)&CzNnQnTC8WI@NzR;Euy3+Pb6qQE!O}PDT8@e64kw_58nmL_*G@ff zjs{{70`HOkc5R1NBeC_8$T)$)aym;6zO_By*&187C@x)Z#4PU-UR@XB%f3zPr?uDB z;#cYM<7&@+JOgFuYgKVwy^GklURe4g9CcVPZSG?dsTIsY%if=Fr?-O%$yL0RS4++e zBh+#)L+Tt(FrqPYM6^B~<)7IoIgy_Z#+XY-uvk?G#WJpAKT#X5DrdL6ieoJLJc?_} z@d(zkPP7)|YCS<_tS3I6<QXD?YR_~$ z17(zIGBVf(>!oEq!cm9y(z9Q(ezb!1Lqm)Oaf3TMQXRWxhFke>s_(wRdFTBut*3FjN z$a@r}vtK^yC1^!E>(!IYuXfX_?)?$$a@WRGyb2Gi|^n086&FRlxyY_=O-g;|Trs40UTXer3p1tnUthoVYO>(m#%6gFd45y$d`m7byuEukeD$>-y>{)|ur}hq+RZa*#_K=2F?@St zbNAKn-QC{Zx|uKZ_ukCEgzTvi-<()lBOEOI4-?Bc@WJ9Kb1@%+rQfi6{RakIC{A*` z)!UcisoXoRwW~;%@Rfo@XNl2^tfpXg)-zzj!h<6P!GipkPpM zn`a$RjkHO}WI@HyY|O|`1DaY|-FN)+;9& z{q6qt7OYv>_%J={_c!++9Dbaw2I$3&?fbKP^LOWmv#r_TZ1~cD{x9j0$oB5$&O>>S zPz=qp%SDs~?H&B!_TlXC;lZuh{?F4V{|##R%Ep6qclPi=70mWQ$LhwuynDc3p;%x4 zLAu70!RYeD`ugkX8p*+j``f#}&R2G<@hck#`I(zLA3nT)_w95Q>hRrnhp$|_di}K| z7NGa^qm<;j$TQcIdjQ?uobAm2arpA9SJ%_!oC548x6<2%e);flC*5$?4>NprGyh44 zqj1vSZ*LubIBLH{lXi=sI_H^d%?44GZTN@b%h#{I7693}*M{de4)x)YU%mbI&xWt1 zJFs%8CtY1i!|(0PHq!?(?j9Bomt^qZt?iwi_xC=+NrMw2~Tvh zo$Y(O!&inC9IQ=KF0L*UpwHr*9scLte0MwK|70=&`h=%F#IsAWvr<__T24JS%*Cy&Yl)M@?vQN~B zf*l?snGOjxtseJ$z#1^BOlc>!yc{F!kTA|`6gNy@IVNjrOKY#4y5@z9MGY&DPelKT z+V|1fG4`p7Yr_&}7q4WLj&ZMFWuc(0D5 zc)?a)U@%f?`{N(~_pn537AKB1Y^SR=e>;01O?fy^8VVwxIsYYNR^eOL3@fxq8P5Rz zVx7pjLxgqrQgw}#Aj7H7My#?WnqO$63m+DnWMrvXOboTj$j+(Jj1Dtx8L~p7AtPr; z!MvM@?-oN|TDTs!^;#{+(FJ22F=ZDbUuVq14r^8fau;ABgBOh|%&PR3xe?7hxqJhQ zu*=BEZE9?-LLaZSu?FO|Rj6nnR(TO}+CnaiI*jsihJR-r&5Ze=G(ILHwGy1)|9SxJu3Su`7l(d5%@ zb|+x45KZOb(9Cm9Hunx;*nw!Q1JUHOR&2*`Cj`xpz|e_HRvWVo*&z8?_g<4j0-=9q z6?z9bG*LxH0D9)3&@ad#TS)1XEt}KqZi>2n7h=iVI*gSRK*m*E)d^$r2WJ^q4b*cL zr=drKluHHCwp14|9F;LFM4Naxv?t|WmCbb_d^r%UN^#+p9nPE(v@ilgJ5%bjHf9b2 zgQ;(VUXpnHMxm77Rp@kn<194as7+94e9CW>z@`I_46Mj1``t{RefIw}EET{U4?!0* zTsajpoQF>5m>Dp1JI4$sqJKx}5DosJmCFW*GM*NrbruLMTSE<;_rhTSqkZT7>JE>A zAhb1xLyIqaoy;ah1#7@1g{^{|fHh1Lb>K9hD-jqvLP;Uo*bU;Ap%?YdB;%ViWnX)t zj!j%Y_#pq;eBIoST2HsQ@#p*We+jAc|9x+97l*K{#nB}ke;S>|Bgry2i-m_IbSe&) zmi){&h|Rd9=Eg?49t%IiIZ%tK_lKdT9vWH4(7>9G9pmZ}Gz`WA1ZOdH+hXYY86&fknpOl-5MY^xbhb^+Yy2558dd0Y zdLRr?G#*t zXlDvq*PjyF7DT}()@APin?Ad2ccna3prD}zn61^rJdEnV0Rc?wu-zaFqjb|15|4wzAzlJ_XM&-`d;R8r;Azd|4mW(FV|jAg@k+0z*bi zM4J?*idaDxPNVik%qPicx&=bB$v>^%8kW)v)FWTo0gQf?vj?tT#JfNX`WVBZrzM-w zAPy1br&MDlf;h6p?m#4g@>5nWLV?qO1VmuyKINyF!p@f+MA>2JG`w}SQnCzVSglJq zKJi-kiF)1#oigu8Sp|QwrJXh7$k7>#JuN(0$IRofg>#tT`(_VN`OzODDYaGh8$daamyrRT|`3&{ME#aSBj6x{tZs zaUGYU+h#m;8L8pj@A)eUK1vW zH@A}}UJNEnh=wWik_$c7NqUn6;J7Pes@Y8$>B`tdGCfgSk#)?p*yJm9F7bU#qtsil z#bzwsolT8ufw%iv_A!O5k(~sxA~1adEKDA3vEmS>PP%dhsl&*n$q&nrHk>2}AB=JL zo_-L12h}u7AKot#hT$Y1h<_#2L)S5qtd}QdsYMerK3A)1I?0`nRJs92VteaO?q!!7 zsP7={Gl9v~_fyjh@Ak>RhrU=$xXD>L^^z=AvASq;V~tG1jJI%neiu zV_isJoVXq8VsS`YcScCrH$zAHG%%#y?i-WyG~XxZw2V*EPF9Cgwqda1{Ih$qi;x?r zA)C^Rft&KT6TT_Y7{p`dg`xb;M2I;5K)QcB3UhSm4ZBoznZY(at3KsT*M{$-)Ba_k-2EXb9rV*y?TeL$B|I&au&vYPrS!* zRK5iBJ0{>#G{lUD=9~lZ%!4v0A+NRCf>bhce9%&Z)biAk-GrfmG#Z+xLGpR0tgyi^ z`0t@x(jm+=F%5=m#mn%EZFW1uJnHoakd0wH-DG#72n!2G`I-d}3rY1l#YQq&eulG6 zHZqdlFQfqa`1LY0wy;O_ugFB-o>!S2zsdsisSSnxtf)M$5pk3N^s2CHcj8C&jpU<; z%V<%@Pg;!LS|IfKJZj)5mJGm36f$5KsVGS-vmZN&OF@riUT7}E(cLOA3Mt^>kbsiJ zBAeYW-1Fe`?`$8mFFTaiBd7BSRyvPjI8TjpJF#rSiWfpSs7RyYL>|RoXGXzj?$My; zq6yFCnH}{y9aWDbq1xpvjO#_b$8l7?1oJy4;8HZijECl&1M$p*@+vW|drAwEO*ReE zM6NYqXdsP-=4p^@qNPW0v)OF$s*Jrq-%ZzA;LETi zPz|M;Azjz3#W*hW+SXp&#T_>w&zk&GN+u&6N%xR2UJv^9@8JR)ft050tAS|vi!eN9 zp0m*nRHH#E8qC9?vEY+-ml~mS%_44Z67I7Wti4U6lot$60y+#)wq4D6=?1FXP6Ik0 zfguH#tTP-j$Y80S$`24H!<`Hkh%-2iV2;TIu?#u!P{;^muo%I7KP#&mGi9dMW2moy|1;BKO5D7W3`<8nnHQP(2A-beX)_Ygo_^>$V2l~5*<8(6gwD0N#`%cCs$ah6L~3Kr<6T#J>+RCb3=2ml7 zR%xa;tgM8qY<4w=&yuk`3 zn#72fte|UWUIr3_d1W^s$A%lI^mrXelDD%%l^27Ag=k2dZgofuX9?z-)O4@V1mi+W zBb2E!1L?#<%h&?BX01aiF*RQtL|ELsTVA1{71Fv80xQ(diyoXCXbUs77?* zJn_~dRjq2OrVe3V4AK^&A$hG6R)w4~nATF{aVNZfRWL5SG(troGmzBQ33c`2d1q}z zLNRn=L5EH&0?7=pkV-5)QN=`JWEp8WexuV5Z*==%Lc0A>F%Am%L!D8B^84TaGxWoP zEtKaQsUJ1gR8kz25sMzLup&xO(pk`pPnZOSPJ%M81w~c$sYe=GKfJMEKio*VF|g=< z>xVav?}s<8qT494=W;9lw03`fz^@Zp9#(X^AJ$n&Pb;bsT{us?wMdn>wo|}f4AK^& zVZO9}SY6|c!JL#LkNe?`WBZ}bKvG*jEZD-7S{sp24Bd(Pp&El^TJgO+#L}DUhc~V= z#VyCzJN{h z)(_V|mwvb|eQ$iwuJyw_9=VP=fo_}e(B)SA>y!PkqSO7b&O&-xQH|)rdE%`_s#-s+ zni3ij=EWdwAsUj``e9Yb8Pl4xb$P6N!;!WCg#lxbiFaPnH?bH;?e3Ubjwf)06opdwUQGC?PA? zAJ3seY_uZ%tOwO14=iAn6T-YzyiHWnIQSd0_9ML0a}dSTOjm&4L#sfZoah` z!J3Ze189MS48%kmM_?xgg3`raUOoBs7Y#?C3xg6^+zCw}2m=(uVVEv^vN=U5)ujQ~ z2Dkplf8>^;V9-)BFh)?;ovhIj_acN_N*dvoB2#MYvRuc~?xo=y=PqvnSe=$DY`aHRX`=K~} z&ZAGSFmW|K8L6z^hUA(e}BK&DdvB-IhO@w2FB62!$ibP?wI(QhfmxGvax^d!4gRMKBZyFhWS|aKl z$9Q@aqsdJ}Xz9e#i@`{SXc$Ls8h#t(^x_Dwyg%F8-Yd`V*5IbDG@L^Kw+lJ3Il%Dve${ZXsRCjy>L(YBH+lpT(dyY8C?7Yh82aZQ`L(eN?d0mGET`M zOFMi!A;@+FhFo8=UNF-Xeuh$!Z6D0H=uH)05rScKY}JYSR9A>h?7`Qr{a_}KfIbm# zt6;av>)rakiWE!mS@x&;9-Tz2K`K}B_JI^Wi%#%$_r})x6T_Ext#F3#t?=yBB9;@~ z8OP4z+m6>%YEiEmI!#)Pb@Qx$4_*vbV~9#QZlr#de}0$#PCrBH)+X>+bh&>4j-)Kn z%Ebxc0!A`8(>p})awNeaApuO4?v1r(E|806*G*6Mr!5A^DfmR)T)X!A`qryYNS}$E zE0x1pZ+C09|FM3;!kAF0<)1NF;k?`*ykJrDEXG=Z7YXn_g-A*bn>@37E|9YL77}SI zp-cXzS4V+14PJ)vS0oC<*TE%#b#LBC^5kcDIZ%sXN>6;48A#EJ#TL$Ms|BgC$+X;9S~iWQe37@wT)@%I8+F}-yZL@*VrQ7qJ z`R3t#>(1v{G7m6N9hzQV^4x|4 zOkhv)Ir0<~k&Z1W{Xe%LnSdds7L>t-3(s+Y;dEAZg6V`{C?hZoB()&%3d49bP;McV z-fet){$RF0JKWnJAKCcBAO4pFz7FG^ssKW#6S=sm+?0 zo5~Y$*`K^B-LhWwKZ73gF%USy9w0oOwX2>QuAFCuFTCP^&U#-rnEYu<4t$Ia#)JUN z&KcV697aefJ-ugOjZL5w-$sgY{z<3g&Kji8s}5Ya={P-@P0r9xE;%8XNf8+45w%}&8M7!oa*IwgbWxyR%zm?dZ+5u7 zxBK2~cfK>8^yLQi%h3ef?P9-yfjIu%9HTdw|f2{FX>y) zqG{;Oh0cWNa2pCkFM1O~555s;=IupdGBFMPxYC!_iOYmw^l5rp=-IdXws3U9)X0tQ z-kW66gnOzrLE(mA&eC>vvm8xY}enIJKcs$$1L~c z&H!L;$E`9{*1?@PvliRzGOt~H(>6LVbjH3;wi*E?O!;){AqkGV*LHz@LB8es$jCSP z{~`=8yupBM^c!N?@fjAPzdRiJdal{c9YtE`Sqqkwpxb9o0@4B@Q}K%@hSP%-IZHc4 zIUz__1csztvb=DLK$>BT5=Ma!fw;udNIL(G=_M18ODM4nEu3aX2l8m_>#%49Acr0b z8H5rOUzk4#CIe0Qo%wIu7vM0l8RDL|Hj=8K>3ior%z;T~mUL&J24<9j!D%)(c;NsA zx-dwAy`4Y>f-qPy90u&NcYiWA$W2S!%+2C0z{DRpX^ES4boej=kP8omJX~ZRe9vr| zoej|mQQr(DA#EnikJ~>(eMn(wd56eQ7}D9B5R!T&B9+t2q^dLxd;x5@5|~Rkjo1>F zNyxV;;S7IXB`m^_>%iU)(}Cm2a}0+pn-Uh2m}8Rw3_gGRqwT}Z56dOYao$nT*%4e z`0E^qN5_vwN2`(IXmuV9e4$9_7+05|VK5dNRUOjOuZ*r1McjMDEJn~^M$qgPlGZVv zm!k^~2_0D@CCqP48p+4%Vs%``YJ$ld`EeZG!*O)3CQT{7^!l!wG%^JpLy^ZNjjUy- zDyuyD=lF!qbMimcIZ4GA$|E!5CBIX30B4PZ)qh#~e4V-Y-a5)H{E67%#VS|xB9Gy( zaZzC|S1JyMjcBz>MRtZE6M|m-nao?&re`p^Rona3SY@*E2&Lb7tGRR7|XfovoWEbh<;3z0+~4yiob2*PyuRLemst6l-m zq{~1p2jMrnt%J&L8!+6SnIml9WCu}Ixa#+aWLdF7nfLzY^JSQ zXvU%R-O_33?et_fHKCO{i2JpaJOSv&GOp;jLW_$#xsO;tT*3yE|9u`cbbLUIgxKs@ z$C}Y`v;+r3E6!A@T;yV*fzTESN47;*bu2Oh&@K;!)?Hvd%+km*R*x7?0Gd4pRaSJ2 zrp0Ko1wwtb8fAbdWlZSsP*KqcDr>I&NC==xKn3 z&R#UC(6RJIwSc05(mktz9pi8*8fL~rqa*@VJm<79=TS86oLk#5(2GGcLo_t@C8v-% z#7JP4+axIY+&=FQ*ME*5lXdsP-=4p^@wxzom*=#mA&y|nsN?%S2 zU-v8(BpvwxAw6r^;qk;JYlh*I6Fil@#*%ISmIeWe6;|aD^!XTohrhtSl3n?=PGE#4 z+4wqhqdYJb2r8k>f?`-=Di5#Y&v4muf`R-bA4h;RbjQRPT`|GzxM2jK3myv1mo^C2 z`JG3OGQk9mdJHZQ_s|TaDx83Xg{E|93xy$hy$K+iIaIA1xR~cG> z-@pK5H-M2_Q&(a{huJ_7@*2Y-tER3*Cv$27&fu9l^Zmo^@J+I-44HdV2DJC4Jj@ri zQ%fAy{G`gYe2K%^0ABpUwii|cC)-;(HWCfeur+WQ#b1HZ95^Q^!8vfhOARsoY$R#& zlNzF%im{Q`XEXu1SvJtZyciwGiHU!Q4eJn{>H(UwKC7ecV3Ckqp+mvvI7f#i{ zUgSEkx5IQG2zid-kY!WC;vaKt5`e+ea;x=?{rPNsl_YmVPPI|pzaHfiX0NADmBpX$ z)Bh!;zR}~O?XANPZ(e)w+bi%>!Gpt(cjh;D_jc!3_*b2L?zRALthx^M?*lF{K-Fdb*xGIW$iLnl-B zDo*mAB#E2$HpZTo)U{4y3|neF?#^koU_33gov2z77~22~Bb>HWiXta+D+Oun_4bYQ z=te|FCStE&tL#4S>WkjC@=jfzQI_g$Z7U-SS1?nGQD;g!G3VtNafgKQZf#54;ApqB zXY55Grs^$xco%z)W+r7?eZf%(j1!0i|^G&2WGvY zwUhQn0Oq}i!o*MKQ1qpn;njbs`4`)o#eIkBLBFATIzGcf^p}T2U(YqW{l1-d1`TQf zpO#E^ZeuJV&mMQ{c6u+HK2_S2`zl?&i3KXeEjr|7xaJeb;T(ilEYVhd~B%=;Y=8=siJ#! zRv`k~o_%UJy=V3}^PBIcJEXVvcD4pLFbrSb_@{i#AD5$hpezlGZ}oyg{X1Q(A6IhG z6)(}quj|}J3@p;nxHc3TR&3Yot)#A~1?2<)`vL)I^J!eMh~*?1?YBVa#d%cE1ectV z)UNIopJgb>87vRT8LkbNB5uIsj4VgDz=mUTMpm**%jzu;sz7(SR0ETT%jM~>-PzmQ zxjWlW*Jvas6-otxRID;oZzhzL`4a%mYD@+Ll^syHOc&Njr|y6m!CyuI^5!8-h>avg ze$qV=($l31%?1Y1WMHskE-XY-c{nulTr<-boA!(x9|cPoUZ`Qnqv;W&(N&#>J~_`^RZk^FK4o9q`G_ohnCAjUGC0#a zMDTJX!66|5OqK2!^$iKfBeI|0QR1SaGRm9Sm zDCyI#IH${=yl}ci+AwJ%vpcC1iNXZx;9(lQ9HatP(ouQIQP>f<&Ev6l^26a6{2BEacdUWFrnn8 zI&J}sovLTznn`*aQeWxNGxZJ_+092NSW(E3oJ`N5GY~!VzJha*0t=w`u)%=_bWR?5 zDG-`E4x*Va)|ncrY&!lL7omAL7@BsbO646vm^2U?XdpCml?8T;H3HCN4~2$bU_H$0 z7!}F1Fm0&z5{0f#psI#LQl?DPi$GFw})5Axc95wG}nEDz!@H{eoK<9 zGE`bq{uY6A27(K4YaT+O=RI5mkKZK_NWeTg>m@9H8Vz(|AOmYV;S2;}P-7TFyO9`| zpW(9i4d*_#kX^-4rN=J%(A zX)e;?YS>Lq2vnPk1l`c6aCyH2>&=h}_(|S69%#V!mBbE#jTmavzQmBl10CqXFbCFl Zf*c6K5XW#BVAHRe>xss4RstHO!f|+Ob(`d4?Y_L z6sX~{)9~bAdZ=;q=AfR}I(jq~@AKhwcaG0A11))K_Nm{ zwBX)nPo{$z+&|cv9vrWn7-;@59RK`tie~wF>#F=K{rBhPci2F!808;)|N3yw3)!p} zRMWI>Nz+2*Kl$@Vl7dVF;X;;<2gQ=C`|0I_VGAMaeEHz^zm$w)wIXJpN=YbD^@`Rm z=2ZYd@cr$7J042Hq806#3J9hk#Z>Xm!XO}7P@ylG3#3GV6S1W}7&r+vY{i}yt>=)u z^YQe-CvWfnw&rx=vqY_`9Qx;Yk^4^o9>sQ#YT94Kx zQJZyK&6(6>ntQSz&p;jAX{`>8q0m!NBK?t<$Umis_0k65Sdyq((Du0`-r3(fO8kE~ z*_)~uh>uNbqY%${JURIF-t35~r`p##(u_y5y*vT`#Oj_*cB;DWjGfuuBUF|DEg{gx z=TU(0xz!;-9q67(gdIvl$fcqnB0l$ea}YT1;Ru}dbl~??q7x%?LRa{p#zWBj`-s{i zh-aX)r4a&Yq@&|%tPUOR&IsM~N#?82M?;gq#|rPxCcFEOY6-r2<-6tBrwFk6LLs&v zb^=z8Sj2VQ@yj}$dt@^Z<7&bk5_j&D3_WVceS??Y3hdVh@v;rIxpN z2G$Di3>?d*V;&0BfN^FGp6lKm)Pq@tdNdaAk&Qt-11))h0p!BRXINFI|)1CgH%K$8xR%lQ4b5;PHe`@UpPF z^Bg%uio}^Pcr*cBk;|LliWYN~-Pzrr9HsM~w;mkL_V-M!5dGiDTUj^_^Ll})0-s{> zN8?%%sa#_XA)rp)Aj4@oGl{>slTq^@_tCOujdz4HP8Pm4GKVsZ_#Db??2m`<_7Q8W zXL;iO!Q*=HL>CSCV%8lR#wZ6OJcn9q%4k*R-_-MM9ZZb^|RMM1Cpcs86#yeAxcs>qM zMo0@Hk!$K|66)ZKwo0toBP`uXsEJR=0!3`Z&iMBy zvpqiYmqYs&_a?*m^yG+;In(RWx+G7VfvY)Rn@q=~Wwf1vI{3KE&d?aRqS_n`MdYQ8 zgZ0t|L5_o)1#O=@*85L)k7nkO5qt!xjY8qc%m`R8Gv=W{4SY_E7@?zM&C5SbzyA1ns<+xNc;>{KW@lUqvZaXn%%;f$o%Z zwptxJ8$Altz}1HubcGU*-W=4!73%e9EL?v$i#U_LgU$)#8EDD-Oggk3&L6a+<$R3s z;r^4SPs)9*8XCH2$jg-&V>2>EfYMMkTJsT9y5K`!|4$dX3V;&08K%TM_ zs6oevkoM-F9=^sw{fXun-9p<_2bOKmdD9FhxR zvXfvJrv=TAyeMZh>pE0vypKV;^SOL*! zPWTol$$vHZ&FoRS)3v`xk0`cl!F0W%)MPLVBSka$xsFJm&)w2o0X96?t8@gl9<9rD`(_R481xs60`4&p4e z?)1z@gIY=rDlI-T{aL7s@2uA7XU}|v#0=OdMGV+TMGW|8nRsSYnj?NTGq@1LSL2ER zV?<{FPAF8gPmaJ!v?!k(DPmbim!|misR(o&XfF)JxVn(WSCl;SayzG}N6P7tLpg+8 zw@+TcO6^eDWZAM7@vU7t0+L;wdLQ4Hl;fhlMBJmpRQ6uh^sL|tKK`K$eJGKdwFU6P*GQ>ALe69v=+}{e-`TEE*a_4m?8!&_q{o2FJiz4io2vnrSTMwrUyr}@N~3bQF4q}+xzah zIf9p3V8QF=AR0MV(V9?8iG|XlBSv`ovrt!wSfEQ|iWtC%^%$TzXfI;GModosH3J$? zDcW=Z;vT;)?MOrzC)(Qru>fqJd83^)EB39%SeCU^kfpWCS{)PGG5^7=RTf+I`{~jTxahh_N^C|{z#5Ctd~9jEk_uIjzA0VpUu*T4v8dD zPYtFeXBMNV>CGZ`4ksAZm^q}HpJ(#VJ(Q^AXV5X`w2N7pn1f=e>$IO}4Oj8O7(NA# z#|U1EYx!C$uGKaXEymS)g3MS?d_2pcN%pgAPc<>JSMrEf)joutMsoDE>=M-fHYqgcho$d&f;%l{~#M+VXZa>(23YJd)#5{UW2QJ<#?q9k1HAc z`1?L1U<}H0T!}w4dMlUdI_Yn06l57B@IW($4aL>z|@0)s4Fm&R)QX4M4A8&z$ zi(;_NT4BKWjnXk!%c5{>O5E)nWd}jEC4fuCe6Y;sKQ7bxA1oe&OXNL^-R{#LBTd6@ z^KgSs(l|gpvPuBQz2d4#*mS?Z+*upJ+FvY2=he&Q!2BGRZDOiZXl$ziO}56>TEQHw zv(>5A%}uFM#B;ob!1m5lbR&Udeq12V>B+zcPSzgjB^^NMhF-AQLTnx%o;Oc0pTc#bzZgmG~!regsx^QgtbS(aK%jFGH@?$$qk?_q#GhsV!YYOa={_u?91 z&CLgZIG^LyUDZK`#OlHxS+Iza-ch(V0^L;|aLy~m-a0`x65rQb-Yb)fPS#1OmvjIT74vO$50ZQA!JZZz9BX9p zTmj_@@9DoElV7dL$6Mw0-yuvm zT_$|Ee>kJ(%!ilWN%uvj2gB<2&Te{Re11#epB~J1V9o0G$0^-@@%YKnXW3H_o!Xu~ zo;;eqKRuf4OpYeQ*Z$c*Pj^*jdk=P>($nk&G|w*gVOF=Fq(|J24q46Q0A=gjhaVrz z_CCq?ajc!y?Zf;`<-L!eKED6UbkFJN{r86x>80p6{^4YY-pTUIy`$m8jRXUh+fgY?Gz^vUB7o*wO{=kE9;GB4f!+3j1mr^BUq(m$H*9DU5DFRB@P zMGH)*0LV@T@Q;TRHyf@xoN!&g_Oo=W=xB2P!`;b)^sNAUN7;+(!&w?UyffR~{b>JF z4CKiyFp=WfcP9_?g8&exvv{I1*_}Pw8@@5D;-Ks}bhmaz3;45Rda!QKP z6r|UdP!hkyi8`#KMXFH2xM2l?^Y{PtzYpiUkg<9}#Y^iJ`{70yn1x6#+qkEelO z&-C;6{`$Y*uUAsuZ+ zt{K%30F@xUI{Z_eN@XWoI%xx27_b0xCv1Tt3|=e_llQU@gic@8h-h1u2&?)afi$8N zAWa(!gGQ7EHMX=a{VdQpRU;xLrV*tfotrdAqDrNw8c`N59aBdGM$`fA#M3FkXhy=Y z991JCuP~D7lZF^-Es~Ou*q$mSA|WNtPS!DwWc~jdz{NiVex~ghHJ?^sOzhI$bXJYC zZ8cWyFTRtZEy)YopiYCWv@$vESa+$rn zo1zt6l%(jmCri*Z7z^DJ*Y*CgR^a=sWz|SHW6WsHnZ-90ZBeMCJwoF8yxW7efV67# z9dh+@q}WM9qPG-rI)kKOsjEnnkigKG6fCs>p@YYD!RE0_{^AV-Z3*?1#Zs`Oclk_4 z?MOR%(jgs}BIRa0BwPxXz-ziC-g@**y|OQK(|);DN9i;{B-9JFL};TvcUG-go;Yn` zmflG5r;{h!glbb+C=&WEm#-OEg>PCjtg1!KcoyIvZ4)_nlFWKqo4-%&3qEWgwv>?` z!@}033s;Aeb;a^bwb&s`4Y6XVO-6Q3R~Q{;+A?HCjfRYztBQ3uCDyGBd1>K#-p*&O zAV=p7I>nS-hd7KXBH|#6@XvW|2c11m?YlaQuwfV>pJ}r@aA6@r)x#mojiy`o z4r15|5v&s;3ty0Y3*)`dbufIKU`k&R)(>X0+DeQS9QXe{J~kqRU_)Tiqp`efyzaMh%MCx z3`cK2hlPkq4~KYC?ul+)7sQtnBB~S@y|TlZQ-TO1VTd!OzP6^BgTP?wo1m8@uHV#` z@>`US=Qqwm_{MA!h2T?uqXrEfc+`SbT4lfUu(Yctz#I>SE@q;VR*uCC=b_U%W=0sg zonwX*(ZBQx5%dpHt{6d-@oF)mvw{%W7Fy7GPaFnf#JA~JcX$jGA=X$NBEIZxYBp6= zum)UG*eb{gC}A3@17`tUiG-meDk;dCc0+NiMW^^9Vzt@R$KX!N7@w-28~*eCbj$A1 z!T!^|@=>WbUz`49dVTt{hY$bcexCHhgY?qXr-yI;REe@P)I*SxjtEfFu>($)ATSsUL9G=~x=T??tZK2Qs+4{{y(jttN`j%BXP&~)+bziU=$ow+ofBklXv&+x#W3a4aIoK zGcpC8=x9k(vM-N=$y3jpl63vxhX`| zc0!K7L#0YjpUVXLP&yf&KXy7|Kq+F6#UbvRuMPJ|=G#e#zUDzNDT+bYGI}yLDfFk7 zlSQE;5hOsjoSG(@f-VP1SEfV`cWk1&{VAcdLDG%XXY)gIQI5Ux4dl=mc#V6vfbr84Nqmhy}!FNxB+?|^Yh3&GUd!CA#o%JS=&hg{SGBY4a$h~=)xIp zD7dnFQ_r8TeddeHaGDaKk*S#>>MnIL2qMD<>%Z>1Tn*A5o`y zYw^qu| zkS}6cki3uMlj8Jm2Nbi;s!uYNbf2dNmwtx}#vx3s<6#A)LIXVva2m(c-HW7XiAUy9 zJGzhQ)Nvh`qT6OXbQ!7P-Y7}A32y1GNw3=82&9~tfuyD;tz7H@ajzwOKHP(p$k3yI zm^$pj@+s;qVU#@FPOQ8dj94fQ<95mMuagy94Yf~+D#qLH4M-Que5=XhHJ+5}>1Tni zXmy)blhmpTCNmOAsxfReS+;bYSpqPM7Gx)eRs}{dkcIKXRznV9^wQxXL|02Lh96~@ z4I{q^Z>L=den-?|!u5@(S(JLHlm0z?r|UeXTKb--a30dQ70;-(=@@eZ zLSbwR>5CJ$LtU&6Y3t4iDf@QlsNNOnS@l;(=W)J|&Z!x{_>=Er*f3ae{@HEOMaT_E z$j0nq;Kuyzgl|kW264{3FqGdL36akKxU#5OW4n!Mv4>%)c={N`sW!VE!#wMGIOs-(&NSVfD8jud z7z!ik)iX zV)WJuLZ3I$f{tRz0IWnJ1BQ``lEgH7`5=RCq@mC}Qs=M`DbT|q0VRoTsi!9pm>JE< zEAPz?+m{RG#*{~}()B3%ak|d!#PUp?P`n_*2Q^AgL`xq!$*?uxH5&V9x|goCz}K`<$XAu5T#NZ;&edU4%hIun9PZM}Oi$HG8CzEW zA!m9T2{d4hXAhKyjb4135B=|Q@5WS@8EjI1Gb5$X@2+oiElkhYs@=A8BzM3kIhF{eocHmgJmq1LB>tfIddT(9?_7866l1E~P$ZF*rdYosnq- zGm<7C0g#bdv_x?vgig2Folw}w?^ClYTZKMr z^K^Ewcb>C$I<3O9ch*SN&^b*iF>XqqKrfIu@Wg_dPY}S{MOMS{tXq<`5(kB?%nb@pi-S^SbArP2`qU#0t^3`$)>{9w zQh39#6Sx8SSsw!PNPdr+rs#T3x>JaAD zAZ?*EB(HTsF{m>J)0&Dr?u0k4kxZ9f8d0T3Gmum)y)0XrQi~A@#n6$J4xLs7k{QTC zDqBBfIy8|OSuJTfezVgLZ+81(l63na%XCn5Kjaw_l+TX-1@yxrdjUaVO>t1FEV}>G zi05f>P^xTBPxZmE6N!=4l9uDQI{olgw;v`+w;!@>tRM1>I4DK-0)oPt z;-FMn)D#-=JS`4NmCXqX&+AixJ~gTb+KG$0OGC&Vrgzal!-{2H_|KO)(=IG&KS(eem}f5w;%EhB(?R!B3qhL zixCOM&@I#t84QwX)%U1u{g8ENA~CXBvWnj~C;QF+{QdtLRI0RnUW1Oh>e!CpYuXSOG8)uYY>B3U_kp-1Q9R}25^xg_W&$rM6edUvqaWfKg zI!2-;5;9N|Z5#nk41`J-dwKO)ufGJgFem}yPG|x}7@$}jhUv18gHBPE>bQZ>#|0HT zEDTyo7SssRy2Tou)2>@eQadvySoxrQXNQTldj=E|1ZBVC|j_@je3AY3{b){hg1-M=0XV9!r*vZeJIpNaB z><$EeUC9M&M}1?7TZ$n%XP0)W%_+eEMM8>?d&uLWwKft0Au>O{hU=C;UQ;1P0+j=b zJhcRgTR})2($r!k%nCxXw$Os!M<^`=F;b=i``o7}9tzTTsVnAhwF;mjm79KfhtNO~ z(i)3HaxZ(En2Vv*t!FEhNFkPMw} z9U}B{B*95S0yI^;LrCJDS1#(khu)2n8ZD3~a!%e*R?~O!H>*T?N&?GQ@@B(B1Qz3^ zQ;WeapT?0jj9mn~6TwIo#<3$0qj@EWh)!tTrl<`|v~?zsMA{T}NKGG0qc)W#HO`Co zRZlLw*q<50G~vTv`E&SBelb(Fq^9AoW!1?yPo7;AIOApn6 zrHtgdwA08CX+h#`X_J;0SK6cvNslmhD35?6;T?HMw=HdgrOCG0prvQ;PIspdj;1^J zCikz&W}GU%4NAwRPspyIphV>BX(hGtwgOK-QV_HN)un>f!lLpY5SXNey0e}j@y+MB zPPlYqa&|DX4rM2-P6@^|66S!G9=)B?o_>c^ZQ5mwS30{yF|u(+36^F;=|>h+=sOIk z#pt~igq|ykxJybxrs8U(=ypv9d7EA=?Se8XFQBGkbqIfSMx~dBW+9Z;?wclFePE$PSCU@h1rqy(&Q+WI^lC#BzXoMfQr zOj|{CZO(L-EHQPPXbTbWS%vK28G8 zM9gKi8LX_yy7+~(Kut+keZ4dQDna6dF$Z+{Gq=DNrfmSZlemE*3|=e_llQV`Tc@vT zMATpzq1Rcsbon_Numl~@ zP8m8S7|lo+mZNG!sBy>Ma$}%Z>5}<1tT_2ki zIvysat>fb%jFo2Q?A<4mJ%5|yOdBp8v)tiW2Z6b{v8F|39o*M2Yq8C)=(WploW=%* z&fx20t5HzGl#lbgh=SuD);h0!LB7-5j+zktKLx`}Z!n-6{f1a}e1?VSuO1G4-DtRV zN1+ya&I(IPsGAW^1JVK^WA)1?hO>hdIiww;oD!rf5{9H*w7lpPfi%MwMT`O;B+@08 zM$+YvTFx{9xr7qSqNUT!*gzf)z7C5<0dnX?A%jq2h z-c}`*g{JRqda({nI%Y{%awRZT2L`8MZsMf_6xhNb1$aAw3KU_mVsRL-%ijIb*dRA8 zaWgl|w*V7=};mA~PN#JYsjh%I57gnXM4&f*tU!lVqj4)AuE4jf0G zV{yo`DPe-7IW`HPg|FQGbawRM<8lG@#Bi$ozeIsP#d@ZU(K#MpJ2;W9r}8>HgQV+_ zI4)733x_yf7|X|QXF(5BMOP2Rfn$MMews7J?-tD^#vUOObt zBfyhILkFBJL0~Wzf)atkab~`NtII9kd|MWoFD>8HWy|wBs{N>^}C3-n8uwe4P>!QM3u2dY%jpz%m z&+W8?eup*Ds@chepjUrD^OpB0>qBq8Mfy6Pi$N>(94CLe`t=j)gx*j6G4poKIq(k+_C#w54is%Ul&+Wi(%L;xf zEl`$5$$>nIf7Yww2rfdP5;*J?410&B>quyJB`ebfLf+#z8mDADECtnJ0GA>VGaka( z0QH&&=9MChncGGYBnN3E$J#Oks76D093-D+%!&q_=hABo($|B)7cLRGTjXUE;W1c8 zEQLw8PJ-3w{H9ml2~?m6>4?Q4FPFW|Q8LgS!xOqfMGZW4+%O8z1uqKWU(j}ZHG~t; ziEskCay~NAaVS)VZuKUF&RvZx>*$zB+ae3Z=zAbW&rLp#RArzDy^h79&n6#z!J2Sr zI@a$^4~}Nx#}wAI$Xw4dLVG>Si}lHHzMkbL3D$WxtOCRMQ$66=O566+F9BWZtDbwiVo zZ&SiqyfoW^E#x}D+hICTggnRMkY!WCt*5@4p*Pw^4pr zC4B4C!<*BchqoU-l(#q?Om=2Z58r$vz4Zxyf295|No4-t>sy~vCn=8N;U8UsTh)>g zho{$f9!zh2DIJ!Iplgd~mBY)Qcxy^a9poKIQ_3Y!pGEwlT&L8_G5eh)Cw^JCeKlP_ zNxxM05K&BPI++xiI8I0MC)?=K9iVAOhg-pPoNdd{Q8gMmnYveTQtwH0oipuiS~ixt zx2M;q556R+Yn{dzw$x%mmQP=61>lM;ZRA#6MHOKG}^r^9!O8m%mgywQ*UxUA_%S&7rxxe6uq)FzXGiowPR!Fz>x6 zO#E~lioSF+T>Ph+Kh@SO?>kfv`VH07@fjAPzj`?Ib)(_-`*z+LIH*N9mdRhHjoZ16 zv4lK(-mTl&!MHklJJEGYFvgKEjPyktX`RvY2{D#&}@Qnfty%&Xnhj!*Sa>zlQ4;kH`&GwG+{V(B$E;Z(^(j-e9-keA$ zMRZ#^aa{GFV@^VTZKoyqH~q;UamsBmuSazG)QLxzM%FYVDm5A+%4BBSrEioX%HMod zyjs2s zFor(p;n0JU3uIX1Ut!nuAS+ZCIVn8rd2SxYGmSumu`{d6&XbxbbzaKQs*rb{EWtlU z0ebF5+56A=0l)2}g?`h$2xX`1EW!p35He?ChTMS*3lXXw4qmG5D7S>7ixAuH@vL7v<1Lju%vbO|SWZRRmgT?c79BMs zgoN1`N^?SfQJ#kUJTvEO=W34Rd~KOMY=G$9&9JJo>Po$C=IJrw<&^yQKg%b*bcSq^u7K4-TRaF zekndlD1-JGbX8`PK-i_DZY3yWFc9Jttgh7qPIkaDtqqCGb z+mt<*y?;8ACS=IXie9@sFUAIPV$!0+hf#oBcu~lMp^STt?AsT#qq-5%r(n)U6H2D# z4@KoAL#Rg>r6VYl0c>b_UPF7xZiu_Xai|QL?o9~!z8W#6GtZPg^&Sa`i57`Q%AUkn w_UZqJK!XH=4s=Y}lZNHP5ZJ;Xn4pubP6z@;7=TzD(r?P1Y-;jNW+>tR2NNo!=>Px# literal 0 HcmV?d00001 diff --git a/Themes/iOSModernTheme.res b/Themes/iOSModernTheme.res new file mode 100644 index 0000000000000000000000000000000000000000..304a1ec93f137fa2d8f87f124a170be1ae10feae GIT binary patch literal 85528 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 Zf*c6K5XW#BVAH - + menu override). All .res files are committed + under Themes/; the modern pair is regenerated + by .github/workflows/native-themes-sync.yml. --> + diff --git a/scripts/build-android-port.sh b/scripts/build-android-port.sh index 7a56e86c7c..12665b1341 100755 --- a/scripts/build-android-port.sh +++ b/scripts/build-android-port.sh @@ -131,12 +131,7 @@ if [ ! -f "$BUILD_CLIENT" ]; then fi fi -# Compile native CSS themes (AndroidMaterialTheme.res) and stage them in the -# Android port's src/ so the Maven build packages them into the port jar. The -# runtime falls back to android_holo_light.res if AndroidMaterialTheme.res is -# missing, which loses the Material 3 palette + all $DarkUIID entries. -./scripts/build-native-themes.sh -mkdir -p Ports/Android/src -cp Themes/AndroidMaterialTheme.res Ports/Android/src/AndroidMaterialTheme.res - +# AndroidMaterialTheme.res is committed under Ports/Android/src/ and kept in +# sync by .github/workflows/native-themes-sync.yml. For local iteration on +# native-themes/android-material/theme.css, run scripts/build-native-themes.sh. run_maven -q -f maven/pom.xml -pl android -am -Dcn1.binaries="$CN1_BINARIES" -P !download-cn1-binaries -T 1C -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Djava.awt.headless=true clean install "$@" diff --git a/scripts/build-ios-port.sh b/scripts/build-ios-port.sh index 0b75835ba9..4754cd0cfc 100755 --- a/scripts/build-ios-port.sh +++ b/scripts/build-ios-port.sh @@ -37,13 +37,7 @@ if [ ! -f "$BUILD_CLIENT" ]; then fi fi -# Compile native CSS themes (iOSModernTheme.res) and copy into the iOS port's -# native sources so the Maven iOS build packages them into nativeios.jar. The -# iOS runtime falls back to iOS7Theme.res when iOSModernTheme.res is missing, -# which loses all $DarkUIID entries (dark mode appears broken) and the liquid- -# glass styling — so make sure this runs before the port is built. -./scripts/build-native-themes.sh -mkdir -p Ports/iOSPort/nativeSources -cp Themes/iOSModernTheme.res Ports/iOSPort/nativeSources/iOSModernTheme.res - +# iOSModernTheme.res is committed under Ports/iOSPort/nativeSources/ and kept +# in sync by .github/workflows/native-themes-sync.yml. For local iteration on +# native-themes/ios-modern/theme.css, run scripts/build-native-themes.sh. "$MAVEN_HOME/bin/mvn" -q -f maven/pom.xml -pl ios -am -Djava.awt.headless=true clean install "$@" diff --git a/scripts/build-native-themes.sh b/scripts/build-native-themes.sh index 6befddb66a..bc8e68db99 100755 --- a/scripts/build-native-themes.sh +++ b/scripts/build-native-themes.sh @@ -27,9 +27,12 @@ log() { echo "[build-native-themes] $1" >&2; } CSS_COMPILER_MODULE="$REPO_ROOT/maven/css-compiler" CSS_SRC_ROOT="$REPO_ROOT/native-themes" OUT_DIR="$REPO_ROOT/Themes" -# JavaScriptPort's runtime serves themes out of its webapp assets folder; -# mirror the generated .res files there too so the JS port picks them up. +# Every committed copy of the .res files that downstream consumers ship from. +# Keeping these locations in sync here means the native-themes-sync workflow +# can `git add` the whole set after running this script. JS_ASSETS_DIR="$REPO_ROOT/Ports/JavaScriptPort/src/main/webapp/assets" +IOS_NATIVE_DIR="$REPO_ROOT/Ports/iOSPort/nativeSources" +ANDROID_SRC_DIR="$REPO_ROOT/Ports/Android/src" # Resolve the compiler jar. Prefer a freshly-built target/ jar (so CSS compiler # source edits are always picked up); fall back to the installed copy in ~/.m2 @@ -84,6 +87,7 @@ ensure_jar() { compile_theme() { local jar="$1" name="$2" basename="$3" + shift 3 local css="$CSS_SRC_ROOT/$name/theme.css" local out="$OUT_DIR/$basename" if [ ! -f "$css" ]; then @@ -93,17 +97,21 @@ compile_theme() { mkdir -p "$OUT_DIR" log "Compiling $name -> $out" java -jar "$jar" -input "$css" -output "$out" - if [ -d "$JS_ASSETS_DIR" ]; then - cp "$out" "$JS_ASSETS_DIR/$basename" - log "Mirrored -> $JS_ASSETS_DIR/$basename" - fi + local mirror + for mirror in "$@"; do + [ -d "$mirror" ] || mkdir -p "$mirror" + cp "$out" "$mirror/$basename" + log "Mirrored -> $mirror/$basename" + done } main() { local jar jar="$(ensure_jar)" - compile_theme "$jar" ios-modern iOSModernTheme.res - compile_theme "$jar" android-material AndroidMaterialTheme.res + compile_theme "$jar" ios-modern iOSModernTheme.res \ + "$JS_ASSETS_DIR" "$IOS_NATIVE_DIR" + compile_theme "$jar" android-material AndroidMaterialTheme.res \ + "$JS_ASSETS_DIR" "$ANDROID_SRC_DIR" log "Native themes written to $OUT_DIR/" } diff --git a/scripts/cn1playground/common/pom.xml b/scripts/cn1playground/common/pom.xml index 04b672d8b3..06b87e131e 100644 --- a/scripts/cn1playground/common/pom.xml +++ b/scripts/cn1playground/common/pom.xml @@ -417,12 +417,11 @@ org.apache.maven.plugins @@ -436,8 +435,8 @@ - - + + diff --git a/scripts/initializr/common/pom.xml b/scripts/initializr/common/pom.xml index 829b8b4834..4fde35c158 100644 --- a/scripts/initializr/common/pom.xml +++ b/scripts/initializr/common/pom.xml @@ -390,12 +390,11 @@ org.apache.maven.plugins @@ -409,8 +408,8 @@ - - + + diff --git a/scripts/website/build.sh b/scripts/website/build.sh index a921d3e9aa..7d9d19880a 100755 --- a/scripts/website/build.sh +++ b/scripts/website/build.sh @@ -36,15 +36,6 @@ if [ "${WEBSITE_INCLUDE_INITIALIZR}" = "auto" ]; then fi fi -ensure_native_themes() { - if [ -f "${REPO_ROOT}/Themes/iOSModernTheme.res" ] \ - && [ -f "${REPO_ROOT}/Themes/AndroidMaterialTheme.res" ]; then - return - fi - echo "Generating native theme .res files via build-native-themes.sh..." >&2 - bash "${REPO_ROOT}/scripts/build-native-themes.sh" -} - bootstrap_local_cn1_snapshots() { if [ "${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS}" != "true" ]; then return @@ -571,12 +562,6 @@ build_initializr_for_site() { return fi - # The initializr's live preview overlays the iOS Modern theme, which is - # bundled from the gitignored Themes/iOSModernTheme.res. Generate it now - # so the antrun copy in scripts/initializr/common/pom.xml has something - # to pick up. - ensure_native_themes - echo "Building Initializr JavaScript bundle for website..." >&2 ( cd "${REPO_ROOT}/scripts/initializr" @@ -638,12 +623,6 @@ build_playground_for_site() { bootstrap_local_cn1_snapshots - # The playground's live preview switches between iOS Modern and Android - # Material via Resources.openLayered. Both .res files are gitignored - # build artifacts; generate them now so the antrun copy in - # scripts/cn1playground/common/pom.xml has something to pick up. - ensure_native_themes - echo "Building Playground JavaScript bundle for website..." >&2 ( cd "${REPO_ROOT}/scripts/cn1playground" From 1c2c6831456d13f44271865048e3d7a0182c433f Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 18 May 2026 20:28:27 +0300 Subject: [PATCH 2/7] Fix BorderAndPlafTest cache lookup to handle high instanceVal testRoundBorderShadowSpreadAndPaintingCaches was scanning client property keys "cn1$$-rbcache1".."cn1$$-rbcache50" to locate the cache RoundBorder.paintBorderBackground stores under the border's instanceVal suffix. Since instanceVal comes off a static counter shared across the entire JVM, the scan would miss whenever earlier tests in the same surefire run created more than 50 RoundBorder instances. The committed iOSModernTheme.res in this PR unblocks NativeThemeBindingsTest (it used to silently skip when the .res was a gitignored build artifact). That test now loads the iOS Modern theme before BorderAndPlafTest runs, parsing many border definitions and pushing instanceCounter past 50. Read instanceVal off the border under test reflectively and look up exactly that key, so the assertion no longer depends on how many other RoundBorders earlier tests minted in the same JVM. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../codename1/ui/plaf/BorderAndPlafTest.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/maven/core-unittests/src/test/java/com/codename1/ui/plaf/BorderAndPlafTest.java b/maven/core-unittests/src/test/java/com/codename1/ui/plaf/BorderAndPlafTest.java index d8f69104d4..57f6c60e71 100644 --- a/maven/core-unittests/src/test/java/com/codename1/ui/plaf/BorderAndPlafTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/ui/plaf/BorderAndPlafTest.java @@ -15,6 +15,7 @@ import com.codename1.ui.plaf.StyleParser.PaddingInfo; import com.codename1.ui.plaf.StyleParser.ScalarValue; import com.codename1.ui.plaf.StyleParser.StyleInfo; +import java.lang.reflect.Field; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -215,7 +216,7 @@ void testStyleParserImageAndBorderParsing() { } @FormTest - void testRoundBorderShadowSpreadAndPaintingCaches() { + void testRoundBorderShadowSpreadAndPaintingCaches() throws Exception { RoundBorder border = RoundBorder.create().shadowSpread(3).shadowBlur(4f).shadowOpacity(128).uiid(false); com.codename1.ui.Label label = new com.codename1.ui.Label(); label.setWidth(20); @@ -223,19 +224,17 @@ void testRoundBorderShadowSpreadAndPaintingCaches() { label.setX(0); label.setY(0); border.paintBorderBackground(graphics, label); - RoundBorder.CacheValue cacheValue = null; - Object baseCache = label.getClientProperty("cn1$$-rbcache"); - if (baseCache instanceof RoundBorder.CacheValue) { - cacheValue = (RoundBorder.CacheValue) baseCache; - } - for (int i = 0; cacheValue == null && i < 50; i++) { - Object cached = label.getClientProperty("cn1$$-rbcache" + (i + 1)); - if (cached instanceof RoundBorder.CacheValue) { - cacheValue = (RoundBorder.CacheValue) cached; - break; - } - } - assertNotNull(cacheValue); + // RoundBorder stores its cache under "cn1$$-rbcache" + instanceVal where + // instanceVal is a per-instance id off a static counter. Read the actual + // instanceVal off this border so the lookup doesn't depend on how many + // RoundBorder instances earlier tests in the same JVM happened to mint. + Field instanceValField = RoundBorder.class.getDeclaredField("instanceVal"); + instanceValField.setAccessible(true); + int instanceVal = instanceValField.getInt(border); + Object cached = label.getClientProperty("cn1$$-rbcache" + instanceVal); + assertNotNull(cached, "RoundBorder.paintBorderBackground should populate the cache under cn1$$-rbcache" + instanceVal); + assertTrue(cached instanceof RoundBorder.CacheValue); + RoundBorder.CacheValue cacheValue = (RoundBorder.CacheValue) cached; assertEquals(label.getWidth(), cacheValue.img.getWidth()); assertTrue(border.getMinimumHeight() > 0); assertTrue(border.getMinimumWidth() > 0); From 08a5fe226d1ef862c8b89cb5d26d0d7e04f66e8e Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 19 May 2026 04:17:45 +0300 Subject: [PATCH 3/7] Restore single source of truth: only Themes/ committed; copy at build The previous commit on this branch committed the modern .res files in six places (Themes/, JS webapp assets, iOSPort/nativeSources, Android/src). That's exactly the duplication problem this PR is trying to remove - each port carried its own copy in git, and they could drift. Drop the four port-side committed copies and have the port poms read Themes/*.res directly at build time: - maven/ios/pom.xml: nativeios.jar zip step gets a second fileset that pulls Themes/iOSModernTheme.res in, plus an explicit exclude on iOSModernTheme.res from the nativeSources fileset so a stale local copy can't shadow the canonical one. - maven/android/pom.xml: compile-android profile gets a second entry pointing at Themes/ filtered to AndroidMaterialTheme.res. JavaScriptPort/src/main/webapp/assets is gitignored again for the two modern .res files; scripts/build-native-themes.sh still mirrors there for local JS port runs, treating the directory as a build artifact. scripts/build-native-themes.sh reverts the IOS_NATIVE_DIR / ANDROID_SRC_DIR mirroring I added in the previous commit, since those staging copies are no longer needed. The native-themes-sync workflow now only commits Themes/iOSModernTheme.res and Themes/AndroidMaterialTheme.res - the two canonical files. Verified locally: `mvn -pl ios -am install` produces a nativeios.jar containing iOSModernTheme.res sourced from Themes/, with no staged copy under Ports/iOSPort/nativeSources/. Note: a fuller redesign would have the iOS / Android builders DELETE the .res based on a build hint (e.g. nativeTheme=legacy) rather than the current "include the .res unconditionally and pick at runtime" model. That's a larger change left for a follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/native-themes-sync.yml | 14 ++++------ Ports/Android/src/AndroidMaterialTheme.res | Bin 82114 -> 0 bytes .../src/main/webapp/assets/.gitignore | 5 ++++ .../webapp/assets/AndroidMaterialTheme.res | Bin 82114 -> 0 bytes .../src/main/webapp/assets/iOSModernTheme.res | Bin 85528 -> 0 bytes .../iOSPort/nativeSources/iOSModernTheme.res | Bin 85528 -> 0 bytes maven/android/pom.xml | 12 ++++++++ maven/ios/pom.xml | 15 +++++++++- scripts/build-android-port.sh | 8 ++++-- scripts/build-ios-port.sh | 6 ++-- scripts/build-native-themes.sh | 26 +++++++----------- 11 files changed, 55 insertions(+), 31 deletions(-) delete mode 100644 Ports/Android/src/AndroidMaterialTheme.res create mode 100644 Ports/JavaScriptPort/src/main/webapp/assets/.gitignore delete mode 100644 Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res delete mode 100644 Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res delete mode 100644 Ports/iOSPort/nativeSources/iOSModernTheme.res diff --git a/.github/workflows/native-themes-sync.yml b/.github/workflows/native-themes-sync.yml index bffdc0890f..05d57b44fd 100644 --- a/.github/workflows/native-themes-sync.yml +++ b/.github/workflows/native-themes-sync.yml @@ -67,15 +67,11 @@ jobs: set -euo pipefail git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - # All six committed copies are written by build-native-themes.sh. - # Each downstream consumer (simulator fat-jar, nativeios.jar, the - # Android port jar, the JS webapp, the BuildDaemon's sibling cn1 - # checkout) ships from its own committed copy with no extra cp step. - git add Themes/iOSModernTheme.res Themes/AndroidMaterialTheme.res \ - Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res \ - Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res \ - Ports/iOSPort/nativeSources/iOSModernTheme.res \ - Ports/Android/src/AndroidMaterialTheme.res + # Themes/ holds the single source of truth. Each downstream consumer + # (nativeios.jar, the Android port jar, the simulator fat-jar, the + # BuildDaemon's sibling cn1 checkout) copies from Themes/ at its own + # build time, so this workflow only commits these two files. + git add Themes/iOSModernTheme.res Themes/AndroidMaterialTheme.res if git diff --staged --quiet; then echo "No .res changes; nothing to commit." exit 0 diff --git a/Ports/Android/src/AndroidMaterialTheme.res b/Ports/Android/src/AndroidMaterialTheme.res deleted file mode 100644 index 51ed4378853b12df9f8a38cd05b33aa01b8e0adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82114 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 diff --git a/Ports/JavaScriptPort/src/main/webapp/assets/.gitignore b/Ports/JavaScriptPort/src/main/webapp/assets/.gitignore new file mode 100644 index 0000000000..48c6b4dfae --- /dev/null +++ b/Ports/JavaScriptPort/src/main/webapp/assets/.gitignore @@ -0,0 +1,5 @@ +# Mirrors of Themes/*.res written by scripts/build-native-themes.sh so a local +# JS port run can fetch them as webapp assets. The canonical .res lives in +# Themes/ and is committed; this mirror is a build artifact. +iOSModernTheme.res +AndroidMaterialTheme.res diff --git a/Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res b/Ports/JavaScriptPort/src/main/webapp/assets/AndroidMaterialTheme.res deleted file mode 100644 index 51ed4378853b12df9f8a38cd05b33aa01b8e0adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82114 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 diff --git a/Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res b/Ports/JavaScriptPort/src/main/webapp/assets/iOSModernTheme.res deleted file mode 100644 index 304a1ec93f137fa2d8f87f124a170be1ae10feae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85528 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 Zf*c6K5XW#BVAH ${src.dir} + + + ${project.basedir}/../../Themes + + AndroidMaterialTheme.res + + diff --git a/maven/ios/pom.xml b/maven/ios/pom.xml index 3efbc557b5..a8a6f68858 100644 --- a/maven/ios/pom.xml +++ b/maven/ios/pom.xml @@ -109,8 +109,21 @@ + - + + + + + + diff --git a/scripts/build-android-port.sh b/scripts/build-android-port.sh index 12665b1341..38a3155f03 100755 --- a/scripts/build-android-port.sh +++ b/scripts/build-android-port.sh @@ -131,7 +131,9 @@ if [ ! -f "$BUILD_CLIENT" ]; then fi fi -# AndroidMaterialTheme.res is committed under Ports/Android/src/ and kept in -# sync by .github/workflows/native-themes-sync.yml. For local iteration on -# native-themes/android-material/theme.css, run scripts/build-native-themes.sh. +# maven/android/pom.xml pulls Themes/AndroidMaterialTheme.res directly into +# the Android port jar (resource entry on Themes/), so no pre-staging copy +# under Ports/Android/src/ is needed. The .res is committed under Themes/ and +# kept in sync by .github/workflows/native-themes-sync.yml. For local iteration +# on native-themes/android-material/theme.css, run scripts/build-native-themes.sh. run_maven -q -f maven/pom.xml -pl android -am -Dcn1.binaries="$CN1_BINARIES" -P !download-cn1-binaries -T 1C -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Djava.awt.headless=true clean install "$@" diff --git a/scripts/build-ios-port.sh b/scripts/build-ios-port.sh index 4754cd0cfc..185f67d1f9 100755 --- a/scripts/build-ios-port.sh +++ b/scripts/build-ios-port.sh @@ -37,7 +37,9 @@ if [ ! -f "$BUILD_CLIENT" ]; then fi fi -# iOSModernTheme.res is committed under Ports/iOSPort/nativeSources/ and kept -# in sync by .github/workflows/native-themes-sync.yml. For local iteration on +# maven/ios/pom.xml pulls Themes/iOSModernTheme.res directly into nativeios.jar, +# so no pre-staging copy under Ports/iOSPort/nativeSources/ is needed. The .res +# is committed under Themes/ and kept in sync by +# .github/workflows/native-themes-sync.yml. For local iteration on # native-themes/ios-modern/theme.css, run scripts/build-native-themes.sh. "$MAVEN_HOME/bin/mvn" -q -f maven/pom.xml -pl ios -am -Djava.awt.headless=true clean install "$@" diff --git a/scripts/build-native-themes.sh b/scripts/build-native-themes.sh index bc8e68db99..2010eb6534 100755 --- a/scripts/build-native-themes.sh +++ b/scripts/build-native-themes.sh @@ -27,12 +27,11 @@ log() { echo "[build-native-themes] $1" >&2; } CSS_COMPILER_MODULE="$REPO_ROOT/maven/css-compiler" CSS_SRC_ROOT="$REPO_ROOT/native-themes" OUT_DIR="$REPO_ROOT/Themes" -# Every committed copy of the .res files that downstream consumers ship from. -# Keeping these locations in sync here means the native-themes-sync workflow -# can `git add` the whole set after running this script. +# JavaScriptPort's runtime serves themes out of its webapp assets folder; +# mirror the generated .res files there too so a local JS port run picks them +# up. The mirror is gitignored - Themes/ is the single source of truth, and +# the port poms (maven/ios, maven/android) consume it directly at build time. JS_ASSETS_DIR="$REPO_ROOT/Ports/JavaScriptPort/src/main/webapp/assets" -IOS_NATIVE_DIR="$REPO_ROOT/Ports/iOSPort/nativeSources" -ANDROID_SRC_DIR="$REPO_ROOT/Ports/Android/src" # Resolve the compiler jar. Prefer a freshly-built target/ jar (so CSS compiler # source edits are always picked up); fall back to the installed copy in ~/.m2 @@ -87,7 +86,6 @@ ensure_jar() { compile_theme() { local jar="$1" name="$2" basename="$3" - shift 3 local css="$CSS_SRC_ROOT/$name/theme.css" local out="$OUT_DIR/$basename" if [ ! -f "$css" ]; then @@ -97,21 +95,17 @@ compile_theme() { mkdir -p "$OUT_DIR" log "Compiling $name -> $out" java -jar "$jar" -input "$css" -output "$out" - local mirror - for mirror in "$@"; do - [ -d "$mirror" ] || mkdir -p "$mirror" - cp "$out" "$mirror/$basename" - log "Mirrored -> $mirror/$basename" - done + if [ -d "$JS_ASSETS_DIR" ]; then + cp "$out" "$JS_ASSETS_DIR/$basename" + log "Mirrored -> $JS_ASSETS_DIR/$basename" + fi } main() { local jar jar="$(ensure_jar)" - compile_theme "$jar" ios-modern iOSModernTheme.res \ - "$JS_ASSETS_DIR" "$IOS_NATIVE_DIR" - compile_theme "$jar" android-material AndroidMaterialTheme.res \ - "$JS_ASSETS_DIR" "$ANDROID_SRC_DIR" + compile_theme "$jar" ios-modern iOSModernTheme.res + compile_theme "$jar" android-material AndroidMaterialTheme.res log "Native themes written to $OUT_DIR/" } From 19c124f15d1a8e0d715f1ae2cf49668f8f0e32df Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 19 May 2026 04:30:30 +0300 Subject: [PATCH 4/7] iOS/Android builders: delete inactive native theme .res files nativeios.jar / the Android port jar now always ship all three native themes (modern + flat + legacy on each platform). The runtime installNativeTheme picks one based on the user's theme-mode build hint and the other two ride along as dead bytes in the .ipa / .apk. Resolve the effective mode in IPhoneBuilder and AndroidGradleBuilder right after the port jar is unzipped, and delete the .res files that won't be loaded. The mapping mirrors the runtime exactly: iOS (IOSImplementation.installNativeTheme): modern / liquid -> iOSModernTheme.res ios7 / flat / auto -> iOS7Theme.res anything else -> iPhoneTheme.res Android (AndroidImplementation.installNativeTheme): material / modern / auto -> AndroidMaterialTheme.res hololight / holo -> android_holo_light.res anything else (incl. legacy) -> androidTheme.res Drive-by fixes in the noExtraResources branches: extend the iOS list to include iOSModernTheme.res (previously missed) and correct the mis-cased "IPhoneTheme.res" to "iPhoneTheme.res" so the delete actually fires on case-sensitive file systems. Add AndroidMaterialTheme.res to the Android list for the same reason. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../builders/AndroidGradleBuilder.java | 51 +++++++++++++++++++ .../com/codename1/builders/IPhoneBuilder.java | 39 ++++++++++++-- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java index 29c1e4ea22..122eb3fc0f 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java @@ -1585,6 +1585,7 @@ public void usesClassMethod(String cls, String method) { new File(assetsDir, "CN1Resource.res").delete(); new File(assetsDir, "androidTheme.res").delete(); new File(assetsDir, "android_holo_light.res").delete(); + new File(assetsDir, "AndroidMaterialTheme.res").delete(); } if (getAndroidPortSrcJar() == null) { try { @@ -1602,6 +1603,12 @@ public void usesClassMethod(String cls, String method) { throw new BuildException("Failed to extract android port sources from "+androidPortSrcJar, ex); } + // The Android port jar ships all three native themes + // (AndroidMaterialTheme.res, android_holo_light.res, androidTheme.res). + // Strip the .apk down to the one the runtime will actually load based + // on the effective theme mode, mirroring + // AndroidImplementation.installNativeTheme. + deleteInactiveAndroidThemes(assetsDir, resolveAndroidThemeMode(request)); // We need to choose the correct PlayServices class file for the version of play services // we are building for. @@ -4953,4 +4960,48 @@ private void stripKotlin(File dummyClassesDir) { } } } + + /// Mirrors AndroidImplementation.installNativeTheme's mode resolution so + /// the builder can pick the same .res the runtime will load. Order: + /// and.themeMode > cn1.androidTheme > nativeTheme/cn1.nativeTheme > + /// and.hololight > default (hololight). + private static String resolveAndroidThemeMode(BuildRequest request) { + String mode = request.getArg("and.themeMode", request.getArg("cn1.androidTheme", null)); + if (mode == null) { + String shared = request.getArg("nativeTheme", request.getArg("cn1.nativeTheme", null)); + if ("modern".equalsIgnoreCase(shared)) { + mode = "material"; + } else if ("legacy".equalsIgnoreCase(shared)) { + mode = "hololight"; + } else if ("true".equalsIgnoreCase(request.getArg("and.hololight", "false"))) { + mode = "legacy"; + } else { + mode = "hololight"; + } + } else { + mode = mode.toLowerCase(); + } + return mode; + } + + /// Removes the Android native theme .res files that the runtime won't + /// load based on the effective theme mode. The Android port jar ships + /// all three (AndroidMaterialTheme, android_holo_light, androidTheme); + /// the builder strips the .apk down to the one this build wants. Mirrors + /// the mode -> theme mapping in AndroidImplementation.installNativeTheme. + private static void deleteInactiveAndroidThemes(File assetsDir, String androidMode) { + String keep; + if ("material".equals(androidMode) || "modern".equals(androidMode) || "auto".equals(androidMode)) { + keep = "AndroidMaterialTheme.res"; + } else if ("hololight".equals(androidMode) || "holo".equals(androidMode)) { + keep = "android_holo_light.res"; + } else { + keep = "androidTheme.res"; + } + for (String themeFile : new String[] {"AndroidMaterialTheme.res", "android_holo_light.res", "androidTheme.res"}) { + if (!themeFile.equals(keep)) { + new File(assetsDir, themeFile).delete(); + } + } + } } diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java index e25d9fb304..ca032e9581 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java @@ -701,11 +701,20 @@ public void usesClassMethod(String cls, String method) { } stopwatch.split("Extract Libs"); + // nativeios.jar ships all three native themes (iOSModernTheme.res, + // iOS7Theme.res, iPhoneTheme.res). Delete the ones that don't match + // the effective iosMode so the .ipa carries only the theme the + // runtime will load. IOSImplementation.installNativeTheme maps + // mode->theme as: modern/liquid -> iOSModernTheme.res, + // ios7/flat/auto -> iOS7Theme.res, anything else -> iPhoneTheme.res. + deleteInactiveIosThemes(buildinRes, iosMode); + if(request.getArg("noExtraResources", "false").equals("true")) { new File(buildinRes, "CN1Resource.res").delete(); - new File(buildinRes, "IPhoneTheme.res").delete(); + new File(buildinRes, "iPhoneTheme.res").delete(); new File(buildinRes, "iOS7Theme.res").delete(); - } + new File(buildinRes, "iOSModernTheme.res").delete(); + } if (useMetal) { @@ -3648,12 +3657,34 @@ private static String join(String[] strs, String sep) { out.append(sep); } out.append(str); - + } return out.toString(); } + /// Removes the iOS native theme .res files that the runtime won't load + /// based on the effective iosMode. nativeios.jar always ships all three + /// (iOSModernTheme, iOS7Theme, iPhoneTheme); the builder strips down to + /// the one this build actually wants so the .ipa doesn't carry dead + /// theme bytes. Mirrors the mode -> theme mapping in + /// IOSImplementation.installNativeTheme. + private static void deleteInactiveIosThemes(File buildinRes, String iosMode) { + String mode = iosMode == null ? "auto" : iosMode.toLowerCase(); + String keep; + if (mode.equals("modern") || mode.equals("liquid")) { + keep = "iOSModernTheme.res"; + } else if (mode.equals("ios7") || mode.equals("flat") || mode.equals("auto")) { + keep = "iOS7Theme.res"; + } else { + keep = "iPhoneTheme.res"; + } + for (String themeFile : new String[] {"iOSModernTheme.res", "iOS7Theme.res", "iPhoneTheme.res"}) { + if (!themeFile.equals(keep)) { + new File(buildinRes, themeFile).delete(); + } + } + } + - } From 16519834c096117eea69ba43324201b166b9d807 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 19 May 2026 10:30:50 +0300 Subject: [PATCH 5/7] Revert builder-side native-theme deletion Reverts 19c124f15. The mode-driven delete in IPhoneBuilder / AndroidGradleBuilder assumed apps only ever load the .res that matches the build-hint-derived mode, but apps (e.g. DualAppearanceBaseTest in the screenshot suite) load other themes via Resources.open at runtime to render side-by-side comparisons. Deleting the inactive .res files from the .ipa / .apk made those loads fail and broke the on-device screenshot tests. Smaller-bundle minimization can come back later as an opt-in build hint (only delete when the user explicitly says they don't dynamically load themes), but the default has to keep all three themes shipped so runtime Resources.open lookups work. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../builders/AndroidGradleBuilder.java | 51 ------------------- .../com/codename1/builders/IPhoneBuilder.java | 39 ++------------ 2 files changed, 4 insertions(+), 86 deletions(-) diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java index 122eb3fc0f..29c1e4ea22 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java @@ -1585,7 +1585,6 @@ public void usesClassMethod(String cls, String method) { new File(assetsDir, "CN1Resource.res").delete(); new File(assetsDir, "androidTheme.res").delete(); new File(assetsDir, "android_holo_light.res").delete(); - new File(assetsDir, "AndroidMaterialTheme.res").delete(); } if (getAndroidPortSrcJar() == null) { try { @@ -1603,12 +1602,6 @@ public void usesClassMethod(String cls, String method) { throw new BuildException("Failed to extract android port sources from "+androidPortSrcJar, ex); } - // The Android port jar ships all three native themes - // (AndroidMaterialTheme.res, android_holo_light.res, androidTheme.res). - // Strip the .apk down to the one the runtime will actually load based - // on the effective theme mode, mirroring - // AndroidImplementation.installNativeTheme. - deleteInactiveAndroidThemes(assetsDir, resolveAndroidThemeMode(request)); // We need to choose the correct PlayServices class file for the version of play services // we are building for. @@ -4960,48 +4953,4 @@ private void stripKotlin(File dummyClassesDir) { } } } - - /// Mirrors AndroidImplementation.installNativeTheme's mode resolution so - /// the builder can pick the same .res the runtime will load. Order: - /// and.themeMode > cn1.androidTheme > nativeTheme/cn1.nativeTheme > - /// and.hololight > default (hololight). - private static String resolveAndroidThemeMode(BuildRequest request) { - String mode = request.getArg("and.themeMode", request.getArg("cn1.androidTheme", null)); - if (mode == null) { - String shared = request.getArg("nativeTheme", request.getArg("cn1.nativeTheme", null)); - if ("modern".equalsIgnoreCase(shared)) { - mode = "material"; - } else if ("legacy".equalsIgnoreCase(shared)) { - mode = "hololight"; - } else if ("true".equalsIgnoreCase(request.getArg("and.hololight", "false"))) { - mode = "legacy"; - } else { - mode = "hololight"; - } - } else { - mode = mode.toLowerCase(); - } - return mode; - } - - /// Removes the Android native theme .res files that the runtime won't - /// load based on the effective theme mode. The Android port jar ships - /// all three (AndroidMaterialTheme, android_holo_light, androidTheme); - /// the builder strips the .apk down to the one this build wants. Mirrors - /// the mode -> theme mapping in AndroidImplementation.installNativeTheme. - private static void deleteInactiveAndroidThemes(File assetsDir, String androidMode) { - String keep; - if ("material".equals(androidMode) || "modern".equals(androidMode) || "auto".equals(androidMode)) { - keep = "AndroidMaterialTheme.res"; - } else if ("hololight".equals(androidMode) || "holo".equals(androidMode)) { - keep = "android_holo_light.res"; - } else { - keep = "androidTheme.res"; - } - for (String themeFile : new String[] {"AndroidMaterialTheme.res", "android_holo_light.res", "androidTheme.res"}) { - if (!themeFile.equals(keep)) { - new File(assetsDir, themeFile).delete(); - } - } - } } diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java index ca032e9581..e25d9fb304 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java @@ -701,20 +701,11 @@ public void usesClassMethod(String cls, String method) { } stopwatch.split("Extract Libs"); - // nativeios.jar ships all three native themes (iOSModernTheme.res, - // iOS7Theme.res, iPhoneTheme.res). Delete the ones that don't match - // the effective iosMode so the .ipa carries only the theme the - // runtime will load. IOSImplementation.installNativeTheme maps - // mode->theme as: modern/liquid -> iOSModernTheme.res, - // ios7/flat/auto -> iOS7Theme.res, anything else -> iPhoneTheme.res. - deleteInactiveIosThemes(buildinRes, iosMode); - if(request.getArg("noExtraResources", "false").equals("true")) { new File(buildinRes, "CN1Resource.res").delete(); - new File(buildinRes, "iPhoneTheme.res").delete(); + new File(buildinRes, "IPhoneTheme.res").delete(); new File(buildinRes, "iOS7Theme.res").delete(); - new File(buildinRes, "iOSModernTheme.res").delete(); - } + } if (useMetal) { @@ -3657,34 +3648,12 @@ private static String join(String[] strs, String sep) { out.append(sep); } out.append(str); - + } return out.toString(); } - /// Removes the iOS native theme .res files that the runtime won't load - /// based on the effective iosMode. nativeios.jar always ships all three - /// (iOSModernTheme, iOS7Theme, iPhoneTheme); the builder strips down to - /// the one this build actually wants so the .ipa doesn't carry dead - /// theme bytes. Mirrors the mode -> theme mapping in - /// IOSImplementation.installNativeTheme. - private static void deleteInactiveIosThemes(File buildinRes, String iosMode) { - String mode = iosMode == null ? "auto" : iosMode.toLowerCase(); - String keep; - if (mode.equals("modern") || mode.equals("liquid")) { - keep = "iOSModernTheme.res"; - } else if (mode.equals("ios7") || mode.equals("flat") || mode.equals("auto")) { - keep = "iOS7Theme.res"; - } else { - keep = "iPhoneTheme.res"; - } - for (String themeFile : new String[] {"iOSModernTheme.res", "iOS7Theme.res", "iPhoneTheme.res"}) { - if (!themeFile.equals(keep)) { - new File(buildinRes, themeFile).delete(); - } - } - } - + } From 439982d3c0f35c63b0d8b78ab19417ee531d7cf4 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 19 May 2026 11:25:42 +0300 Subject: [PATCH 6/7] Regenerate native theme .res with post-merge css-compiler The .res files I committed initially were produced against the pre-#4957 CSS compiler (MINOR_VERSION=12). After merging master, #4957 bumped the resource format to MINOR_VERSION=14, but I hadn't rebuilt the .res, so what was committed at offset 0x0B was 0x0c (12) while every fresh CI build produces 0x0e (14). The screenshot baselines on master were captured against the v14 bytes, so the v12 bytes I committed caused pixel diffs across every theme test in scripts-android.yml (ButtonTheme_*, ListTheme_*, DialogTheme_*, ...). Regen Themes/{iOSModernTheme,AndroidMaterialTheme}.res with the post-merge css-compiler under JDK 8 (matching the pr-ci-container's toolchain) so the committed bytes match what scripts-android.yml's emulator renders against the existing baselines. Co-Authored-By: Claude Opus 4.7 (1M context) --- Themes/AndroidMaterialTheme.res | Bin 82114 -> 82114 bytes Themes/iOSModernTheme.res | Bin 85528 -> 85528 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Themes/AndroidMaterialTheme.res b/Themes/AndroidMaterialTheme.res index 51ed4378853b12df9f8a38cd05b33aa01b8e0adf..24e035cc17136148c90b1842f22e3ce400e4d581 100644 GIT binary patch delta 25 gcmX@q$a<)em79U-KLY~;8v`Q)UnBQcZpQ5n09FqL_5c6? delta 25 gcmX@q$a<)em79U-KLY~;8v`Q)Pb2qMZpQ5n09F45^Z)<= diff --git a/Themes/iOSModernTheme.res b/Themes/iOSModernTheme.res index 304a1ec93f137fa2d8f87f124a170be1ae10feae..a5ad76267f4d760c71c09bed2e254a2cc8cac08f 100644 GIT binary patch delta 25 gcmbO+hjqprR&EBS{|pQaYz&MHe2v^&xfyx=08!EfJOBUy delta 25 gcmbO+hjqprR&EBS{|pQaYz&MHJdNC2xfyx=08zpPIsgCw From 0f0c083909e1e581b4bb30c735af3e3aef3717cb Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 19 May 2026 12:52:53 +0300 Subject: [PATCH 7/7] Android port: include Themes/AndroidMaterialTheme.res in android_port_sources.jar My earlier maven/android/pom.xml change put AndroidMaterialTheme.res in the outer codenameone-android.jar's outputDirectory via a entry, but the runtime delivery path for the Android port is the INNER android_port_sources.jar inside that outer jar: AndroidGradleBuilder unzips that inner jar into the user app's APK assets/, and AndroidImplementation.installNativeTheme then reads /AndroidMaterialTheme.res from AssetManager. The inner jar is built by the bundle-android profile's step from ${real.src.dir} (= Ports/Android/src/), which doesn't contain the .res once I un-staged the Ports/Android/src/AndroidMaterialTheme.res copy. So the .res never reached the APK, the runtime fell back to android_holo_light.res, and the *Theme_light/_dark screenshot tests diffed against the material baselines. Add a second fileset on Themes/ to the bundle-android step so android_port_sources.jar carries AndroidMaterialTheme.res, with Themes/ still as the single source of truth (no Ports/Android/src/ staging copy needed). Verified locally: the rebuilt android_port_sources.jar now lists AndroidMaterialTheme.res alongside androidTheme.res / android_holo_light.res. Co-Authored-By: Claude Opus 4.7 (1M context) --- maven/android/pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/maven/android/pom.xml b/maven/android/pom.xml index 70b7a13645..a85d8f2b50 100644 --- a/maven/android/pom.xml +++ b/maven/android/pom.xml @@ -86,9 +86,22 @@ + + + +