Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Search Enhancement by Paul Whiter... MS2 ???


Guest

Recommended Posts

Ignore the top code ... it's not the problem...

 

This is the search query

 $from_str = "from (" . TABLE_PRODUCTS . " p left join " . TABLE_PRODUCTS_TO_PRODUCTS_EXTRA_FIELDS . " p2pef on p.products_id=p2pef.products_id) left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id";

 

The error you described is by some table you added after the fact:

 

1054 - Unknown column 'p2pef.manufacturers_id' in 'on clause'

 

 

Not this code unless you have a different error code?

Most Valuable OsCommerce Contributions:

Also Purchased (AP) Preselection (cuts this resource hogging query down to nothing) -- Contribution 3294

FedEx Automated Labels -- Contribution 2244

RMA Returns system -- Contribution 1136

Sort Products By Dropdown -- Contribution 4312

Ultimate SEO URLs -- Contribution 2823

Credit Class & Gift Voucher -- Contribution 282

Cross-Sell -- Contribution 5347

Link to comment
Share on other sites

  • 4 months later...

Thanks for a GREAT contrib! Everything is working for me except the part of removing the trailing 's'. If there are truly NO results to pass back, it works, and if there is a mis-spelt word that I have configured it works great, but if I search for 'drills' I only get redirected to the advanced_search page (and I know I have a lot of 'drill' in the database.)

 

Could anyone comment? I have double/triple-checked everything in the code to no avail. :(

Link to comment
Share on other sites

I notice that the URL on the advanced_search page, when it comes up, looks kind of messed up, it reads (partially)...

 

.../advanced_search.php

?search_in_keywords=1

&plural=1

&s=1

&keywords=drill

&osCsid=a4064c925d14e1bc4625c3f3e82e6aee

&osCsid=abdcf672d1da60c3f37617706da1ae3a

 

I don't think all those 'amp' fields should be in there, and should the osCsid be in there twice?

Edited by SaratogaSupply
Link to comment
Share on other sites

  • 2 weeks later...

I have a silly question (maybe not so silly). It relates to the initial table creation SQL script:

 

CREATE TABLE `search_queries` (
 `search_id` int(11) NOT NULL auto_increment,
 `search_text` tinytext,
 PRIMARY KEY  (`search_id`)
) TYPE=MyISAM AUTO_INCREMENT=24 ;

CREATE TABLE `search_queries_sorted` (
 `search_id` smallint(6) NOT NULL auto_increment,
 `search_text` tinytext NOT NULL,
 `search_count` int(11) NOT NULL default '0',
 PRIMARY KEY  (`search_id`)
) TYPE=MyISAM AUTO_INCREMENT=134 ;

CREATE TABLE `searchword_swap` (
 `sws_id` mediumint(11) NOT NULL auto_increment,
 `sws_word` varchar(100) NOT NULL default '',
 `sws_replacement` varchar(100) NOT NULL default '',
 PRIMARY KEY  (`sws_id`)
) TYPE=MyISAM AUTO_INCREMENT=28 ;

 

 

Why are the auto_increment values set to such bizarre starting numbers? Why not start them all at 1?

 

Max.

Link to comment
Share on other sites

Thanks for a GREAT contrib! Everything is working for me except the part of removing the trailing 's'. If there are truly NO results to pass back, it works, and if there is a mis-spelt word that I have configured it works great, but if I search for 'drills' I only get redirected to the advanced_search page (and I know I have a lot of 'drill' in the database.)

 

Could anyone comment? I have double/triple-checked everything in the code to no avail. :(

 

I too am having problems with the 's' issue. If, for example, I typed "kidneys" (without the quotes) into my searchbox I got nothing but the advanced search page. (I even put kidney into the database as an alternative for kidneys, yet it did not offer me that option - it just kept sending me to advanced search). If I typed "kidney" then it worked. Another problem was that some of my search phrases are words that do end in an "s" without being plural (such as endometriosis) - if I searched for "endometriosis" I simply got sent to the Advanced Search page - whereas if I searched for "endometriosi" (which is an improper spelling and highly unlikely any visitor would ever use it) then I got the results I wanted.

 

So - following the various posts in this forum - I have changed to this: if($pwstr_check == '') and I have changed to rawurlencode.

 

Now at least I get results on words with an "s" at the end, and words without. However; I get different results! If I search for "kidney" and then do another search for "kidneys" - I get two different sets of search results.

 

Has anyone figured out how to get the script working so that words with or without an "s" at the end of them will return the same results?

 

I am going to try the category update listed above next - that sounds handy ;) Just hoping we can get the "s" issue worked through :D

~Tracy
 

Link to comment
Share on other sites

I'm hoping that Paul or other's who have added to this contrib. are actually reading this forum. I would love to use the enhancement - but it doesn't seem to be functioning properly. Aside from the "s" issue - I have found that I don't get the recommended words to search for if my keyword produced no results.

 

ie. - I search for knee and I get no results. I go into admin and setup original word: knee, replacement word: joint

 

I go back to my site, search for knee, and I still get the same no results page - I don't get anything asking me to try "joint".

 

Where in the code should I even be looking to see why this isn't showing up?

 

How do we remove the plural bit of code alltogether if we don't want it to strip off the "s"?

~Tracy
 

Link to comment
Share on other sites

If you go back a few pages into the posts here, you'll see a bit of code that tests for the last character of the search words being an 's' and simply deletes the s out from between the single-quotes. That effectively disables the de-pluralization routine. Once I get a few more contributions working on my store I'm going back to this one to see if I can make it work. 30 contributions added so far, about a dozen to go...

Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...

Thanks for this mod, works great!

 

In the readme, might want to change

 

FIND:

 

$breadcrumb->add(NAVBAR_TITLE1, tep_href_link(FILENAME_ADVANCED_SEARCH));

 

to

 

FIND:

 

$breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ADVANCED_SEARCH));

 

 

