From 0c05e83a7e6bafe2413c245e5edeecc7f322b7c7 Mon Sep 17 00:00:00 2001 From: Marco Antonio Nina Date: Fri, 9 Nov 2012 09:10:59 -0400 Subject: [PATCH] BUG 9943 Advanced Search menu should be seen on UXS SOLVED - According to the specifications. - Was add the file for advanced search with the same functionality. --- workflow/engine/controllers/home.php | 292 ++++++++++++++- workflow/engine/menus/simplified.php | 2 + .../skinEngine/simplified/css/style.css | 8 + .../skinEngine/simplified/css/topbar.css | 3 +- .../engine/templates/home/appListSearch.html | 353 ++++++++++++++++++ .../images/simplified/advancedSearch.png | Bin 0 -> 2873 bytes .../public_html/images/simplified/down.png | Bin 0 -> 1210 bytes workflow/public_html/images/simplified/up.png | Bin 0 -> 1186 bytes 8 files changed, 653 insertions(+), 5 deletions(-) create mode 100644 workflow/engine/templates/home/appListSearch.html create mode 100644 workflow/public_html/images/simplified/advancedSearch.png create mode 100644 workflow/public_html/images/simplified/down.png create mode 100644 workflow/public_html/images/simplified/up.png diff --git a/workflow/engine/controllers/home.php b/workflow/engine/controllers/home.php index 57bdd58e5..72539314c 100755 --- a/workflow/engine/controllers/home.php +++ b/workflow/engine/controllers/home.php @@ -218,6 +218,53 @@ class Home extends Controller $this->render(); } + public function appAdvancedSearch ($httpData) + { + $title = G::LoadTranslation("ID_ADVANCEDSEARCH"); + $httpData->t = 'search'; + + // settings html template + $this->setView( $this->userUxBaseTemplate . PATH_SEP . 'appListSearch' ); + + $process = (isset($httpData->process)) ? $httpData->process : null; + $status = (isset($httpData->status)) ? $httpData->status : null; + $search = (isset($httpData->search)) ? $httpData->search : null; + $category = (isset($httpData->category)) ? $httpData->category : null; + $user = (isset($httpData->user)) ? $httpData->user : null; + $dateFrom = (isset($httpData->dateFrom)) ? $httpData->dateFrom : null; + $dateTo = (isset($httpData->dateTo)) ? $httpData->dateTo : null; + + $cases = $this->getAppsData( $httpData->t, null, null, $user, null, $search, $process, $status, $dateFrom, $dateTo, null, null, 'APP_CACHE_VIEW.APP_NUMBER', $category); + $arraySearch = array($process, $status, $search, $category, $user, $dateFrom, $dateTo ); + + // settings vars and rendering + $processes = array(); + $processes = $this->getProcessArray($httpData->t, $this->userID ); + $this->setVar( 'statusValues', $this->getStatusArray( $httpData->t, $this->userID ) ); + $this->setVar( 'processValues', $processes ); + $this->setVar( 'categoryValues', $this->getCategoryArray() ); + $this->setVar( 'userValues', $this->getUserArray( $httpData->t, $this->userID ) ); + $this->setVar( 'allUsersValues', $this->getAllUsersArray( 'search' ) ); + $this->setVar( 'categoryTitle', G::LoadTranslation("ID_CATEGORY") ); + $this->setVar( 'processTitle', G::LoadTranslation("ID_PROCESS") ); + $this->setVar( 'statusTitle', G::LoadTranslation("ID_STATUS") ); + $this->setVar( 'searchTitle', G::LoadTranslation("ID_SEARCH") ); + $this->setVar( 'userTitle', G::LoadTranslation("ID_USER") ); + $this->setVar( 'fromTitle', G::LoadTranslation("ID_DELEGATE_DATE_FROM") ); + $this->setVar( 'toTitle', G::LoadTranslation("ID_DELEGATE_DATE_TO") ); + $this->setVar( 'filterTitle', G::LoadTranslation("ID_FILTER") ); + $this->setVar( 'arraySearch', $arraySearch ); + + $this->setVar( 'cases', $cases['data'] ); + $this->setVar( 'cases_count', $cases['totalCount'] ); + $this->setVar( 'title', $title ); + $this->setVar( 'appListStart', $this->appListLimit ); + $this->setVar( 'appListLimit', 10 ); + $this->setVar( 'listType', $httpData->t ); + + $this->render(); + } + public function getApps ($httpData) { $cases = $this->getAppsData( $httpData->t, $httpData->start, $httpData->limit ); @@ -227,7 +274,21 @@ class Home extends Controller $this->render(); } - public function getAppsData ($type, $start = null, $limit = null) + public function getAppsData ( + $type, + $start = null, + $limit = null, + $user = null, + $filter = null, + $search = null, + $process = null, + $status = null, + $dateFrom = null, + $dateTo = null, + $callback = null, + $dir = null, + $sort = "APP_CACHE_VIEW.APP_NUMBER", + $category = null) { require_once ("classes/model/AppNotes.php"); G::LoadClass( 'applications' ); @@ -240,10 +301,22 @@ class Home extends Controller $notesStart = 0; $notesLimit = 4; + switch ($user) { + case 'CURRENT_USER': + $user = $this->userID; + break; + case 'ALL': + $user = null; + break; + case null: + $user = $this->userID; + break; + default: + //$user = $this->userID; + break; + } - $cases = $apps->getAll( $this->userID, $start, $limit, $type ); - //g::pr($cases['data']); die; - + $cases = $apps->getAll( $user, $start, $limit, $type, $filter, $search, $process, $status, $type, $dateFrom, $dateTo, $callback, $dir, $sort, $category); // formating & complitting apps data with 'Notes' foreach ($cases['data'] as $i => $row) { @@ -312,5 +385,216 @@ class Home extends Controller $this->setView( $tpl ); $this->render(); } + + function getUserArray ($action, $userUid) + { + global $oAppCache; + $status = array (); + $users[] = array ("CURRENT_USER",G::LoadTranslation( "ID_CURRENT_USER" )); + $users[] = array ("ALL",G::LoadTranslation( "ID_ALL_USERS" )); + + //now get users, just for the Search action + switch ($action) { + case 'search_simple': + case 'search': + $cUsers = new Criteria( 'workflow' ); + $cUsers->clearSelectColumns(); + $cUsers->addSelectColumn( UsersPeer::USR_UID ); + $cUsers->addSelectColumn( UsersPeer::USR_FIRSTNAME ); + $cUsers->addSelectColumn( UsersPeer::USR_LASTNAME ); + $oDataset = UsersPeer::doSelectRS( $cUsers ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $users[] = array ($aRow['USR_UID'], htmlentities($aRow['USR_LASTNAME'] . ' ' . $aRow['USR_FIRSTNAME'], ENT_QUOTES, "UTF-8")); + $oDataset->next(); + } + break; + default: + return $users; + break; + } + return $users; + } + + function getCategoryArray () + { + global $oAppCache; + require_once 'classes/model/ProcessCategory.php'; + $category[] = array ("",G::LoadTranslation( "ID_ALL_CATEGORIES" ) + ); + + $criteria = new Criteria( 'workflow' ); + $criteria->addSelectColumn( ProcessCategoryPeer::CATEGORY_UID ); + $criteria->addSelectColumn( ProcessCategoryPeer::CATEGORY_NAME ); + $dataset = ProcessCategoryPeer::doSelectRS( $criteria ); + $dataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $dataset->next(); + + while ($row = $dataset->getRow()) { + $category[] = array ($row['CATEGORY_UID'],$row['CATEGORY_NAME']); + $dataset->next(); + } + return $category; + } + + function getAllUsersArray ($action) + { + global $oAppCache; + $status = array (); + $users[] = array ("CURRENT_USER",G::LoadTranslation( "ID_CURRENT_USER" ) + ); + $users[] = array ("",G::LoadTranslation( "ID_ALL_USERS" ) + ); + + if ($action == 'to_reassign') { + //now get users, just for the Search action + $cUsers = $oAppCache->getToReassignListCriteria(null); + $cUsers->addSelectColumn( AppCacheViewPeer::USR_UID ); + + if (g::MySQLSintaxis()) { + $cUsers->addGroupByColumn( AppCacheViewPeer::USR_UID ); + } + + $cUsers->addAscendingOrderByColumn( AppCacheViewPeer::APP_CURRENT_USER ); + $oDataset = AppCacheViewPeer::doSelectRS( $cUsers ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $users[] = array ($aRow['USR_UID'],$aRow['APP_CURRENT_USER']); + $oDataset->next(); + } + } + return $users; + } + + function getStatusArray ($action, $userUid) + { + global $oAppCache; + $status = array (); + $status[] = array ('',G::LoadTranslation( 'ID_ALL_STATUS' )); + //get the list based in the action provided + switch ($action) { + case 'sent': + $cStatus = $oAppCache->getSentListProcessCriteria( $userUid ); // a little slow + break; + case 'simple_search': + case 'search': + $cStatus = new Criteria( 'workflow' ); + $cStatus->clearSelectColumns(); + $cStatus->setDistinct(); + $cStatus->addSelectColumn( ApplicationPeer::APP_STATUS ); + $oDataset = ApplicationPeer::doSelectRS( $cStatus ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $status[] = array ($aRow['APP_STATUS'],G::LoadTranslation( 'ID_CASES_STATUS_' . $aRow['APP_STATUS'] ) + ); //here we can have a translation for the status ( the second param) + $oDataset->next(); + } + return $status; + break; + case 'selfservice': + $cStatus = $oAppCache->getUnassignedListCriteria( $userUid ); + break; + case 'paused': + $cStatus = $oAppCache->getPausedListCriteria( $userUid ); + break; + case 'to_revise': + $cStatus = $oAppCache->getToReviseListCriteria( $userUid ); + // $cStatus = $oAppCache->getPausedListCriteria($userUid); + break; + case 'to_reassign': + $cStatus = $oAppCache->getToReassignListCriteria($userUid); + break; + case 'todo': + case 'draft': + case 'gral': + // case 'to_revise' : + default: + return $status; + break; + } + + //get the status for this user in this action only for participated, unassigned, paused + // if ( $action != 'todo' && $action != 'draft' && $action != 'to_revise') { + if ($action != 'todo' && $action != 'draft') { + //$cStatus = new Criteria('workflow'); + $cStatus->clearSelectColumns(); + $cStatus->setDistinct(); + $cStatus->addSelectColumn( AppCacheViewPeer::APP_STATUS ); + $oDataset = AppCacheViewPeer::doSelectRS( $cStatus ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $status[] = array ($aRow['APP_STATUS'],G::LoadTranslation( 'ID_CASES_STATUS_' . $aRow['APP_STATUS'] )); + //here we can have a translation for the status ( the second param) + $oDataset->next(); + } + } + return $status; + } + function getProcessArray($action, $userUid) + { + global $oAppCache; + + $processes = array(); + $processes[] = array("", G::LoadTranslation("ID_ALL_PROCESS")); + + switch ($action) { + case "simple_search": + case "search": + //In search action, the query to obtain all process is too slow, so we need to query directly to + //process and content tables, and for that reason we need the current language in AppCacheView. + G::loadClass("configuration"); + $oConf = new Configurations; + $oConf->loadConfig($x, "APP_CACHE_VIEW_ENGINE", "", "", "", ""); + $appCacheViewEngine = $oConf->aConfig; + $lang = isset($appCacheViewEngine["LANG"])? $appCacheViewEngine["LANG"] : "en"; + + $cProcess = new Criteria("workflow"); + $cProcess->clearSelectColumns(); + $cProcess->addSelectColumn(ProcessPeer::PRO_UID); + $cProcess->addSelectColumn(ContentPeer::CON_VALUE); + + $del = DBAdapter::getStringDelimiter(); + + $conds = array(); + $conds[] = array(ProcessPeer::PRO_UID, ContentPeer::CON_ID); + $conds[] = array(ContentPeer::CON_CATEGORY, $del . "PRO_TITLE" . $del); + $conds[] = array(ContentPeer::CON_LANG, $del . $lang . $del); + $cProcess->addJoinMC($conds, Criteria::LEFT_JOIN); + $cProcess->add(ProcessPeer::PRO_STATUS, "ACTIVE"); + $oDataset = ProcessPeer::doSelectRS($cProcess); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $processes[] = array($aRow["PRO_UID"], $aRow["CON_VALUE"]); + $oDataset->next(); + } + + return ($processes); + break; + case "consolidated": + default: + $cProcess = $oAppCache->getToDoListCriteria($userUid); //fast enough + break; + } + + $cProcess->clearSelectColumns(); + $cProcess->setDistinct(); + $cProcess->addSelectColumn(AppCacheViewPeer::PRO_UID); + $cProcess->addSelectColumn(AppCacheViewPeer::APP_PRO_TITLE); + $oDataset = AppCacheViewPeer::doSelectRS($cProcess); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + + while ($aRow = $oDataset->getRow()) { + $processes[] = array($aRow["PRO_UID"], $aRow["APP_PRO_TITLE"]); + $oDataset->next(); + } + return ($processes); + } } diff --git a/workflow/engine/menus/simplified.php b/workflow/engine/menus/simplified.php index 46fa1a806..78e0552c6 100644 --- a/workflow/engine/menus/simplified.php +++ b/workflow/engine/menus/simplified.php @@ -12,5 +12,7 @@ if ($RBAC->userCanAccess("PM_CASES") == 1) { "/images/simplified/folder-grey3.png", null, null, null); $G_TMP_MENU->AddIdRawOption("S_NEW_CASE", "#", G::LoadTranslation("ID_NEW_CASE"), "/images/simplified/plus-set-grey.png", null, null, null); + $G_TMP_MENU->AddIdRawOption("S_ADVANCED_SEARCH", "home/appAdvancedSearch", G::LoadTranslation("ID_ADVANCEDSEARCH"), + "/images/simplified/advancedSearch.png", null, null, null); } diff --git a/workflow/engine/skinEngine/simplified/css/style.css b/workflow/engine/skinEngine/simplified/css/style.css index de69a9a51..2ed407717 100644 --- a/workflow/engine/skinEngine/simplified/css/style.css +++ b/workflow/engine/skinEngine/simplified/css/style.css @@ -37,6 +37,14 @@ pre { height: 40px; background-color: #252525; background-position: 0 0; + background: #007eb5; /* Old browsers */ + background: -moz-linear-gradient(top, #007eb5 0%, #003d5a 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#007eb5), color-stop(100%,#003d5a)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #007eb5 0%,#003d5a 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #007eb5 0%,#003d5a 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #007eb5 0%,#003d5a 100%); /* IE10+ */ + background: linear-gradient(to bottom, #007eb5 0%,#003d5a 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#007eb5', endColorstr='#003d5a',GradientType=0 ); /* IE6-9 */ /* background-image: url("/images/twitter_web_sprite_bgs.png"); background-repeat: repeat-x;*/ diff --git a/workflow/engine/skinEngine/simplified/css/topbar.css b/workflow/engine/skinEngine/simplified/css/topbar.css index 008e66135..474d9d998 100644 --- a/workflow/engine/skinEngine/simplified/css/topbar.css +++ b/workflow/engine/skinEngine/simplified/css/topbar.css @@ -592,7 +592,8 @@ div.topbar ul li ul li span { div#corpBar div.topbar-bg { background-color: #142F3C; background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#142F3C), to(#307190)); /* Webkit */ - background-image: -moz-linear-gradient(#142F3C, #1D4558); /* FF3.6 */ + background-image: -moz-linear-gradient(top, #0085bf 0%, #003954 100%); /* FF3.6 */ + /*background-image: -moz-linear-gradient(#677C89 , #1D4558); *//* FF3.6 */ /*erik: modified backgournd colors in topbar, but just for FF, we need todo for others; original: #00a0d1, #008db8 */ diff --git a/workflow/engine/templates/home/appListSearch.html b/workflow/engine/templates/home/appListSearch.html new file mode 100644 index 000000000..38cfaff7e --- /dev/null +++ b/workflow/engine/templates/home/appListSearch.html @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + {literal} + + + + + + + +
+
+
+
+
{$categoryTitle}: + +
+
{$processTitle}: + +
+
{$statusTitle}:     + +
+
+ +
+
{$searchTitle}: + +
+ + +
+ + +
+
  + +
+
   + +
+
+
+
+ +
+
+

{$title} ({$cases_count})

+
    + {include file='home/applications.html'} +
+ + {if $cases_count > $appListLimit} +
+ Load More +
+ {/if} +
+
+ + +
+ + diff --git a/workflow/public_html/images/simplified/advancedSearch.png b/workflow/public_html/images/simplified/advancedSearch.png new file mode 100644 index 0000000000000000000000000000000000000000..7dcc21d0bdacc518fd05b43d3637297b2cb11005 GIT binary patch literal 2873 zcmaJ@dpMMN8-9(+F%5|Z;WbJl%*lDejAKS-8i$-VnK3gMhnZ>S#gH_#Z0RHtn`4FA z-9$E(vLqIfXwgXrh0<17Ijqopqqg?@%HFJ^Skc*e(vY+$9sTI+oGnTs{#Ok z8pYGiSM~*EuaS}h0Lb+i{n#!GbRhR2$d4ZZB{GE^z?sbt=YW(rW+ca#!(=Dzy2Wt- z0C|w>9|Q$ay@@P-9EQ1!!HDAoGByA>ki-HeD~1Ds;hab=&k;3oy$J;T`&qk4)KnF2VCJ@Jgn4mZ=mM0>L9Z{cjiL&$ZH5LVafz5sOf zvjzjXJT^a3^a)L+5-B_p#N@F!6gNkdjE~`R*+jgRowXg_1xK*6^1$QW33fIvu68ai zmac9DXLlQW*DqW*J}W+s!-KwX+5d9!-{dYYLYzRB*^MLQCUDpuLVg_hsbC`an_iq{ zCcfq6Gnf5MFU}s{>iJgzK(U(Q z=Ik$i6n?v_i$zxO246gD+KX_$R8up#Hv5K;iHS*4wj@0rW~-WgIUq1lih!>SYfNDR z%DBf3Nx2#k3SrG~ANyWX#QN~Mb7>m0;%nEB+J`_-?=F;aQ8)aKi_7Ykmu zA2lS9V|1Jqq)Q8Pcrwtu(gI3I7~iLpGCg*eM9w%5+H~lcK@fCvZv08tes+ChW@ejI z&z6TvPsxE@l3!l{>$_U4)zB^8xMYXTu$k+{12Z<4BN*B(E=zH5DFx82`I1+E1s zp>+^BaOK7M_ggfOe@KIZgGkGlJ$Q}Zq zh6R2u-5*Pq96sEg%+L)7GGA>4Ez)9J3T^o}tP~a7T{Sf|>$m1(s6b|s9sQh&c3wqU zje^O361n@s)fejuKKiF+?g{kqVKO2kw>i^P3!R%)RwA=wXhRfRTZyiHnvojetzNC1 zem*uV6*M)y1!A$)z{(m@FI(BmpqbqCOwr`vL`X7aF8Lxtm^%Qs$rP<*7j@5H0%BQ^&r%h0=&jdbBY=nb_cnAzI0 z55?lfOIBmezwbUeS2A}ev2o(Ml-3(a58YOIH>y8r=gIDudXM8;K5TsPoqW?dOXmAf z)UjTdQ}iB%KC7kqlvMqJ3%%o%V~?xh=;46-@zjEit9&=*=>~=A>HZ>qA>NcH)K1c35%1#DH`V+2RuXjpdowR!(OJ$|eJ+@ake$cw~^p^&uk z!ZziFr@Q*UyE0hC3Zr>*);zqki}7$`4tqoHO8i2n{^`l4-1;Lfqc#}mTncdD!f!h# zlg2MK5ta``#RhD5@0o^+sjPe!vuo5#k zbobt3*r7i85Vjg$P_RaCZX++srcfX4?TgjgsSg&m_g@4i)PF#aDSUKsIyEvB4cD^-Llr!xxM-bPV7%ML{tbrzXJv55UVNO;l%8jKW~o+Xv{ zOX+87lfvF)N!jkNRrM247I+(`*1gD4^|TTLf@Bz6f420Vf51hB-!2@=8&1hm z9opbAqNma2c`%BjSsCR?x#`l`y=|97tGuFI(+uEft&e^GR*q$ik!)9br91olph>S) zbcu$Sk6ZY7?#-SC<7-7;5BxjqyX5rHZDwWWFK>VEt2Wa)m%0|6!$5u{QT{ApEjFAF zis;!+OtJqlBdCTNk#H-=_u*)8CY~m-cXFKFU9wiM_`zz=%>ws)U-)^^!NH!@B+L2G z%9#AJr(8nzl_JBu#J-wMfyYfzKpFhOK@t zt&Z#17^-pYr=RwV^W6s>augakcVY;>Fe&fQZ$imWFb)6G%DVdtvE6&!?|X|AOUMTK zt?vpXWAa8Vb4v!z)n^CZC#VRM&mg>PPM$?=qYud2WNVmDuIjO&j14@iihQ=gX7=^W P^3N>Ao#uAIg^~Ur@YA&e literal 0 HcmV?d00001 diff --git a/workflow/public_html/images/simplified/down.png b/workflow/public_html/images/simplified/down.png new file mode 100644 index 0000000000000000000000000000000000000000..4f096346a381a8014b0ccf774031b5c15c7c5c06 GIT binary patch literal 1210 zcmV;r1V#IaP)wr8M*RcS35jB$0~s)oK$Hj$?2rji9=+58y@lHI zxNXmIa38kv8o84%Yvp9GZ-4tcd#^1~6!Cuy>sb?CY;E13B9%rYu7tQKrbnbCnkF^9 zwl%-Bem$ZDDUu=-^Fl0C3sQ)cI@QK>((_lt!>2h zTo6GO31krfloS?gXlNkF2hCTnUOf%8miSazu4V0BlS*w|yS5S6b#Yw}&vkJ<53dXt z&vWrT57+nbJs;2WXh^3?BoZy}?bxyT5yi%~-(8(b;d@?TMWq(01QAt?QqGkK5ulYK znW$%WX67JprmT3=)~$`tRaLbpE&MexK~rNR6L;?52R^=EKoI!&en1fTMFeE;WJx8G z+#VlCE5-7v$;U)fVR47NvSe%c&(dZ_mejepjN} zM5KJwloDnh{!Qj!hD3b=fQg9-1_t}7u8l8IDxy$IF8Ay^(6;1)*v39=N9$-9#rIWokm`jzFKm7-;7w3ZW(?G>N*_FNW`mV(!+?70%f^z;J+p>}2U zzrA9~h|c=%{FY26Gr#2K0mLk48#?@1i8L3thGkheF^8I(YD5%K6f!?IPmm7?!?093 zDv{Zq$?Pw;&qvzk(W6IKgwfndQL<4fMTJv=<2X1K6~tmOf*`>6JZ9ZleBTH7Ln3S2 z-o1OXi+LW~===Kmtcpr&cNEDxK&w_7r3*ha3_}(c7KozgQivSx`K;&6V|;n?3sM@x z!~Km5$lFB90dh!`VPF Y0b4SYEeV(~{Qv*}07*qoM6N<$g2hZQz5oCK literal 0 HcmV?d00001 diff --git a/workflow/public_html/images/simplified/up.png b/workflow/public_html/images/simplified/up.png new file mode 100644 index 0000000000000000000000000000000000000000..a1bbeeffd33c5f33b9e97737ae51d97e9fb966b0 GIT binary patch literal 1186 zcmV;T1YP@yP)4{GOTR4OwT6Z!6{>1P%9T(qO8Lgtm+suW zIr5@BS*hYT>$mJc$A%x=#gg+@5S+Pw{rdb%!EZG; zua_Xa9E(Ql-`TpA>Z(c*K@dbJ_>dYKxZ`+ z8tY!)yctn~6rczNKdN*LtWDs0 zE{LECfJfuw2oQ_M0Z@`Ztfr=h>|C~PczF0S(6GQ$#d5XYR~3(MudPksx-PEk;khoZ z=ke#r2>aUF*xS~|$RES_o`>su_@0mFdDK)_6N|;_KWuH?u?%c%`-94O9N+WseIMV? zYie|q105YyR8&w=Q9;MY`+4~AAz9xin_aLh>tpM%jXt^r{O-=3i8W`9cGR5GD z@kbo$IYcZL10dtNWLy`3SS&_YGRgSZICFD8b8}f--@{lMTiew|u<)sp&N-{V&2tZ{#PIq?~6OSfH|C8p)%nU&o;5bhCGqBM! z#u$v&xal-UKRLpN4I9Yia-9A4EMK1f3gZ}T$L91mUvuuebL4V4s;jE$PIfc<_zAW# z*tWrFYY|xM8QV4p(E3p;8*4W*Iyy@G{&og`{e{xf)hH2^63R+T8T$PuvyFX1M6MJe z3-IT_^1AfUe1nGPmo><#zEf9i+uSq8U>ieG?WJlLRBMf8sb_P8@S2yIKeKFB0603b z3oE#yMCul*(OMI6B50!#QG{W@{L^`|b6J8QSV$d^(6k&o)>|B(%f@D3UtehuKD{VP zwkxG5iIfnDM2M7>;5bgc(>#xio5A;efO`_^T?Y>y99ztJ?w~(@{J1W8Mehqkc^_!7 zl!Yo>I|u@Dxg22_-U*Nshr177T?SYQym*~F`Dr4D>?TwZUK!Acg{s=}TH%mF^&{l|R3E%;CW1=}p7k4Pa^VE_OC07*qoM6N<$g2+oT A`~Uy| literal 0 HcmV?d00001