void EDGAR_FilingFile::FindEDGAR_Tables(RunMode run_mode)
{
    // always start fresh

    EDGAR_filing_tables_.clear();

    CDocument the_filing;
    the_filing.parse(EDGAR_filing_content_.c_str());
    CSelection c = the_filing.find("table");

    // ConvertMarkupToText is a time consuming function -- it actually calls out to
    // an external process right now -- so let's do some async'ing !!

    // keep track of our async processes here.

    std::vector<std::future<std::string>> tasks;

    for (int indx = 0 ; indx < c.nodeNum(); ++indx)
    {
        CNode pNode = c.nodeAt(indx);

        // use the 'Outer' functions to include the table tags in the extracted content.

        std::string content = EDGAR_filing_content_.substr(pNode.startPosOuter(), pNode.endPosOuter() - pNode.startPosOuter());
		if (TableHasMarkup(content))
		{
            if (run_mode == RunMode::do_sync)
            {
    			std::string plain_table = ConvertMarkupToText(content);
                EDGAR_filing_tables_.push_back(plain_table);
            }
            else
                tasks.push_back(std::async(&EDGAR_FilingFile::ConvertMarkupToText, this, content));
		}
        else
            EDGAR_filing_tables_.push_back(content);
    }

    // now, let's go look for our output...

    for (int count = tasks.size(); count; --count)
    {
        int i = wait_for_any(tasks, std::chrono::microseconds{100});
        std::string converted_text;
        try
        {
            converted_text = tasks[i].get();
        }
        catch (...)
        {
            // any problems, let's just ignore them.
            poco_error(the_logger_, "Some problem with an async process");
            continue;
        }
        if (! converted_text.empty())
            EDGAR_filing_tables_.push_back(converted_text);
    }
}        // -----  end of method EDGAR_FilingFile::FindEDGAR_Tables  -----