notice the missing underscore

 

2.2 MS2 here, btw

 

anyway, thanks again!

 

/clicks install :)

Link to comment
Share on other sites

  • 1 month later...
I notice that the URL on the advanced_search page, when it comes up, looks kind of messed up, it reads (partially)...

 

.../advanced_search.php

?search_in_keywords=1

&plural=1

&s=1

&keywords=drill

&osCsid=a4064c925d14e1bc4625c3f3e82e6aee

&osCsid=abdcf672d1da60c3f37617706da1ae3a

 

I don't think all those 'amp' fields should be in there, and should the osCsid be in there twice?

 

I am having this same problem. When I search for any word that ends in 's' it comes up this way:

http://www.domainhere.com/catalog/advanced...p;keywords=your

What is the problem?

Link to comment
Share on other sites

I am having this same problem. When I search for any word that ends in 's' it comes up this way:

http://www.domainhere.com/catalog/advanced...p;keywords=your

What is the problem?

 

I figured out a hack although I don't know if it is a the best solution or not but it works.

In advanced_search_results.php replace this

 header('location: ' . tep_href_link( FILENAME_ADVANCED_SEARCH_RESULT , 'search_in_keywords=1&plural=1&s=1&keywords=' . urlencode($pwstr_replace) . '' ));

with

 

  $urlll = tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT , 'search_in_keywords=1&plural=1&s=1&keywords=' . urlencode($pwstr_replace) . '' );
   	            $urlll = preg_replace('/&/','&',$urlll);
   	            header('location: ' . $urlll);

Link to comment
Share on other sites

Anybody have a problem with not being able to add or view replacement keywords in Admin?

 

I just installed this and like the way it works, but I can't add any alternate keywords. In Admin when I click "View Word/Phrase List" I get an empty list with a "New Entry" button underneath. Clicking "New Entry" just brings me back to the list of previously searched terms.

 

I've doublechecked the install instructions and can't find anything out of the ordinary that I might have missed. Am I not using this feature correctly?

Link to comment
Share on other sites

I just installed the contrib and it works great.

 

Is it possible to get it to search for categories? Or to direct a misspelled word to a category.

 

