<?xml version="1.0" ?>
<informationTable xsi:schemaLocation="http://www.sec.gov/edgar/document/thirteenf/informationtable eis_13FDocument.xsd" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:n1="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <infoTable>
    <nameOfIssuer>3M CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>88579Y101</cusip>
    <value>842</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4770</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4210</Sole>
      <Shared>0</Shared>
      <None>560</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AAON INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.004</titleOfClass>
    <cusip>000360206</cusip>
    <value>79553</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1610056</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1606489</Sole>
      <Shared>0</Shared>
      <None>3567</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBOTT LABS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>002824100</cusip>
    <value>781</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8990</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8990</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBVIE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00287Y109</cusip>
    <value>703</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7935</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7935</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ACI WORLDWIDE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>004498101</cusip>
    <value>101279</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2673319</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2652544</Sole>
      <Shared>0</Shared>
      <None>20775</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ADOBE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00724F101</cusip>
    <value>419</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1270</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1070</Sole>
      <Shared>0</Shared>
      <None>200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALBANY INTL CORP</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>012348108</cusip>
    <value>65569</value>
    <shrsOrPrnAmt>
      <sshPrnamt>863661</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>855370</Sole>
      <Shared>0</Shared>
      <None>8291</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALIGN TECHNOLOGY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>016255101</cusip>
    <value>581</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2082</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2082</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL A</titleOfClass>
    <cusip>02079K305</cusip>
    <value>281</value>
    <shrsOrPrnAmt>
      <sshPrnamt>210</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>140</Sole>
      <Shared>0</Shared>
      <None>70</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL C</titleOfClass>
    <cusip>02079K107</cusip>
    <value>274</value>
    <shrsOrPrnAmt>
      <sshPrnamt>205</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>60</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALTAIR ENGR INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>021369103</cusip>
    <value>69553</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1936877</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1918327</Sole>
      <Shared>0</Shared>
      <None>18550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AMGEN INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>031162100</cusip>
    <value>321</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1330</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ANSYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03662Q105</cusip>
    <value>5625</value>
    <shrsOrPrnAmt>
      <sshPrnamt>21853</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18333</Sole>
      <Shared>0</Shared>
      <None>3520</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>APPLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>037833100</cusip>
    <value>755</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1550</Sole>
      <Shared>0</Shared>
      <None>1020</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AQUA AMERICA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03836W103</cusip>
    <value>286</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6087</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5387</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AQUAVENTURE HLDGS LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G0443N107</cusip>
    <value>921</value>
    <shrsOrPrnAmt>
      <sshPrnamt>33945</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>33945</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AXON ENTERPRISE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>05464C101</cusip>
    <value>61292</value>
    <shrsOrPrnAmt>
      <sshPrnamt>836411</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>819006</Sole>
      <Shared>0</Shared>
      <None>17405</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BALCHEM CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>057665200</cusip>
    <value>82350</value>
    <shrsOrPrnAmt>
      <sshPrnamt>810293</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>801914</Sole>
      <Shared>0</Shared>
      <None>8379</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIO TECHNE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09073M104</cusip>
    <value>70601</value>
    <shrsOrPrnAmt>
      <sshPrnamt>321632</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>317405</Sole>
      <Shared>0</Shared>
      <None>4227</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIOLIFE SOLUTIONS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>09062W204</cusip>
    <value>482</value>
    <shrsOrPrnAmt>
      <sshPrnamt>29810</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>29810</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKBAUD INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09227Q100</cusip>
    <value>81014</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1017758</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1005941</Sole>
      <Shared>0</Shared>
      <None>11817</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKLINE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09239B109</cusip>
    <value>78856</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1529394</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1526094</Sole>
      <Shared>0</Shared>
      <None>3300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BOTTOMLINE TECH DEL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>101388106</cusip>
    <value>104461</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1948897</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1932692</Sole>
      <Shared>0</Shared>
      <None>16205</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BRIGHT HORIZONS FAM SOL IN D</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>109194100</cusip>
    <value>7719</value>
    <shrsOrPrnAmt>
      <sshPrnamt>51359</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>41964</Sole>
      <Shared>0</Shared>
      <None>9395</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CANTEL MEDICAL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>138098108</cusip>
    <value>118843</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1676203</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1658770</Sole>
      <Shared>0</Shared>
      <None>17433</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CAREDX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>14167L103</cusip>
    <value>721</value>
    <shrsOrPrnAmt>
      <sshPrnamt>33405</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>33405</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CASELLA WASTE SYS INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>147448104</cusip>
    <value>66672</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1448450</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1430595</Sole>
      <Shared>0</Shared>
      <None>17855</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEFS WHSE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>163086101</cusip>
    <value>75179</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1972675</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1947152</Sole>
      <Shared>0</Shared>
      <None>25523</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEMBIO DIAGNOSTICS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>163572209</cusip>
    <value>529</value>
    <shrsOrPrnAmt>
      <sshPrnamt>116075</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>116075</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEVRON CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>166764100</cusip>
    <value>364</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3024</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3024</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CODEXIS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192005106</cusip>
    <value>701</value>
    <shrsOrPrnAmt>
      <sshPrnamt>43835</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>43835</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COGNEX CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192422103</cusip>
    <value>3983</value>
    <shrsOrPrnAmt>
      <sshPrnamt>71071</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>56166</Sole>
      <Shared>0</Shared>
      <None>14905</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CONSTRUCTION PARTNERS INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>21044C107</cusip>
    <value>36109</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2140403</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2112800</Sole>
      <Shared>0</Shared>
      <None>27603</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COPART INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>217204106</cusip>
    <value>4924</value>
    <shrsOrPrnAmt>
      <sshPrnamt>54142</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>45192</Sole>
      <Shared>0</Shared>
      <None>8950</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CORE LABORATORIES N V</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>N22717107</cusip>
    <value>1357</value>
    <shrsOrPrnAmt>
      <sshPrnamt>36016</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>32141</Sole>
      <Shared>0</Shared>
      <None>3875</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTAR GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160N109</cusip>
    <value>960</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1605</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1605</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTCO WHSL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160K105</cusip>
    <value>683</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2325</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1760</Sole>
      <Shared>0</Shared>
      <None>565</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CRYOPORT INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.001</titleOfClass>
    <cusip>229050307</cusip>
    <value>706</value>
    <shrsOrPrnAmt>
      <sshPrnamt>42920</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>42920</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DANAHER CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>235851102</cusip>
    <value>285</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1855</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1345</Sole>
      <Shared>0</Shared>
      <None>510</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DESCARTES SYS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>249906108</cusip>
    <value>148489</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3475860</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3445935</Sole>
      <Shared>0</Shared>
      <None>29925</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOLBY LABORATORIES INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>25659T107</cusip>
    <value>438</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6368</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5868</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DORMAN PRODUCTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>258278100</cusip>
    <value>61070</value>
    <shrsOrPrnAmt>
      <sshPrnamt>806523</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>804723</Sole>
      <Shared>0</Shared>
      <None>1800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOUGLAS DYNAMICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>25960R105</cusip>
    <value>107419</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1953075</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1925940</Sole>
      <Shared>0</Shared>
      <None>27135</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ECOLAB INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>278865100</cusip>
    <value>261</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1350</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>720</Sole>
      <Shared>0</Shared>
      <None>630</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESCO TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>296315104</cusip>
    <value>86695</value>
    <shrsOrPrnAmt>
      <sshPrnamt>937241</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>935201</Sole>
      <Shared>0</Shared>
      <None>2040</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVI INDUSTRIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>26929N102</cusip>
    <value>21768</value>
    <shrsOrPrnAmt>
      <sshPrnamt>805021</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>788031</Sole>
      <Shared>0</Shared>
      <None>16990</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVOLENT HEALTH INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>30050B101</cusip>
    <value>570</value>
    <shrsOrPrnAmt>
      <sshPrnamt>62990</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>62990</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXPONENT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30214U102</cusip>
    <value>164506</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2383796</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2363197</Sole>
      <Shared>0</Shared>
      <None>20599</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXXON MOBIL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30231G102</cusip>
    <value>1333</value>
    <shrsOrPrnAmt>
      <sshPrnamt>19104</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18954</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FACTSET RESH SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303075105</cusip>
    <value>561</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2091</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2091</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FAIR ISAAC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303250104</cusip>
    <value>5622</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15005</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12125</Sole>
      <Shared>0</Shared>
      <None>2880</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FASTENAL CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>311900104</cusip>
    <value>1035</value>
    <shrsOrPrnAmt>
      <sshPrnamt>28007</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23557</Sole>
      <Shared>0</Shared>
      <None>4450</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIRSTSERVICE CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>33767E202</cusip>
    <value>65119</value>
    <shrsOrPrnAmt>
      <sshPrnamt>699908</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>690960</Sole>
      <Shared>0</Shared>
      <None>8948</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIVE9 INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>338307101</cusip>
    <value>32480</value>
    <shrsOrPrnAmt>
      <sshPrnamt>495279</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>494154</Sole>
      <Shared>0</Shared>
      <None>1125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FORTINET INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>34959E109</cusip>
    <value>653</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6113</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6113</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FOX FACTORY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>35138V102</cusip>
    <value>110274</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1585074</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1581549</Sole>
      <Shared>0</Shared>
      <None>3525</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARMIN LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>H2906T109</cusip>
    <value>446</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3870</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARTNER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>366651107</cusip>
    <value>3997</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25940</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>21215</Sole>
      <Shared>0</Shared>
      <None>4725</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRACO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>384109104</cusip>
    <value>4193</value>
    <shrsOrPrnAmt>
      <sshPrnamt>80630</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>65880</Sole>
      <Shared>0</Shared>
      <None>14750</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRAND CANYON ED INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>38526M106</cusip>
    <value>77433</value>
    <shrsOrPrnAmt>
      <sshPrnamt>808365</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>800415</Sole>
      <Shared>0</Shared>
      <None>7950</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GUIDEWIRE SOFTWARE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>40171V100</cusip>
    <value>5348</value>
    <shrsOrPrnAmt>
      <sshPrnamt>48717</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>39217</Sole>
      <Shared>0</Shared>
      <None>9500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEALTH CATALYST INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42225T107</cusip>
    <value>4065</value>
    <shrsOrPrnAmt>
      <sshPrnamt>117137</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>97012</Sole>
      <Shared>0</Shared>
      <None>20125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEICO CORP NEW</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>422806208</cusip>
    <value>6403</value>
    <shrsOrPrnAmt>
      <sshPrnamt>71513</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>58363</Sole>
      <Shared>0</Shared>
      <None>13150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HELIOS TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42328H109</cusip>
    <value>69110</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1494907</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1491595</Sole>
      <Shared>0</Shared>
      <None>3312</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HENRY JACK &amp; ASSOC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>426281101</cusip>
    <value>6406</value>
    <shrsOrPrnAmt>
      <sshPrnamt>43976</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>35726</Sole>
      <Shared>0</Shared>
      <None>8250</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEXCEL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>428291108</cusip>
    <value>351</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4793</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4793</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HOME DEPOT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>437076102</cusip>
    <value>262</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1200</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1200</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IAA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>449253103</cusip>
    <value>3896</value>
    <shrsOrPrnAmt>
      <sshPrnamt>82783</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>67883</Sole>
      <Shared>0</Shared>
      <None>14900</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IDEXX LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>45168D104</cusip>
    <value>359</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1375</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1375</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IHS MARKIT LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G47567105</cusip>
    <value>1550</value>
    <shrsOrPrnAmt>
      <sshPrnamt>20566</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17928</Sole>
      <Shared>0</Shared>
      <None>2638</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEGRA LIFESCIENCES HLDGS C</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>457985208</cusip>
    <value>291</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>458140100</cusip>
    <value>413</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6900</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6400</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTERNATIONAL BUSINESS MACHS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>459200101</cusip>
    <value>300</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2235</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2235</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTRICON CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46121H109</cusip>
    <value>573</value>
    <shrsOrPrnAmt>
      <sshPrnamt>31825</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>31825</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTUIT</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>461202103</cusip>
    <value>488</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1865</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1605</Sole>
      <Shared>0</Shared>
      <None>260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IPG PHOTONICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>44980X109</cusip>
    <value>434</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2995</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2995</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ISHARES TR</nameOfIssuer>
    <titleOfClass>RUS 2000 GRW ETF</titleOfClass>
    <cusip>464287648</cusip>
    <value>1561</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7285</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7285</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHN BEAN TECHNOLOGIES CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>477839104</cusip>
    <value>67151</value>
    <shrsOrPrnAmt>
      <sshPrnamt>596048</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>588225</Sole>
      <Shared>0</Shared>
      <None>7823</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHNSON &amp; JOHNSON</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>478160104</cusip>
    <value>476</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3261</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2511</Sole>
      <Shared>0</Shared>
      <None>750</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JPMORGAN CHASE &amp; CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46625H100</cusip>
    <value>382</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2741</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2341</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>KIMBERLY CLARK CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>494368103</cusip>
    <value>585</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4250</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LCI INDS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>50189K103</cusip>
    <value>3576</value>
    <shrsOrPrnAmt>
      <sshPrnamt>33376</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>26396</Sole>
      <Shared>0</Shared>
      <None>6980</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LEMAITRE VASCULAR INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>525558201</cusip>
    <value>61670</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1715446</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1711603</Sole>
      <Shared>0</Shared>
      <None>3843</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LIGAND PHARMACEUTICALS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>53220K504</cusip>
    <value>64624</value>
    <shrsOrPrnAmt>
      <sshPrnamt>619653</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>612868</Sole>
      <Shared>0</Shared>
      <None>6785</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LINDE PLC</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G5494J103</cusip>
    <value>599</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2815</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2155</Sole>
      <Shared>0</Shared>
      <None>660</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MARKEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>570535104</cusip>
    <value>976</value>
    <shrsOrPrnAmt>
      <sshPrnamt>854</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>694</Sole>
      <Shared>0</Shared>
      <None>160</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MASTERCARD INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>57636Q104</cusip>
    <value>455</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1525</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1215</Sole>
      <Shared>0</Shared>
      <None>310</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCK &amp; CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58933Y105</cusip>
    <value>605</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6650</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCURY SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589378108</cusip>
    <value>87379</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1264351</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1247131</Sole>
      <Shared>0</Shared>
      <None>17220</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERIT MED SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589889104</cusip>
    <value>57331</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1836352</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1809220</Sole>
      <Shared>0</Shared>
      <None>27132</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MESA LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>59064R109</cusip>
    <value>111384</value>
    <shrsOrPrnAmt>
      <sshPrnamt>446607</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>446170</Sole>
      <Shared>0</Shared>
      <None>437</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MGP INGREDIENTS INC NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>55303J106</cusip>
    <value>58331</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1203946</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1192132</Sole>
      <Shared>0</Shared>
      <None>11814</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MICROSOFT CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>594918104</cusip>
    <value>754</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4779</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4049</Sole>
      <Shared>0</Shared>
      <None>730</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NANOSTRING TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>63009R109</cusip>
    <value>606</value>
    <shrsOrPrnAmt>
      <sshPrnamt>21770</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>21770</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NATIONAL RESH CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>637372202</cusip>
    <value>40550</value>
    <shrsOrPrnAmt>
      <sshPrnamt>614957</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>613456</Sole>
      <Shared>0</Shared>
      <None>1501</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>640491106</cusip>
    <value>102725</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1574090</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1555581</Sole>
      <Shared>0</Shared>
      <None>18509</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NIKE INC</nameOfIssuer>
    <titleOfClass>CL B</titleOfClass>
    <cusip>654106103</cusip>
    <value>298</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2940</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2240</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NOVANTA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>67000B104</cusip>
    <value>84590</value>
    <shrsOrPrnAmt>
      <sshPrnamt>956469</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>954344</Sole>
      <Shared>0</Shared>
      <None>2125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NV5 GLOBAL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>62945V109</cusip>
    <value>849</value>
    <shrsOrPrnAmt>
      <sshPrnamt>16830</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>16830</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMEGA FLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>682095104</cusip>
    <value>37403</value>
    <shrsOrPrnAmt>
      <sshPrnamt>348619</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>347834</Sole>
      <Shared>0</Shared>
      <None>785</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMNICELL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68213N109</cusip>
    <value>128933</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1577744</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1557014</Sole>
      <Shared>0</Shared>
      <None>20730</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ORTHOPEDIATRICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68752L100</cusip>
    <value>804</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17120</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17120</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PAYLOCITY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>70438V106</cusip>
    <value>82600</value>
    <shrsOrPrnAmt>
      <sshPrnamt>683662</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>682172</Sole>
      <Shared>0</Shared>
      <None>1490</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PFIZER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>717081103</cusip>
    <value>670</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17108</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17108</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PLURALSIGHT INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>72941B106</cusip>
    <value>3119</value>
    <shrsOrPrnAmt>
      <sshPrnamt>181238</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>148233</Sole>
      <Shared>0</Shared>
      <None>33005</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PNC FINL SVCS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>693475105</cusip>
    <value>223</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1400</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1400</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>POOL CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>73278L105</cusip>
    <value>6903</value>
    <shrsOrPrnAmt>
      <sshPrnamt>32503</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>26453</Sole>
      <Shared>0</Shared>
      <None>6050</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROCTER &amp; GAMBLE CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>742718109</cusip>
    <value>492</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3940</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3740</Sole>
      <Shared>0</Shared>
      <None>200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROS HOLDINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74346Y103</cusip>
    <value>97390</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1625336</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1621786</Sole>
      <Shared>0</Shared>
      <None>3550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROTO LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>743713109</cusip>
    <value>57344</value>
    <shrsOrPrnAmt>
      <sshPrnamt>564689</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>563514</Sole>
      <Shared>0</Shared>
      <None>1175</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>RBC BEARINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>75524B104</cusip>
    <value>59960</value>
    <shrsOrPrnAmt>
      <sshPrnamt>378676</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>373966</Sole>
      <Shared>0</Shared>
      <None>4710</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>REPLIGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>759916109</cusip>
    <value>117043</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1265334</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1250684</Sole>
      <Shared>0</Shared>
      <None>14650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROGERS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775133101</cusip>
    <value>69106</value>
    <shrsOrPrnAmt>
      <sshPrnamt>554046</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>552786</Sole>
      <Shared>0</Shared>
      <None>1260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROLLINS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775711104</cusip>
    <value>6218</value>
    <shrsOrPrnAmt>
      <sshPrnamt>187518</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>155936</Sole>
      <Shared>0</Shared>
      <None>31582</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROPER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>776696106</cusip>
    <value>492</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1390</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1110</Sole>
      <Shared>0</Shared>
      <None>280</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SHOTSPOTTER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82536T107</cusip>
    <value>710</value>
    <shrsOrPrnAmt>
      <sshPrnamt>27830</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>27830</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMPSON MANUFACTURING CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829073105</cusip>
    <value>105557</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1315681</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1303969</Sole>
      <Shared>0</Shared>
      <None>11712</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMULATIONS PLUS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829214105</cusip>
    <value>388</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13330</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SITEONE LANDSCAPE SUPPLY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82982L103</cusip>
    <value>91821</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1012922</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>998737</Sole>
      <Shared>0</Shared>
      <None>14185</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMITH A O CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>831865209</cusip>
    <value>3378</value>
    <shrsOrPrnAmt>
      <sshPrnamt>70910</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>57560</Sole>
      <Shared>0</Shared>
      <None>13350</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMUCKER J M CO</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>832696405</cusip>
    <value>439</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4215</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3365</Sole>
      <Shared>0</Shared>
      <None>850</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPS COMMERCE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78463M107</cusip>
    <value>72211</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1302973</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1290023</Sole>
      <Shared>0</Shared>
      <None>12950</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TELEFLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>879369106</cusip>
    <value>5264</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13984</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11484</Sole>
      <Shared>0</Shared>
      <None>2500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRACTOR SUPPLY CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>892356106</cusip>
    <value>626</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6695</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5745</Sole>
      <Shared>0</Shared>
      <None>950</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRANSUNION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89400J107</cusip>
    <value>249</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2910</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2910</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TREX CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89531P105</cusip>
    <value>108577</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1208020</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1191680</Sole>
      <Shared>0</Shared>
      <None>16340</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRIMBLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>896239100</cusip>
    <value>543</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13029</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13029</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TWIST BIOSCIENCE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90184D100</cusip>
    <value>519</value>
    <shrsOrPrnAmt>
      <sshPrnamt>24725</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>24725</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TYLER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>902252105</cusip>
    <value>91236</value>
    <shrsOrPrnAmt>
      <sshPrnamt>304100</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>299780</Sole>
      <Shared>0</Shared>
      <None>4320</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>U S PHYSICAL THERAPY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90337L108</cusip>
    <value>684</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5980</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5980</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNIFI INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>904677200</cusip>
    <value>610</value>
    <shrsOrPrnAmt>
      <sshPrnamt>24140</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>22740</Sole>
      <Shared>0</Shared>
      <None>1400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNION PACIFIC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>907818108</cusip>
    <value>964</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5332</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5332</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VAIL RESORTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>91879Q109</cusip>
    <value>5491</value>
    <shrsOrPrnAmt>
      <sshPrnamt>22897</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18532</Sole>
      <Shared>0</Shared>
      <None>4365</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VEEVA SYS INC</nameOfIssuer>
    <titleOfClass>CL A COM</titleOfClass>
    <cusip>922475108</cusip>
    <value>345</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2450</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2450</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERICEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92346J108</cusip>
    <value>761</value>
    <shrsOrPrnAmt>
      <sshPrnamt>43750</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>43750</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERISK ANALYTICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92345Y106</cusip>
    <value>1003</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6717</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6277</Sole>
      <Shared>0</Shared>
      <None>440</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERIZON COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92343V104</cusip>
    <value>232</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3773</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3773</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VOCERA COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92857F107</cusip>
    <value>62446</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3007989</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3004964</Sole>
      <Shared>0</Shared>
      <None>3025</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>W P CAREY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92936U109</cusip>
    <value>388</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4850</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3850</Sole>
      <Shared>0</Shared>
      <None>1000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WASTE CONNECTIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>94106B101</cusip>
    <value>308</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3390</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2990</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WATSCO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>942622200</cusip>
    <value>4774</value>
    <shrsOrPrnAmt>
      <sshPrnamt>26502</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>21102</Sole>
      <Shared>0</Shared>
      <None>5400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WD-40 CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929236107</cusip>
    <value>50412</value>
    <shrsOrPrnAmt>
      <sshPrnamt>259668</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>259125</Sole>
      <Shared>0</Shared>
      <None>543</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WEST PHARMACEUTICAL SVSC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>955306105</cusip>
    <value>5951</value>
    <shrsOrPrnAmt>
      <sshPrnamt>39587</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>32617</Sole>
      <Shared>0</Shared>
      <None>6970</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WILLDAN GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>96924N100</cusip>
    <value>811</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25505</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>25505</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>XYLEM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>98419M100</cusip>
    <value>474</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6015</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4725</Sole>
      <Shared>0</Shared>
      <None>1290</None>
    </votingAuthority>
  </infoTable>
</informationTable>
