<?xml version="1.0" encoding="utf-8"?>
<ns1:informationTable xmlns:ns1="http://www.sec.gov/edgar/document/thirteenf/informationtable">
  <ns1:infoTable>
    <ns1:nameOfIssuer>AAON INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM PAR $0.004</ns1:titleOfClass>
    <ns1:cusip>000360206</ns1:cusip>
    <ns1:value>139217</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2542306</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2538189</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4117</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ADOBE SYSTEMS INCORPORATED</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>00724F101</ns1:cusip>
    <ns1:value>439</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1200</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1080</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>120</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ALIGN TECHNOLOGY INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>016255101</ns1:cusip>
    <ns1:value>399</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1686</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1626</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>60</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ALPHA TEKNOVA INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>02080L102</ns1:cusip>
    <ns1:value>890</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>105949</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>105949</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ALPHABET INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>CAP STK CL A</ns1:titleOfClass>
    <ns1:cusip>02079K305</ns1:cusip>
    <ns1:value>425</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>195</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>145</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>50</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ALPHABET INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>CAP STK CL C</ns1:titleOfClass>
    <ns1:cusip>02079K107</ns1:cusip>
    <ns1:value>427</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>195</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>145</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>50</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ALTAIR ENGR INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM CL A</ns1:titleOfClass>
    <ns1:cusip>021369103</ns1:cusip>
    <ns1:value>123189</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2346454</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2325189</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>21265</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>AMGEN INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>031162100</ns1:cusip>
    <ns1:value>324</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1330</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1330</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ANSYS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>03662Q105</ns1:cusip>
    <ns1:value>1291</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5395</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>4945</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>450</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>APPLE INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>037833100</ns1:cusip>
    <ns1:value>1135</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>8300</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>5960</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>2340</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>APTARGROUP INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>038336103</ns1:cusip>
    <ns1:value>14117</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>136780</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>125435</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>11345</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>AVALARA INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>05338G106</ns1:cusip>
    <ns1:value>10028</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>142037</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>130677</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>11360</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>AXON ENTERPRISE INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>05464C101</ns1:cusip>
    <ns1:value>91716</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>984396</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>970356</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>14040</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>AZENTA INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>114340102</ns1:cusip>
    <ns1:value>105977</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1469865</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1467473</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>2392</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BALCHEM CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>057665200</ns1:cusip>
    <ns1:value>130694</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1007353</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>998314</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>9039</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BALL CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>058498106</ns1:cusip>
    <ns1:value>558</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>8107</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>6857</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1250</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BERKSHIRE HATHAWAY INC DEL</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL B NEW</ns1:titleOfClass>
    <ns1:cusip>084670702</ns1:cusip>
    <ns1:value>304</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1115</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1115</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BIOLIFE SOLUTIONS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM NEW</ns1:titleOfClass>
    <ns1:cusip>09062W204</ns1:cusip>
    <ns1:value>1126</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>81547</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>81547</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BIO-TECHNE CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>09073M104</ns1:cusip>
    <ns1:value>22330</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>64419</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>59494</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4925</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BLACKLINE INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>09239B109</ns1:cusip>
    <ns1:value>93795</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1408331</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1405781</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>2550</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>BRIGHT HORIZONS FAM SOL IN D</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>109194100</ns1:cusip>
    <ns1:value>15608</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>184671</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>170216</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>14455</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>CAREDX INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>14167L103</ns1:cusip>
    <ns1:value>20400</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>949698</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>931163</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>18535</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>CASELLA WASTE SYS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL A</ns1:titleOfClass>
    <ns1:cusip>147448104</ns1:cusip>
    <ns1:value>220708</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3036706</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2993541</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>43165</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>CLEARWATER ANALYTICS HLDGS I</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL A</ns1:titleOfClass>
    <ns1:cusip>185123106</ns1:cusip>
    <ns1:value>19022</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1579915</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1558235</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>21680</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>CODEXIS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>192005106</ns1:cusip>
    <ns1:value>742</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>70911</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>70911</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>COGNEX CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>192422103</ns1:cusip>
    <ns1:value>11006</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>258852</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>238077</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>20775</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>COMPUTER SVCS INC COM</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>20539A105</ns1:cusip>
    <ns1:value>42284</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1143962</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1142107</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1855</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>CONSTRUCTION PARTNERS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM CL A</ns1:titleOfClass>
    <ns1:cusip>21044C107</ns1:cusip>
    <ns1:value>111564</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5327797</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>5267504</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>60293</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>COPART INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>217204106</ns1:cusip>
    <ns1:value>906</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>8341</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>7991</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>350</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>COSTAR GROUP INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>22160N109</ns1:cusip>
    <ns1:value>986</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>16315</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>16315</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>COSTCO WHSL CORP NEW</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>22160K105</ns1:cusip>
    <ns1:value>1141</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2380</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1905</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>475</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>CRYOPORT INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM PAR $0.001</ns1:titleOfClass>
    <ns1:cusip>229050307</ns1:cusip>
    <ns1:value>1307</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>42202</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>42202</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>DANAHER CORPORATION</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>235851102</ns1:cusip>
    <ns1:value>346</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1365</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1125</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>240</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>DEFINITIVE HEALTHCARE CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>CLASS A COM</ns1:titleOfClass>
    <ns1:cusip>24477E103</ns1:cusip>
    <ns1:value>81146</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3538855</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3482920</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>55935</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>DESCARTES SYS GROUP INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>249906108</ns1:cusip>
    <ns1:value>190096</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3063101</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3027841</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>35260</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>DIGI INTL INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>253798102</ns1:cusip>
    <ns1:value>1857</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>76675</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>76675</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>DOLBY LABORATORIES INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM CL A</ns1:titleOfClass>
    <ns1:cusip>25659T107</ns1:cusip>
    <ns1:value>393</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5490</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3760</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1730</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>DOUGLAS DYNAMICS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>25960R105</ns1:cusip>
    <ns1:value>83991</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2922457</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2882732</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>39725</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ESCO TECHNOLOGIES INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>296315104</ns1:cusip>
    <ns1:value>67101</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>981444</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>979657</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1787</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ESSENTIAL UTILS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>29670G102</ns1:cusip>
    <ns1:value>286</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>6237</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>5537</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>700</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>EVI INDS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>26929N102</ns1:cusip>
    <ns1:value>7763</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>777119</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>748194</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>28925</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>EVOQUA WATER TECHNOLOGIES CO</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>30057T105</ns1:cusip>
    <ns1:value>42578</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1309679</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1307544</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>2135</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>EXPONENT INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>30214U102</ns1:cusip>
    <ns1:value>218401</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2387674</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2357503</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>30171</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>EXXON MOBIL CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>30231G102</ns1:cusip>
    <ns1:value>649</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>7579</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>7429</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>150</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FACTSET RESH SYS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>303075105</ns1:cusip>
    <ns1:value>706</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1836</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1836</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FAIR ISAAC CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>303250104</ns1:cusip>
    <ns1:value>24891</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>62089</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>57089</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>5000</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FASTENAL CO</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>311900104</ns1:cusip>
    <ns1:value>1012</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>20275</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>16975</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>3300</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FIRSTSERVICE CORP NEW</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>33767E202</ns1:cusip>
    <ns1:value>157900</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1302806</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1283576</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>19230</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FIVE9 INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>338307101</ns1:cusip>
    <ns1:value>11694</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>128306</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>117621</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>10685</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FORTINET INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>34959E109</ns1:cusip>
    <ns1:value>967</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>17096</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>17096</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>FOX FACTORY HLDG CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>35138V102</ns1:cusip>
    <ns1:value>133983</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1663556</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1660681</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>2875</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>GARMIN LTD</ns1:nameOfIssuer>
    <ns1:titleOfClass>SHS</ns1:titleOfClass>
    <ns1:cusip>H2906T109</ns1:cusip>
    <ns1:value>380</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3870</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3870</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>GARTNER INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>366651107</ns1:cusip>
    <ns1:value>13784</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>57000</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>52560</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4440</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>GENERAC HLDGS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>368736104</ns1:cusip>
    <ns1:value>9103</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>43228</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>39798</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>3430</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>GRACO INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>384109104</ns1:cusip>
    <ns1:value>18336</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>308628</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>283703</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>24925</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>GUIDEWIRE SOFTWARE INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>40171V100</ns1:cusip>
    <ns1:value>12927</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>182092</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>167157</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>14935</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>HEALTH CATALYST INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>42225T107</ns1:cusip>
    <ns1:value>1135</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>78308</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>78308</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>HEICO CORP NEW</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL A</ns1:titleOfClass>
    <ns1:cusip>422806208</ns1:cusip>
    <ns1:value>18601</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>176515</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>162750</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>13765</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>HELIOS TECHNOLOGIES INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>42328H109</ns1:cusip>
    <ns1:value>109348</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1650540</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1647779</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>2761</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>HENRY JACK &amp; ASSOC INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>426281101</ns1:cusip>
    <ns1:value>26156</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>145295</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>133760</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>11535</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>HILLMAN SOLUTIONS CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>431636109</ns1:cusip>
    <ns1:value>69644</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>8060597</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>7969367</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>91230</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>HOME DEPOT INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>437076102</ns1:cusip>
    <ns1:value>333</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1215</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1215</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>I3 VERTICALS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM CL A</ns1:titleOfClass>
    <ns1:cusip>46571Y107</ns1:cusip>
    <ns1:value>1671</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>66802</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>66802</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>IDEXX LABS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>45168D104</ns1:cusip>
    <ns1:value>561</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1600</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1600</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ILLINOIS TOOL WKS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>452308109</ns1:cusip>
    <ns1:value>264</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1450</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1180</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>270</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>INTUIT</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>461202103</ns1:cusip>
    <ns1:value>540</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1400</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1365</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>35</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>INVESCO EXCH TRADED FD TR II</ns1:nameOfIssuer>
    <ns1:titleOfClass>PFD ETF</ns1:titleOfClass>
    <ns1:cusip>46138E511</ns1:cusip>
    <ns1:value>140</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>11350</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>11350</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>JOHN BEAN TECHNOLOGIES CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>477839104</ns1:cusip>
    <ns1:value>103315</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>935657</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>924859</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>10798</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>JOHNSON &amp; JOHNSON</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>478160104</ns1:cusip>
    <ns1:value>645</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3635</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2865</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>770</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>JPMORGAN CHASE &amp; CO</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>46625H100</ns1:cusip>
    <ns1:value>233</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2066</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1666</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>400</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>LCI INDS</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>50189K103</ns1:cusip>
    <ns1:value>11387</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>101776</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>92996</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>8780</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>LEMAITRE VASCULAR INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>525558201</ns1:cusip>
    <ns1:value>84531</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1855786</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1852279</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>3507</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>LIGHTSPEED COMMERCE INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>SUB VTG SHS</ns1:titleOfClass>
    <ns1:cusip>53229C107</ns1:cusip>
    <ns1:value>5859</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>262750</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>242090</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>20660</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>LINDE PLC</ns1:nameOfIssuer>
    <ns1:titleOfClass>SHS</ns1:titleOfClass>
    <ns1:cusip>G5494J103</ns1:cusip>
    <ns1:value>769</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2675</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2175</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>500</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MARKEL CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>570535104</ns1:cusip>
    <ns1:value>737</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>570</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>420</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>150</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MASTERCARD INCORPORATED</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL A</ns1:titleOfClass>
    <ns1:cusip>57636Q104</ns1:cusip>
    <ns1:value>383</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1215</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1125</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>90</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MERCK &amp; CO INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>58933Y105</ns1:cusip>
    <ns1:value>228</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2500</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2500</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MERCURY SYS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>589378108</ns1:cusip>
    <ns1:value>172129</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2675714</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2643064</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>32650</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MERIT MED SYS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>589889104</ns1:cusip>
    <ns1:value>113193</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2085747</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2055665</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>30082</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MESA LABS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>59064R109</ns1:cusip>
    <ns1:value>105709</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>518336</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>517982</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>354</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MICROSOFT CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>594918104</ns1:cusip>
    <ns1:value>994</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3869</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3629</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>240</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MODEL N INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>607525102</ns1:cusip>
    <ns1:value>127500</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>4984368</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>4980988</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>3380</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>MONTROSE ENVIRONMENTAL GROUP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>615111101</ns1:cusip>
    <ns1:value>1115</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>33035</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>33035</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>NANOSTRING TECHNOLOGIES INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>63009R109</ns1:cusip>
    <ns1:value>521</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>40987</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>40987</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>NATIONAL RESH CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM NEW</ns1:titleOfClass>
    <ns1:cusip>637372202</ns1:cusip>
    <ns1:value>27988</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>731135</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>729804</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1331</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>NEOGEN CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>640491106</ns1:cusip>
    <ns1:value>107342</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>4455883</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>4413660</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>42223</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>NIKE INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL B</ns1:titleOfClass>
    <ns1:cusip>654106103</ns1:cusip>
    <ns1:value>341</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3340</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2530</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>810</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>NOVANTA INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>67000B104</ns1:cusip>
    <ns1:value>172993</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1426507</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1410472</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>16035</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>NV5 GLOBAL INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>62945V109</ns1:cusip>
    <ns1:value>1727</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>14792</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>14792</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>OMEGA FLEX INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>682095104</ns1:cusip>
    <ns1:value>59456</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>552467</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>551469</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>998</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>OMNICELL COM</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>68213N109</ns1:cusip>
    <ns1:value>191080</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1679828</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1655888</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>23940</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ORTHOPEDIATRICS CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>68752L100</ns1:cusip>
    <ns1:value>1389</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>32183</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>32183</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>PALOMAR HLDGS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>69753M105</ns1:cusip>
    <ns1:value>1576</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>24477</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>24477</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>PAYCOR HCM INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>70435P102</ns1:cusip>
    <ns1:value>105041</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>4040032</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>4033462</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>6570</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>PEPSICO INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>713448108</ns1:cusip>
    <ns1:value>242</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1450</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1050</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>400</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>POOL CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>73278L105</ns1:cusip>
    <ns1:value>26296</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>74869</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>68954</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>5915</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>PROS HOLDINGS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>74346Y103</ns1:cusip>
    <ns1:value>85773</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3270028</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3264253</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>5775</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>PUBLIC STORAGE</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>74460D109</ns1:cusip>
    <ns1:value>209</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>670</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>670</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>Q2 HLDGS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>74736L109</ns1:cusip>
    <ns1:value>88975</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2306854</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2277094</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>29760</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>QUALTRICS INTL INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM CL A</ns1:titleOfClass>
    <ns1:cusip>747601201</ns1:cusip>
    <ns1:value>221</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>17631</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>17631</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>RBC BEARINGS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>75524B104</ns1:cusip>
    <ns1:value>147161</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>795678</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>785738</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>9940</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>REPLIGEN CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>759916109</ns1:cusip>
    <ns1:value>124609</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>767299</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>754369</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>12930</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ROGERS CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>775133101</ns1:cusip>
    <ns1:value>320</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1220</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1220</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ROLLINS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>775711104</ns1:cusip>
    <ns1:value>28118</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>805222</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>744435</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>60787</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>ROPER TECHNOLOGIES INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>776696106</ns1:cusip>
    <ns1:value>781</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1980</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1750</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>230</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>S&amp;P GLOBAL INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>78409V104</ns1:cusip>
    <ns1:value>951</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2822</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2469</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>353</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SEMLER SCIENTIFIC INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>81684M104</ns1:cusip>
    <ns1:value>715</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>25379</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>25379</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SHOTSPOTTER INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>82536T107</ns1:cusip>
    <ns1:value>1285</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>47735</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>47735</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SHUTTERSTOCK INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>825690100</ns1:cusip>
    <ns1:value>61784</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1078061</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1076300</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1761</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SIMPSON MFG INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>829073105</ns1:cusip>
    <ns1:value>138002</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1371655</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1359048</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>12607</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SIMULATIONS PLUS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>829214105</ns1:cusip>
    <ns1:value>109154</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2212733</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2211305</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>1428</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SITEONE LANDSCAPE SUPPLY INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>82982L103</ns1:cusip>
    <ns1:value>124961</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1051243</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1040298</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>10945</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SMUCKER J M CO</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM NEW</ns1:titleOfClass>
    <ns1:cusip>832696405</ns1:cusip>
    <ns1:value>467</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3645</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3005</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>640</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>SPS COMM INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>78463M107</ns1:cusip>
    <ns1:value>205695</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1819506</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1802536</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>16970</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>STERIS PLC</ns1:nameOfIssuer>
    <ns1:titleOfClass>SHS USD</ns1:titleOfClass>
    <ns1:cusip>G8473T100</ns1:cusip>
    <ns1:value>527</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2555</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2555</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>STEVANATO GROUP S P A</ns1:nameOfIssuer>
    <ns1:titleOfClass>ORD SHS</ns1:titleOfClass>
    <ns1:cusip>T9224W109</ns1:cusip>
    <ns1:value>28192</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1783160</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1758680</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>24480</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TECSYS INC COM</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>878950104</ns1:cusip>
    <ns1:value>1317</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>50740</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>50740</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TELEFLEX INCORPORATED</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>879369106</ns1:cusip>
    <ns1:value>14490</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>58938</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>54388</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4550</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>THUNDERBIRD ENTERTAINMENT GROU</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>88605U107</ns1:cusip>
    <ns1:value>1666</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>588950</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>588950</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TRACTOR SUPPLY CO</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>892356106</ns1:cusip>
    <ns1:value>978</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5048</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>4398</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>650</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TRANSCAT INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>893529107</ns1:cusip>
    <ns1:value>32542</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>572822</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>571932</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>890</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TRANSUNION</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>89400J107</ns1:cusip>
    <ns1:value>473</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5915</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>5265</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>650</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TREX CO INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>89531P105</ns1:cusip>
    <ns1:value>96943</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1781381</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1749121</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>32260</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>TYLER TECHNOLOGIES INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>902252105</ns1:cusip>
    <ns1:value>19076</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>57374</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>52939</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4435</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>U S PHYSICAL THERAPY</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>90337L108</ns1:cusip>
    <ns1:value>1761</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>16125</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>16125</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>USERTESTING INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>91734E101</ns1:cusip>
    <ns1:value>885</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>176360</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>176360</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>VAIL RESORTS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>91879Q109</ns1:cusip>
    <ns1:value>16608</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>76164</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>70189</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>5975</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>VEEVA SYS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL A COM</ns1:titleOfClass>
    <ns1:cusip>922475108</ns1:cusip>
    <ns1:value>709</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3580</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3580</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>VERICEL CORP</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>92346J108</ns1:cusip>
    <ns1:value>42920</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>1704516</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>1700346</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4170</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>VERISK ANALYTICS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>92345Y106</ns1:cusip>
    <ns1:value>1034</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5972</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>5972</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>VERTEX INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>CL A</ns1:titleOfClass>
    <ns1:cusip>92538J106</ns1:cusip>
    <ns1:value>37910</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>3345959</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>3340159</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>5800</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WASTE CONNECTIONS INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>94106B101</ns1:cusip>
    <ns1:value>854</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>6890</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>6440</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>450</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WATSCO INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>942622200</ns1:cusip>
    <ns1:value>17543</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>73457</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>67632</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>5825</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WD 40 CO</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>929236107</ns1:cusip>
    <ns1:value>61725</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>306541</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>305986</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>555</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WEST PHARMACEUTICAL SVSC INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>955306105</ns1:cusip>
    <ns1:value>17820</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>58933</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>54438</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>4495</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WILLDAN GROUP INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>96924N100</ns1:cusip>
    <ns1:value>1188</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>43063</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>43063</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WORKIVA INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM CL A</ns1:titleOfClass>
    <ns1:cusip>98139A105</ns1:cusip>
    <ns1:value>64620</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>979241</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>967701</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>11540</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>WP CAREY INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>92936U109</ns1:cusip>
    <ns1:value>236</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>2850</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>2850</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>0</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:nameOfIssuer>XYLEM INC</ns1:nameOfIssuer>
    <ns1:titleOfClass>COM</ns1:titleOfClass>
    <ns1:cusip>98419M100</ns1:cusip>
    <ns1:value>415</ns1:value>
    <ns1:shrsOrPrnAmt>
      <ns1:sshPrnamt>5305</ns1:sshPrnamt>
      <ns1:sshPrnamtType>SH</ns1:sshPrnamtType>
    </ns1:shrsOrPrnAmt>
    <ns1:investmentDiscretion>SOLE</ns1:investmentDiscretion>
    <ns1:votingAuthority>
      <ns1:Sole>4945</ns1:Sole>
      <ns1:Shared>0</ns1:Shared>
      <ns1:None>360</ns1:None>
    </ns1:votingAuthority>
  </ns1:infoTable>
</ns1:informationTable>