Also, a problem I have is that I get extra carachters with in search word admin

 

When I go to Admin -> Tools -> Keyword manager I get the "Search Keyword: Statistics & Replacements" but all links in the search words are wrong.

 

It should be that a search word is linked to catalog/advanced_search_result.php?keywords=searchword&search_in_description=1 but I get catalog/catalogadvanced_search_result.php?keywords=searchword&search_in_description=1

 

Notice the extra catalog there? I have no clue as to where that comes from...

 

Any ideas?

Link to comment
Share on other sites

I just installed this and like the way it works, but I can't add any alternate keywords. In Admin when I click "View Word/Phrase List" I get an empty list with a "New Entry" button underneath. Clicking "New Entry" just brings me back to the list of previously searched terms.

 

After having a late-night moment of inspiration, I wondered if the problem from my last post might have something to do with the browser. I normally use Opera 9.21, which I was using when I had the problem. I fired up Internet Explorer 7 and the admin interface worked perfectly -- I could add new keywords and everything.

 

So apparently this contrib is buggy in Opera, at least on the admin side. As far as I can tell, the only thing that didn't work properly was the functionality to add alternate keywords -- everything else was fine.

Link to comment
Share on other sites

When I go to Admin -> Tools -> Keyword manager I get the "Search Keyword: Statistics & Replacements" but all links in the search words are wrong.

 

It should be that a search word is linked to catalog/advanced_search_result.php?keywords=searchword&search_in_description=1 but I get catalog/catalogadvanced_search_result.php?keywords=searchword&search_in_description=1

 

Notice the extra catalog there? I have no clue as to where that comes from...

 

Any ideas?

 

I solved it. It was my installation at te test site that was screwed up :) When I installed it on the staging server all was fine.

Link to comment
Share on other sites

  • 3 weeks later...
<td class="main" width="33%"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, 'cPath=' . $category_values['categories_id']) . '"><u>' . $category_values['categories_name'] . '</u></a>'; ?></td>

		<?php
	$cat_count = 1;
	} else {
?>
		<td class="main" width="33%"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, 'cPath=' . $category_values['categories_id']) . '"><u>' . $category_values['categories_name'] . '</u></a>'; ?></td>

 

May help someone else :)

 

 

Hi all,

 

nice idea to present relating categories at this serach-level and thanks a lot for coding! Does anybody knows how to return a qualified cPath-URL so that categories-Box & Breadcrumb will display as they should. I included the code above but "$category_values['categories_id']" does not produce a full URL (containing sub-/categories element).

 

E.g. my URL becomes

http://localhost/index.php/cPath/202 instead of

http://localhost/index.php/cPath/72_73_202 (with subcats-elements)

 

Greetings,

Oliver

Link to comment
Share on other sites

  • 1 month later...
Hi all,

 

nice idea to present relating categories at this serach-level and thanks a lot for coding! Does anybody knows how to return a qualified cPath-URL so that categories-Box & Breadcrumb will display as they should. I included the code above but "$category_values['categories_id']" does not produce a full URL (containing sub-/categories element).

 

E.g. my URL becomes

http://localhost/index.php/cPath/202 instead of

http://localhost/index.php/cPath/72_73_202 (with subcats-elements)

 

Greetings,

Oliver

 

just bump

Link to comment
Share on other sites

  • 1 year later...
just bump

 

Hi there,

 

I originally got a programmer to set up my osCommerce site, but after a couple of years of editing the code I'm ready to install this contribution.

 

I prepared all the files but fell at step 2 of the readme file! In it I'm instructed to modify catalog/advanced_search_result.php:

 

FIND:

<tr>

<td class="pageHeading"><?php echo HEADING_TITLE_2; ?></td>

<td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_browse.gif', HEADING_TITLE_2, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>

</tr>

 

BELOW ADD:

 

<tr>

<td class="main"><p>

