From d4b747c1cb72119d783154f88640920d3a3fdb3d Mon Sep 17 00:00:00 2001 From: Russell Belfer Date: Thu, 21 Feb 2013 16:44:44 -0800 Subject: [PATCH] Add diff rename tests with partial similarity This adds some new tests that actually exercise the similarity metric between files to detect renames, copies, and split modified files that are too heavily modified. There is still more testing to do - these tests are just partially covering the cases. There is also one bug fix in this where a change set with only MODIFY being broken into ADD/DELETE (due to low self-similarity) without any additional RENAMED entries would end up not processing the split requests (because the num_rewrites counter got reset). --- include/git2/diff.h | 3 + src/diff_tform.c | 2 - tests-clar/diff/rename.c | 117 +++++++++++++++++- tests-clar/resources/renames/.gitted/index | Bin 272 -> 352 bytes .../resources/renames/.gitted/logs/HEAD | 2 + .../renames/.gitted/logs/refs/heads/master | 2 + .../19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 | 1 + .../1c/068dee5790ef1580cfc4cd670915b48d790084 | Bin 0 -> 176 bytes .../36/020db6cdacaa93497f31edcd8f242ff9bc366d | Bin 0 -> 431 bytes .../3c/04741dd4b96c4ae4b00ec0f6e10c816a30aad2 | Bin 0 -> 159 bytes .../42/10ffd5c390b21dd5483375e75288dea9ede512 | Bin 0 -> 1145 bytes .../4e/4cae3e7dd56ed74bff39526d0469e554432953 | Bin 0 -> 452 bytes .../5e/26abc56a5a84d89790f45416648899cbe13109 | Bin 0 -> 163 bytes .../9a/69d960ae94b060f56c2a8702545e2bb1abb935 | Bin 0 -> 464 bytes .../d7/9b202de198fa61b02424b9e25e840dc75e1323 | Bin 0 -> 421 bytes .../ea/f4a3e3bfe68585e90cada20736ace491cd100b | 5 + .../f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 | Bin 0 -> 441 bytes .../renames/.gitted/refs/heads/master | 2 +- tests-clar/resources/renames/ikeepsix.txt | 27 ++++ tests-clar/resources/renames/sixserving.txt | 43 +++---- .../{sevencities.txt => songof7cities.txt} | 18 +-- tests-clar/resources/renames/songofseven.txt | 49 -------- tests-clar/resources/renames/untimely.txt | 24 ++++ 23 files changed, 211 insertions(+), 84 deletions(-) create mode 100644 tests-clar/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 create mode 100644 tests-clar/resources/renames/.gitted/objects/1c/068dee5790ef1580cfc4cd670915b48d790084 create mode 100644 tests-clar/resources/renames/.gitted/objects/36/020db6cdacaa93497f31edcd8f242ff9bc366d create mode 100644 tests-clar/resources/renames/.gitted/objects/3c/04741dd4b96c4ae4b00ec0f6e10c816a30aad2 create mode 100644 tests-clar/resources/renames/.gitted/objects/42/10ffd5c390b21dd5483375e75288dea9ede512 create mode 100644 tests-clar/resources/renames/.gitted/objects/4e/4cae3e7dd56ed74bff39526d0469e554432953 create mode 100644 tests-clar/resources/renames/.gitted/objects/5e/26abc56a5a84d89790f45416648899cbe13109 create mode 100644 tests-clar/resources/renames/.gitted/objects/9a/69d960ae94b060f56c2a8702545e2bb1abb935 create mode 100644 tests-clar/resources/renames/.gitted/objects/d7/9b202de198fa61b02424b9e25e840dc75e1323 create mode 100644 tests-clar/resources/renames/.gitted/objects/ea/f4a3e3bfe68585e90cada20736ace491cd100b create mode 100644 tests-clar/resources/renames/.gitted/objects/f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 create mode 100644 tests-clar/resources/renames/ikeepsix.txt rename tests-clar/resources/renames/{sevencities.txt => songof7cities.txt} (82%) delete mode 100644 tests-clar/resources/renames/songofseven.txt create mode 100644 tests-clar/resources/renames/untimely.txt diff --git a/include/git2/diff.h b/include/git2/diff.h index 379f4694e..ca3484332 100644 --- a/include/git2/diff.h +++ b/include/git2/diff.h @@ -390,6 +390,9 @@ typedef enum { /** split large rewrites into delete/add pairs (`--break-rewrites=/M`) */ GIT_DIFF_FIND_AND_BREAK_REWRITES = (1 << 4), + /** turn on all finding features */ + GIT_DIFF_FIND_ALL = (0x1f), + /** measure similarity ignoring leading whitespace (default) */ GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE = 0, /** measure similarity ignoring all whitespace */ diff --git a/src/diff_tform.c b/src/diff_tform.c index 48332d3e5..ae0fd36d6 100644 --- a/src/diff_tform.c +++ b/src/diff_tform.c @@ -561,8 +561,6 @@ int git_diff_find_similar( /* next rewrite the diffs with renames / copies */ - num_rewrites = 0; - git_vector_foreach(&diff->deltas, j, to) { if (!matches[j]) { assert(to->similarity == 0); diff --git a/tests-clar/diff/rename.c b/tests-clar/diff/rename.c index 2995b4ef5..ec99e4dbe 100644 --- a/tests-clar/diff/rename.c +++ b/tests-clar/diff/rename.c @@ -23,8 +23,16 @@ void test_diff_rename__cleanup(void) * serving.txt -> sixserving.txt (rename, no change, 100% match) * sevencities.txt -> sevencities.txt (no change) * sevencities.txt -> songofseven.txt (copy, no change, 100% match) - * - * TODO: add commits with various % changes of copy / rename + * commit 1c068dee5790ef1580cfc4cd670915b48d790084 + * songofseven.txt -> songofseven.txt (major rewrite, <20% match - split) + * sixserving.txt -> sixserving.txt (indentation change) + * sixserving.txt -> ikeepsix.txt (copy, add title, >80% match) + * sevencities.txt (no change) + * commit 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 + * songofseven.txt -> untimely.txt (rename, convert to crlf) + * ikeepsix.txt -> ikeepsix.txt (reorder sections in file) + * sixserving.txt -> sixserving.txt (whitespace change - not just indent) + * sevencities.txt -> songof7cities.txt (rename, small text changes) */ void test_diff_rename__match_oid(void) @@ -133,3 +141,108 @@ void test_diff_rename__checks_options_version(void) git_tree_free(old_tree); git_tree_free(new_tree); } + +void test_diff_rename__not_exact_match(void) +{ + const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; + const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084"; + const char *sha2 = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13"; + git_tree *old_tree, *new_tree; + git_diff_list *diff; + git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; + git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; + diff_expects exp; + + /* Changes: + * songofseven.txt -> songofseven.txt (major rewrite, <20% match - split) + * sixserving.txt -> sixserving.txt (indentation change) + * sixserving.txt -> ikeepsix.txt (copy, add title, >80% match) + * sevencities.txt (no change) + */ + + old_tree = resolve_commit_oid_to_tree(g_repo, sha0); + new_tree = resolve_commit_oid_to_tree(g_repo, sha1); + + /* Must pass GIT_DIFF_INCLUDE_UNMODIFIED if you expect to emulate + * --find-copies-harder during rename transformion... + */ + diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; + + cl_git_pass(git_diff_tree_to_tree( + &diff, g_repo, old_tree, new_tree, &diffopts)); + + /* git diff --no-renames \ + * 2bc7f351d20b53f1c72c16c4b036e491c478c49a \ + * 1c068dee5790ef1580cfc4cd670915b48d790084 + */ + memset(&exp, 0, sizeof(exp)); + cl_git_pass(git_diff_foreach( + diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp)); + + cl_assert_equal_i(4, exp.files); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); + cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); + + /* git diff 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 \ + * 2bc7f351d20b53f1c72c16c4b036e491c478c49a + */ + cl_git_pass(git_diff_find_similar(diff, NULL)); + + memset(&exp, 0, sizeof(exp)); + cl_git_pass(git_diff_foreach( + diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp)); + + cl_assert_equal_i(4, exp.files); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); + cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); + + git_diff_list_free(diff); + + cl_git_pass(git_diff_tree_to_tree( + &diff, g_repo, old_tree, new_tree, &diffopts)); + + /* git diff --find-copies-harder --break-rewrites \ + * 2bc7f351d20b53f1c72c16c4b036e491c478c49a \ + * 1c068dee5790ef1580cfc4cd670915b48d790084 + */ + opts.flags = GIT_DIFF_FIND_ALL; + cl_git_pass(git_diff_find_similar(diff, &opts)); + + memset(&exp, 0, sizeof(exp)); + cl_git_pass(git_diff_foreach( + diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp)); + + cl_assert_equal_i(5, exp.files); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); + cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); + + git_diff_list_free(diff); + + /* Changes: + * songofseven.txt -> untimely.txt (rename, convert to crlf) + * ikeepsix.txt -> ikeepsix.txt (reorder sections in file) + * sixserving.txt -> sixserving.txt (whitespace - not just indent) + * sevencities.txt -> songof7cities.txt (rename, small text changes) + */ + + git_tree_free(old_tree); + old_tree = new_tree; + new_tree = resolve_commit_oid_to_tree(g_repo, sha2); + + /* moar tests needed */ + + git_tree_free(old_tree); + git_tree_free(new_tree); +} + +void test_diff_rename__working_directory_changes(void) +{ + /* let's rewrite some files in the working directory on demand */ + + /* and with / without CRLF changes */ +} diff --git a/tests-clar/resources/renames/.gitted/index b/tests-clar/resources/renames/.gitted/index index 1fc69fcbefd9ccf13194b86b1493359f0f5962e6..72363c0f52fba5560db5c0a127ddebfc47c0ba62 100644 GIT binary patch literal 352 zcmZ?q402{*U|<4bmO!-yRX~~nM)Lv1m^6Z}F)%bPVPIhV3X~E7Dn0k=%i_oTpS8BW zj%!(pCmOpi#xCMP-?J=`a%m)fU=8%!ANS^Eyz?C5dTJALN$-+%dE_s3G1e8 zNcftg)y@_!TH6!oa|>D$P(n=J)gF z9Q8mh>qTGeH1u@3cQNo6rB>Rurcem1X9oLycnyXlL*Tn+K(#?gLsyl>74Y((}{6 du7nzB78M<(+dawb5?_5t|BE2K6H6U-004~dPl*5k diff --git a/tests-clar/resources/renames/.gitted/logs/HEAD b/tests-clar/resources/renames/.gitted/logs/HEAD index 34222ed7d..e69792263 100644 --- a/tests-clar/resources/renames/.gitted/logs/HEAD +++ b/tests-clar/resources/renames/.gitted/logs/HEAD @@ -1,2 +1,4 @@ 0000000000000000000000000000000000000000 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 Russell Belfer 1351024687 -0700 commit (initial): Initial commit 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 2bc7f351d20b53f1c72c16c4b036e491c478c49a Russell Belfer 1351024817 -0700 commit: copy and rename with no change +2bc7f351d20b53f1c72c16c4b036e491c478c49a 1c068dee5790ef1580cfc4cd670915b48d790084 Russell Belfer 1361485758 -0800 commit: rewrites, copies with changes, etc. +1c068dee5790ef1580cfc4cd670915b48d790084 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 Russell Belfer 1361486360 -0800 commit: more renames and smallish modifications diff --git a/tests-clar/resources/renames/.gitted/logs/refs/heads/master b/tests-clar/resources/renames/.gitted/logs/refs/heads/master index 34222ed7d..e69792263 100644 --- a/tests-clar/resources/renames/.gitted/logs/refs/heads/master +++ b/tests-clar/resources/renames/.gitted/logs/refs/heads/master @@ -1,2 +1,4 @@ 0000000000000000000000000000000000000000 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 Russell Belfer 1351024687 -0700 commit (initial): Initial commit 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 2bc7f351d20b53f1c72c16c4b036e491c478c49a Russell Belfer 1351024817 -0700 commit: copy and rename with no change +2bc7f351d20b53f1c72c16c4b036e491c478c49a 1c068dee5790ef1580cfc4cd670915b48d790084 Russell Belfer 1361485758 -0800 commit: rewrites, copies with changes, etc. +1c068dee5790ef1580cfc4cd670915b48d790084 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 Russell Belfer 1361486360 -0800 commit: more renames and smallish modifications diff --git a/tests-clar/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 b/tests-clar/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 new file mode 100644 index 000000000..4be4c6952 --- /dev/null +++ b/tests-clar/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 @@ -0,0 +1 @@ +xM!Ei@3ސc,\X K {Nrbo,xzYC<h[&?=fcvyCW#K@M{9s$^8%(VoNPHty#e~)= zcO>kCa2HM7%eZEE?AxaE40oLe&2Y)-_MFPNr?aff705c`(E2vO2?L_3wEin~`mbrS ee)3dwJA$n5NjLb^5Xcx`&mYtxXY&O)1x?P|R9TS# literal 0 HcmV?d00001 diff --git a/tests-clar/resources/renames/.gitted/objects/36/020db6cdacaa93497f31edcd8f242ff9bc366d b/tests-clar/resources/renames/.gitted/objects/36/020db6cdacaa93497f31edcd8f242ff9bc366d new file mode 100644 index 0000000000000000000000000000000000000000..f4f9303edb4fdc8d0c08efa43034260d0cfebf50 GIT binary patch literal 431 zcmV;g0Z{&U0ew=zuG26OIs1;QqS(oCbr_(mF*?n=CgS9;eU@(1mE3# zMIzW-!RZM+5{%d1jjYIe>P^Nd(9Yq2!OQYyr(jUN*fVk; zmgfiyuQg%I=}DN)Mn;5LB3wz8H;HZ(N8R$GsjQ?HO5CZB6aTtQ4ACo$o&`&YgS6;E zB-aY>EyJ~aVXhI0-4@kO@-oninqb5?YM(g2v`RQf z(L+a84cz1(O;g$BO1wZTui}fDd>>a*^4m(gwOuDsJm&^CT&dq;vy~<7NOADRG+ZR6 z;E_fu`2F*jIvT;ig(qb37|GX`^lfX6I+=i;0)420QP$$zOI5MO(e#Rj>vIgc1;K_c zhQ-s*PTQD@^kN7Fu)7vtTeZFfcPQQOL|rO)V(Stk5f|C}A*T;@x(3&8o?s^@eZH z_N(as++&stRacx^mYSEGS(2Gr3|5+EC?E6td2^0>AeZ%`FLoMwI^DZqN;4~pQ;W(n z^U}d8ug_M{eK_M+;szC!osZ&Lc#p>kE5lUg=cVVTfsF<$_48S0S9>+@y7zy}pj?*B NryP$2*S literal 0 HcmV?d00001 diff --git a/tests-clar/resources/renames/.gitted/objects/42/10ffd5c390b21dd5483375e75288dea9ede512 b/tests-clar/resources/renames/.gitted/objects/42/10ffd5c390b21dd5483375e75288dea9ede512 new file mode 100644 index 0000000000000000000000000000000000000000..d351a6d13b620ff34fa29c0d283f243946fb7de0 GIT binary patch literal 1145 zcmV-<1cv)~0d-YPZ`?);lOo`LmILPT@aa~M#srSLy2^%&c36;gkYn1?r5=Tr1NC{5g*C=tM#pI z9OID|4OE?-QwOw2aJbGsQItLb{4#*D33Lwl zeC5A!9S<|h>^PE1dnQS&JHZM((I_EuF=|J!B8hC!Fz_Py-h377FnUDAG|p3YaPe2> znCzA&u(n`w%N{V!h=?SAH6CR+(PXSc47?F2lEEO`!g|aej4@@O1Qqm=(=XLC z($dV95muY;Xj%nn(`kE0VIt$V(^qoEal-#F@LlyMgFGd1!rvkp{01a|o6~L{INF#L zSwTLTjtPb0RLVG84(;wbPV$CtJvAmJpec1VFoVz#wT`9w@kaO)2M9)h?a5J5%2h?Ij!J4hYaMkZ8abb6;2G8@M z=B;Bk`DlWt>c#HO#8V?^e9fa*fRUW_DjXBgvPkBHa}!5Z7rF{X!U-CBQ47U`=DOcs z!O`tZI;g;4IQpw(j$Tp_AFAq;EMz7fXG)L(j-c_2f?VSOHs*V|5G@5ZF{7+|1#y%;n%mPXb9P7g zdp61d6d7dIelWOG8bj?m?n~bmO-y-%6A={ID)4)gk-7%nrXhVX&R`rYBL-@L*g~fRG0!;!V~?Pbb2hDJ>)Inu4W4 z5aTp67GWHfR#<}m$nc|(zFHX7D;t+aOcaz*`?p@$%(^Oc)Phmbbukqi%%KakKcZv5 z*@gpl!S}oHeg51qdft^%w%WV?%Q(hri(rwtG`p^N0LPv$Vns}7n5eF?)4CON0LxUH LY^eSP6%Gp}TSqL) literal 0 HcmV?d00001 diff --git a/tests-clar/resources/renames/.gitted/objects/4e/4cae3e7dd56ed74bff39526d0469e554432953 b/tests-clar/resources/renames/.gitted/objects/4e/4cae3e7dd56ed74bff39526d0469e554432953 new file mode 100644 index 0000000000000000000000000000000000000000..5e6ebd5e026aaa6b177e86c219ecf9258c821116 GIT binary patch literal 452 zcmV;#0XzP90bNqP&eSjvr1n#6M{}Wof{FrYPWnDh2!yCN@#bvdc%!wG=-!^$92IGt zoM&g}=fVX-~P{DOW0a7E0V`6sfdu6dE5mE6r+tzHPKM zfWw!qQ|@#C+map_RZ!q+66$)6fRFFe!mGAU!1W|lc@fh2d|&vFn1AGc3BQw)$s~D~ zNV={jtz`v6jacAQt{~-xl^`94aOEx+;$3rOY{jcXC$;KM92q&62Swom#XjQZ3qi&z zmRpi|p(AMlXwo|CR-?oazNwuaM&NSK(9;tVz!>`l&LcMoKXofmlk${Yn>0SoOWCml zu8QiJ)JxT)NW8CA7GiNX~FfcPQQOL|rO)V(Stk5f|C}DW@W%1+v&stkw@~mCN zZnoyh#Ipk2P<22h#i>PQnR)48l|Om?5AmJ7ulR0XmibGiSQTf>OIu+o^Yha4)6A1I zOEOc7!HS&({$D*jVUz4t598A3K^^y2zI`eLRa}}^l9`*DQwdf#EAwW;x+xnHzUFAP RGlj%yZ(P086aZGANWbzjPe1?w literal 0 HcmV?d00001 diff --git a/tests-clar/resources/renames/.gitted/objects/9a/69d960ae94b060f56c2a8702545e2bb1abb935 b/tests-clar/resources/renames/.gitted/objects/9a/69d960ae94b060f56c2a8702545e2bb1abb935 new file mode 100644 index 0000000000000000000000000000000000000000..f75178c59abb114a2724eb88d32f32ce03aef3be GIT binary patch literal 464 zcmV;>0Wbb|0bNqDuGBCPq_*UL*pB9f4yY)A=A`#{LLfxFi8p5ppEt6dMECd1`lxVY zC!U?1nf07?rjPGGy!lmnx=Fr!_vzpA&bwFbF_kN&LOHEMksHk-g>D>#<~#O6t5)0J zHrgA&-hJ6SrA{ZnE$WF{1qbdHp{}C_gnX6e-HWzP0QM+U_$H+5IN$h>RQpK%$-CcC zsmdbhkU+X^Ra#35juOzq%1lH|4NXBiP2OF&%MBv>rpv<@dTkf|qV>JdSpknIBdnVNX_Q}+x>F)h&q zO5=0f%7HfUmQ^2#Jr_N*ge&Y<`dm9gHayu(9?E&v+O7Mm&RL-PNQ<;#Du`^;S#`h0 z4h;`G2<=4>t*)z-CN_vY2k3*acjnadg-cP>;~nA8 z2?%0=3`y`=iNj&>A}N5)`Bov!%rTu>(Xzl2Q$u@{(NLUvqwiI>DBZiSdV`T3hk-#c zBNvSM@en|N-MI$KQH>x}!N9{bbyd)6nI=58$e8Y9Lc<>Yx2B1H?BNa~dQO{7+`GTo G-~OIXpz5sv literal 0 HcmV?d00001 diff --git a/tests-clar/resources/renames/.gitted/objects/d7/9b202de198fa61b02424b9e25e840dc75e1323 b/tests-clar/resources/renames/.gitted/objects/d7/9b202de198fa61b02424b9e25e840dc75e1323 new file mode 100644 index 0000000000000000000000000000000000000000..daa2b3997579e55909bdbc77202824fb145fb6ef GIT binary patch literal 421 zcmV;W0b2fe0Zo!kj?^#^g<1D0-mCzrd&CMBtQu+1v}OSUq+UCdN^HfkTeg#s9f#nA zoP<~I4#OgfQ$H_Xy>jDYgAecCzuEyOJUu*oMRq@7V~|{sCCx7MhfxCaz?&adRunV! zwqO((@7Xm3S>AqR0kbY4m{BrJ5}d6mFrnpPy}fTjM+P6`vISXtEsOV+BMbAz%7{2i zg4d)zSqiBE|PK#$Rp?Z^XoTL->qN} zxnvXx7)kH6;AOAMd$tih2M)1X0NtARcj|=ptJV26mtmR|O$!QGnj4oun>*uDzL}ve zaT+!}N8J{W@ggDDa#3a!,R!-EaI>yo*4戁Rf m&eIA*!;dݬ +Ho +OUDyTVHpwqH7Ʒ.ts6{Z+X\)C5Q9 +%t*&&v;|'4 Du[7he!NK*"C-=`#؎$Ee2T|@NBsslW|/0¬aȥJNv)-ڡiۤ3bbO:uWMNX7T \ No newline at end of file diff --git a/tests-clar/resources/renames/.gitted/objects/f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 b/tests-clar/resources/renames/.gitted/objects/f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 new file mode 100644 index 0000000000000000000000000000000000000000..f6d933be9929e07a1e66031bc36906d0ae277e8f GIT binary patch literal 441 zcmV;q0Y?6K0bNqdP9rf8mf`?0Jyee#Cwu zUqZDf3kx|++Wjb3RlD-BqV@Xb;uq1w-Q6QmcCSP>2FX1Rl13MrWhcQ9UA2m) z06v7h#ed=6&*BQo%)0n#htMQoVI`|s*}>JdBne6;`u3l?|I(wADQ}d18;aXRM@cyb z_}f9_+n>MY*+M`oas;PdQ0XAXm6p#(urNCti5fK_Aeb#E3-