<?php if (isset($HTTP_GET_VARS['plural']) && ($HTTP_GET_VARS['plural'] == '1')) {

echo TEXT_REPLACEMENT_SEARCH_RESULTS . ' <b><i>' . stripslashes($_GET['keywords']) . 's</i></b>';

} else {

echo TEXT_REPLACEMENT_SEARCH_RESULTS . ' <b><i>' . stripslashes($_GET['keywords']) . '</i></b>';

}

?></p></td>

</tr>

 

 

FIND:

 

$breadcrumb->add(NAVBAR_TITLE1, tep_href_link(FILENAME_ADVANCED_SEARCH));

$breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, tep_get_all_get_params(), 'NONSSL', true, false));?>

 

ABOVE ADD:

 

// Search enhancement mod start

$search_enhancements_keywords = $_GET['keywords'];

$search_enhancements_keywords = strip_tags($search_enhancements_keywords);

$search_enhancements_keywords = addslashes($search_enhancements_keywords);

 

if ($search_enhancements_keywords != $last_search_insert) {

tep_db_query("insert into search_queries (search_text) values ('" . $search_enhancements_keywords . "')");

tep_session_register('last_search_insert');

$last_search_insert = $search_enhancements_keywords;

}

// Search enhancement mod end

 

But I can't find either of those areas of code in the file. My advanced_search_result.php looks like this:

 

<?php

/*

$Id: advanced_search_result.php,v 1.72 2003/06/23 06:50:11 project3000 Exp $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 2003 osCommerce

 

Released under the GNU General Public License

*/

 

require('includes/application_top.php');

 

require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ADVANCED_SEARCH);

 

$error = false;

 

if ( (isset($_GET['keywords']) && empty($_GET['keywords'])) &&

(isset($_GET['dfrom']) && (empty($_GET['dfrom']) || ($_GET['dfrom'] == DOB_FORMAT_STRING))) &&

(isset($_GET['dto']) && (empty($_GET['dto']) || ($_GET['dto'] == DOB_FORMAT_STRING))) &&

(isset($_GET['pfrom']) && !is_numeric($_GET['pfrom'])) &&

(isset($_GET['pto']) && !is_numeric($_GET['pto'])) ) {

$error = true;

 

$messageStack->add_session('search', ERROR_AT_LEAST_ONE_INPUT);

} else {

$dfrom = '';

$dto = '';

$pfrom = '';

$pto = '';

$keywords = '';

 

if (isset($_GET['dfrom'])) {

$dfrom = (($_GET['dfrom'] == DOB_FORMAT_STRING) ? '' : $_GET['dfrom']);

}

 

if (isset($_GET['dto'])) {

$dto = (($_GET['dto'] == DOB_FORMAT_STRING) ? '' : $_GET['dto']);

}

 

if (isset($_GET['pfrom'])) {

$pfrom = $_GET['pfrom'];

}

 

if (isset($_GET['pto'])) {

$pto = $_GET['pto'];

}

 

if (isset($_GET['keywords'])) {

$keywords = $_GET['keywords'];

}

 

$date_check_error = false;

if (tep_not_null($dfrom)) {

if (!tep_checkdate($dfrom, DOB_FORMAT_STRING, $dfrom_array)) {

$error = true;

$date_check_error = true;

 

$messageStack->add_session('search', ERROR_INVALID_FROM_DATE);

}

}

 

if (tep_not_null($dto)) {

if (!tep_checkdate($dto, DOB_FORMAT_STRING, $dto_array)) {

$error = true;

$date_check_error = true;

 

$messageStack->add_session('search', ERROR_INVALID_TO_DATE);

}

}

 

if (($date_check_error == false) && tep_not_null($dfrom) && tep_not_null($dto)) {

if (mktime(0, 0, 0, $dfrom_array[1], $dfrom_array[2], $dfrom_array[0]) > mktime(0, 0, 0, $dto_array[1], $dto_array[2], $dto_array[0])) {

$error = true;

 

$messageStack->add_session('search', ERROR_TO_DATE_LESS_THAN_FROM_DATE);

}

}

 

$price_check_error = false;

if (tep_not_null($pfrom)) {

if (!settype($pfrom, 'double')) {

$error = true;

$price_check_error = true;

 

$messageStack->add_session('search', ERROR_PRICE_FROM_MUST_BE_NUM);

}

}

 

if (tep_not_null($pto)) {

if (!settype($pto, 'double')) {

$error = true;

$price_check_error = true;

 

$messageStack->add_session('search', ERROR_PRICE_TO_MUST_BE_NUM);

}

}

 

if (($price_check_error == false) && is_float($pfrom) && is_float($pto)) {

if ($pfrom >= $pto) {

$error = true;

 

$messageStack->add_session('search', ERROR_PRICE_TO_LESS_THAN_PRICE_FROM);

}

}

 

if (tep_not_null($keywords)) {

if (!tep_parse_search_string($keywords, $search_keywords)) {

$error = true;

 

$messageStack->add_session('search', ERROR_INVALID_KEYWORDS);

}

}

}

 

if (empty($dfrom) && empty($dto) && empty($pfrom) && empty($pto) && empty($keywords)) {

$error = true;

 

$messageStack->add_session('search', ERROR_AT_LEAST_ONE_INPUT);

}

 

if ($error == true) {

tep_redirect(tep_href_link(FILENAME_ADVANCED_SEARCH, tep_get_all_get_params(), 'NONSSL', true, false));

}

 

$breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ADVANCED_SEARCH));

$breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, tep_get_all_get_params(), 'NONSSL', true, false));

 

$content = CONTENT_ADVANCED_SEARCH_RESULT;

 

include (bts_select('main', $content_template)); // BTSv1.5

 

require(DIR_WS_INCLUDES . 'application_bottom.php');

?>

 

 

Can anyone help? I'm sure I'm being really stupid...

 

On a separate note, I'm hoping this contribution will significantly improve the search facility, as I'm frustrated that when a customer enters a search term, if the operator is set to 'and' it will not return a result if they add anything that isn't explicitly in the description. Alternatively, if it is set to 'or' it will return hundreds of results. The latter would be fine, except that there is no relevance to the order.

 

Is there a way to display search results in order of relevance? ie results which contain more than one of the search terms would be at the top.

 

 

Any advice is really gratefully received

hor-i-zon

Link to comment
Share on other sites

I'm thinking this may not have been the most been the relevant thread to discuss other ways to improve the search facility.

 

Has anyone else become frustrated with the search mechanism and the way it displays results?

 

I've done lots of searching within the forums and through google and everything has led me to this single thread. If anyone can tell me how they've improved their search facility I'd be really grateful.

hor-i-zon

Link to comment
Share on other sites

  • 4 weeks later...

Hello... I tried the $urlll solution, but to no avail (same lousy error). Very frustrating.

What do you think of this solution?

 

Find:

           if($pwstr_check == 's'){
                   $pwstr_replace = substr($_GET['keywords'], 0, strlen($_GET['keywords'])-1);
                  header('location: ' . tep_href_link( FILENAME_ADVANCED_SEARCH_RESULT , 'search_in_keywords=1&plural=1&s=1&keywords=' . urlencode($pwstr_replace) . '' ));

and replace with:

           if($pwstr_check == 's'){
                   $pwstr_replace = substr($_GET['keywords'], 0, strlen($_GET['keywords'])-1);
                   $_GET['keywords'] = substr($_GET['keywords'], 0, strlen($_GET['keywords'])-1);

 

I don't understand why we would want to issue a 'header' from this page, when we already have all the data we need. So, I removed it. What may actually be better than the above is to declare a new variable, set it equal to $_GET['keywords'] at the beginning of the file, and use the variable everywhere after the "if" statament. (I don't like modifying $_GET, but it was a quick way to try my idea).

 

Any thoughts? This seems to have worked for me...

 

Also kind of disappointing that when installing the module, the new admin pages didn't have buttons that looked like all the others on the admin site. Had to create my own. And, didn't like the links on the admin page that take you off the admin site and to a search page instead, with no way back. On my site I disabled those links.

 

Just food for thought I guess.

Link to comment
Share on other sites

  • 4 weeks later...

Hello everyone!

 

I like the concept of this add-on. It seems to work pretty good on my site, but I have a couple of problems, and a requests....

 

Info: Firefox v3.0.4, and test with IE 7

 

Problem #1: When clicking on a search keyword in the Admin interface, the search opens up both in the current tab AND a new tab.

 

Problem #2: When clicking on a search keyword in the Admin interface, that search increments the Search Count, thus skewing the results.

 

Request #1: Deleting a specific search keyword, or replacement word/phrase is desperately needed. I could probably do this myself with phpMyadmin, but that would be the worst way to do it.

 

Keep up the good work!

Link to comment
Share on other sites

I'm hoping that Paul or other's who have added to this contrib. are actually reading this forum. I would love to use the enhancement - but it doesn't seem to be functioning properly. Aside from the "s" issue - I have found that I don't get the recommended words to search for if my keyword produced no results.

 

ie. - I search for knee and I get no results. I go into admin and setup original word: knee, replacement word: joint

 

I go back to my site, search for knee, and I still get the same no results page - I don't get anything asking me to try "joint".

 

Where in the code should I even be looking to see why this isn't showing up?

 

How do we remove the plural bit of code alltogether if we don't want it to strip off the "s"?

 

I just installed V1.1c and it seems to have these same issues still.

 

1) Plural strips the whole word. When I add "s" to the end of any valid term in my shop the search results return an error stating the the fields were blank.

 

2) No Search suggestions. I've entered replacement search terms in the admin but they have no effect.

 

Is this an installation problem on my end; in other words are any of you using this having success with returned search suggested words based on your admin entries?

Link to comment
Share on other sites

I just installed V1.1c and it seems to have these same issues still.

 

Is this an installation problem on my end; in other words are any of you using this having success with returned search suggested words based on your admin entries?

 

I'm no expert, but most problems I've encountered with osCommerce add-ons is usually due to installation. The lack of a plug-in architecture makes some add-ons hackish at best.

 

What I do is this:

 

1. Create a backup of my osCommerce files.

2. Create a second "edit copy" of osCommerce.

3. Read through the installation instructions and note down the osCommerce filenames required to edit.

4. Delete all other files not required from the "edit copy".

5. Create a copy of the "edit copy" and call it "quick restore". (optional)

5. Copy over the add-on files to the "edit copy".

6. Edit the files as required as per the add-on's instructions.

7. Double-check your work!

8. Copy the "edit copy" to your webserver, and test thoroughly.

 

Use a good file editor. For Windows, I use Notepad++; I can view multiple files side-by-side and sync the horizontal and vertical scrolling, and formats the sourcecode for better readability.

 

Good luck!

Link to comment
Share on other sites

I'm no expert, but most problems I've encountered with osCommerce add-ons is usually due to installation. The lack of a plug-in architecture makes some add-ons hackish at best.

 

What I do is this:

 

1. Create a backup of my osCommerce files.

2. Create a second "edit copy" of osCommerce.

3. Read through the installation instructions and note down the osCommerce filenames required to edit.

4. Delete all other files not required from the "edit copy".

5. Create a copy of the "edit copy" and call it "quick restore". (optional)

5. Copy over the add-on files to the "edit copy".

6. Edit the files as required as per the add-on's instructions.

7. Double-check your work!

8. Copy the "edit copy" to your webserver, and test thoroughly.

 

Use a good file editor. For Windows, I use Notepad++; I can view multiple files side-by-side and sync the horizontal and vertical scrolling, and formats the sourcecode for better readability.

 

Good luck!

Thanks Tristen,

 

I am pretty well experienced with installing contributions and follow a very similar technique as you mention. I have winmerge and PHP designer for code edits which is very helpful.

 

I am mostly looking for an over-all response to find out if this v1.1c is functional with respect to the suggested links. If it is, then if anyone well versed with this add-in may have a suggestion as to what part of the code may be the cause for the suggested links not showing on my install.

 

I went through the full install twice and searched the forum before posting; it seems that the add-in is working for me with the exception of the plural "s" filter and not showing suggested alternate searches.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...