diff --git a/coverage/coverage.out b/coverage/coverage.out index 626dc498..013414f3 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -1,1027 +1,4 @@ mode: set -github.com/echovault/echovault/pkg/modules/acl/commands.go:34.108,35.34 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:35.34,37.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:38.2,39.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:39.9,41.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:42.2,42.67 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:42.67,44.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:45.2,45.42 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:48.106,49.19 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:49.19,51.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:53.2,54.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:54.9,56.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:58.2,60.30 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:60.30,61.27 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:61.27,64.9 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:68.2,68.16 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:68.16,70.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:73.2,77.18 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:77.18,79.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:79.8,81.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:82.2,82.21 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:82.21,84.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:85.2,85.17 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:85.17,87.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:89.2,90.29 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:90.29,92.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:95.2,96.51 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:96.51,97.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:97.22,99.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:101.3,101.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:103.2,103.51 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:103.51,104.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:104.22,106.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:108.3,108.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:112.2,113.48 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:113.48,114.21 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:114.21,116.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:118.3,118.47 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:120.2,120.48 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:120.48,121.21 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:121.21,123.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:125.3,125.47 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:129.2,130.79 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:130.79,131.37 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:131.37,133.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:135.2,136.30 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:136.30,137.10 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:138.100,140.53 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:141.53,143.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:144.52,146.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:151.2,153.54 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:153.54,155.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:156.2,156.54 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:156.54,158.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:160.2,162.25 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:165.102,166.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:166.18,168.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:170.2,174.35 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:174.35,175.36 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:175.36,176.48 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:176.48,178.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:179.4,179.12 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:181.3,181.50 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:181.50,182.51 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:182.51,185.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:189.2,189.19 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:189.19,192.34 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:192.34,195.4 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:196.3,197.28 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:197.28,199.24 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:199.24,201.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:203.3,203.26 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:206.2,206.19 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:206.19,208.46 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:208.46,209.43 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:209.43,211.38 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:211.38,213.30 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:213.30,215.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:217.5,217.28 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:222.2,222.74 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:225.102,227.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:227.9,229.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:230.2,231.33 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:231.33,233.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:234.2,235.25 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:238.106,240.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:240.9,242.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:243.2,243.45 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:243.45,245.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:246.2,246.42 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:249.108,250.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:250.18,252.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:253.2,254.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:254.9,256.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:257.2,257.53 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:257.53,259.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:260.2,260.42 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:263.106,265.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:265.9,267.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:268.2,269.74 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:272.103,273.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:273.18,275.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:276.2,277.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:277.9,279.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:280.2,282.33 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:282.33,285.19 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:285.19,287.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:287.9,289.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:291.3,291.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:291.22,293.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:295.3,295.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:295.18,297.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:299.3,299.43 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:299.43,300.61 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:300.61,302.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:303.4,303.58 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:303.58,305.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:308.3,308.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:308.52,309.23 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:309.23,311.13 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:313.4,313.39 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:316.3,316.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:316.52,317.23 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:317.23,319.13 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:321.4,321.39 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:324.3,324.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:324.49,325.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:325.22,327.13 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:329.4,329.37 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:332.3,332.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:332.49,333.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:333.22,335.13 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:337.4,337.37 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:340.3,340.45 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:340.45,341.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:341.52,343.13 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:345.4,345.41 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:348.3,348.45 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:348.45,349.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:349.52,351.5 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:354.3,354.55 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:354.55,356.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:358.3,358.55 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:358.55,360.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:361.3,361.54 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:364.2,365.25 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:368.103,369.19 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:369.19,371.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:373.2,374.9 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:374.9,376.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:378.2,382.16 4 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:382.16,384.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:386.2,386.15 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:386.15,387.35 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:387.35,389.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:392.2,396.20 3 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:396.20,397.59 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:397.59,399.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:402.2,402.37 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:402.37,403.59 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:403.59,405.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:409.2,409.29 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:409.29,413.31 3 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:413.31,414.35 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:414.35,417.43 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:417.43,419.6 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:419.11,422.6 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:423.5,423.10 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:427.3,427.17 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:427.17,429.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:432.2,432.42 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:435.103,436.18 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:436.18,438.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:440.2,441.9 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:441.9,443.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:445.2,449.16 4 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:449.16,451.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:453.2,453.15 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:453.15,454.35 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:454.35,456.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:459.2,461.20 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:461.20,464.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:464.17,466.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:467.3,468.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:468.17,470.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:473.2,473.37 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:473.37,476.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:476.17,478.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:479.3,480.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:480.17,482.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:485.2,486.16 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:486.16,488.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:490.2,490.42 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:493.33,501.60 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:501.60,503.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:512.60,514.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:523.62,525.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:534.62,536.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:545.62,547.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:556.62,558.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:567.62,569.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:578.62,580.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:589.62,591.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:603.62,605.7 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:614.62,616.7 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:34.13,35.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:35.34,39.3 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:41.2,42.29 2 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:42.29,44.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:52.104,54.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:54.16,56.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:58.2,63.16 5 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:63.16,65.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:69.2,69.16 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:69.16,70.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:70.34,72.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:72.9,74.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:77.2,77.44 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:77.44,79.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:79.34,81.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:82.3,82.36 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:83.8,83.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:83.51,85.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:85.33,87.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:88.3,88.45 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:89.8,91.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:91.34,94.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:94.9,97.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:99.2,99.16 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:99.16,101.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:102.2,104.76 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:104.76,106.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:109.2,109.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:109.28,111.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:113.2,113.17 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:116.105,117.44 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:117.44,119.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:121.2,124.15 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:124.15,125.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:125.29,126.16 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:126.16,132.5 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:137.2,137.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:137.30,138.15 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:138.15,143.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:148.2,148.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:148.28,149.31 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:149.31,150.52 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:150.52,152.5 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:153.4,154.12 2 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:156.3,156.60 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:156.60,158.4 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:159.3,159.55 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:163.2,163.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:163.28,164.58 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:164.58,166.4 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:169.2,169.42 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:172.104,174.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:174.16,176.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:177.2,179.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:179.33,181.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:183.2,184.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:184.16,186.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:187.2,191.51 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:194.105,196.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:196.16,198.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:200.2,203.27 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:203.27,204.31 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:204.31,206.12 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:208.3,208.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:208.33,210.18 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:210.18,212.5 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:213.4,214.12 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:216.3,216.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:218.2,218.15 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:218.15,219.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:219.34,220.14 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:220.14,223.5 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:227.2,227.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:227.28,229.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:231.2,233.30 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:233.30,234.24 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:234.24,236.12 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:238.3,238.96 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:241.2,241.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:244.104,246.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:246.16,248.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:249.2,250.27 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:250.27,252.17 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:252.17,254.12 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:256.3,256.13 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:258.2,258.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:261.108,263.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:263.16,265.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:267.2,269.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:269.33,271.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:273.2,273.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:273.51,275.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:276.2,279.31 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:279.31,281.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:283.2,285.30 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:288.111,290.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:290.16,292.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:294.2,296.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:296.33,298.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:300.2,300.52 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:300.52,302.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:303.2,307.31 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:307.31,309.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:311.2,312.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:312.46,314.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:316.2,316.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:319.104,321.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:321.16,323.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:325.2,327.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:327.33,329.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:331.2,331.52 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:331.52,333.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:334.2,338.31 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:338.31,340.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:342.2,343.39 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:343.39,345.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:347.2,347.12 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:347.12,349.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:351.2,351.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:354.107,356.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:356.16,358.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:360.2,364.16 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:364.16,366.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:367.2,368.42 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:368.42,370.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:372.2,372.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:372.33,374.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:376.2,376.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:376.51,378.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:379.2,381.19 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:381.19,384.3 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:386.2,388.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:389.12,390.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:390.39,392.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:393.3,393.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:394.12,395.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:395.39,397.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:398.3,398.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:399.12,400.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:400.39,402.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:403.3,403.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:403.39,405.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:406.3,406.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:407.12,408.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:408.39,409.40 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:409.40,411.5 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:412.4,412.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:414.3,414.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:415.10,416.71 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:419.2,419.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:422.109,424.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:424.16,426.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:428.2,432.16 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:432.16,434.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:435.2,436.44 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:436.44,438.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:440.2,440.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:440.33,442.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:444.2,444.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:444.51,446.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:447.2,449.19 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:449.19,452.3 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:454.2,456.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:457.12,458.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:458.39,460.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:461.3,461.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:462.12,463.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:463.39,465.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:466.3,466.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:467.12,468.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:468.39,470.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:471.3,471.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:471.39,473.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:474.3,474.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:475.12,476.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:476.39,477.40 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:477.40,479.5 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:480.4,480.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:482.3,482.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:483.10,484.71 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:487.2,487.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:490.33,659.2 1 0 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0 -github.com/echovault/echovault/pkg/modules/generic/utils.go:31.77,32.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:32.19,34.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:35.2,35.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:36.13,38.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:40.12,41.26 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:41.26,43.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:44.3,45.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:47.12,48.26 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:48.26,50.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:51.3,52.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:54.12,55.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:55.19,57.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:58.3,58.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:58.29,60.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:61.3,63.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:63.17,65.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:66.3,67.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:69.12,70.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:70.19,72.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:73.3,73.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:73.29,75.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:76.3,78.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:78.17,80.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:81.3,82.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:84.14,85.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:85.19,87.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:88.3,88.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:88.29,90.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:91.3,93.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:93.17,95.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:96.3,97.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:99.14,100.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:100.19,102.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:103.3,103.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:103.29,105.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:29.115,35.29 4 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:35.29,36.54 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:36.54,42.42 4 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:42.42,44.5 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:46.4,49.12 3 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:52.3,52.36 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:52.36,59.43 5 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:59.43,61.5 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:63.4,65.21 2 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:69.2,71.25 2 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:74.109,78.35 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:78.35,79.65 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:79.65,80.41 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:80.41,82.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:83.4,83.12 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:85.3,85.13 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:88.2,88.51 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:91.110,92.18 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:93.9,98.36 4 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:98.36,99.66 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:99.66,100.52 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:100.52,104.6 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:105.5,105.13 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:107.4,108.14 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:110.3,111.26 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:113.9,117.45 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:117.45,119.4 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:120.3,120.42 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:120.42,124.37 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:124.37,125.67 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:125.67,126.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:126.53,127.59 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:127.59,131.8 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:133.6,133.14 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:135.5,135.54 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:135.54,138.6 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:140.9,140.50 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:140.50,144.37 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:144.37,145.67 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:145.67,146.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:146.53,148.24 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:148.24,151.8 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:153.6,153.14 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:155.5,155.33 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:155.33,158.6 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:160.9,160.49 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:160.49,164.37 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:164.37,165.67 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:165.67,166.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:166.53,167.55 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:167.55,171.8 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:173.6,173.14 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:175.5,175.50 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:175.50,178.6 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:180.9,182.4 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:183.3,184.26 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:185.10,186.54 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:190.103,192.2 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:194.33,202.60 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:202.60,202.86 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:211.60,213.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:221.62,221.88 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:230.62,230.88 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:240.62,240.88 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:251.60,253.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:254.113,255.49 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:255.49,257.6 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:258.5,258.45 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:267.60,269.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:270.113,272.18 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:272.18,274.6 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:275.5,275.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:284.60,286.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:287.113,288.47 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:288.47,290.6 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:291.5,291.45 1 0 -github.com/echovault/echovault/pkg/modules/connection/commands.go:26.108,27.18 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:28.10,29.54 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:30.9,31.34 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:32.9,33.72 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:37.33,45.60 1 0 -github.com/echovault/echovault/pkg/modules/connection/commands.go:45.60,47.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:30.105,32.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:32.16,34.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:36.2,38.33 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:38.33,41.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:43.2,43.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:43.52,45.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:46.2,48.63 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:48.63,50.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:52.2,52.57 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:55.110,57.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:57.16,59.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:61.2,64.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:64.9,66.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:68.2,68.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:68.33,70.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:72.2,72.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:72.52,74.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:75.2,78.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:78.9,80.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:82.2,82.40 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:82.40,84.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:86.2,86.57 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:89.110,91.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:91.16,93.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:95.2,99.24 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:99.24,101.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:103.2,103.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:103.33,105.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:107.2,107.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:107.52,109.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:110.2,113.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:113.9,115.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:118.2,118.40 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:118.40,120.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:123.2,123.51 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:123.51,125.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:127.2,130.15 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:130.15,132.43 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:132.43,135.4 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:136.3,136.20 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:140.2,140.18 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:140.18,142.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:147.2,151.17 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:151.17,153.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:155.2,155.13 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:155.13,158.18 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:158.18,160.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:160.9,162.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:165.2,165.19 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:168.108,170.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:170.16,172.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:174.2,177.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:177.9,179.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:181.2,181.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:181.33,183.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:185.2,185.51 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:185.51,187.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:188.2,191.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:191.9,193.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:195.2,195.40 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:195.40,197.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:199.2,200.55 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:200.55,202.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:204.2,204.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:207.109,209.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:209.16,211.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:213.2,217.24 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:217.24,219.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:221.2,221.30 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:221.30,223.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:225.2,225.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:225.33,227.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:229.2,229.51 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:229.51,231.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:232.2,235.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:235.9,237.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:239.2,239.40 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:239.40,241.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:243.2,243.34 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:243.34,244.64 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:244.64,246.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:247.3,247.43 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:250.2,250.66 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:250.66,252.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:253.2,253.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:256.108,258.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:258.16,260.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:262.2,266.9 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:266.9,268.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:270.2,272.33 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:272.33,274.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:276.2,276.51 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:276.51,278.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:279.2,282.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:282.9,284.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:286.2,286.9 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:287.10,287.10 0 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:289.17,291.34 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:291.34,292.26 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:292.26,293.10 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:295.4,295.43 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:295.43,298.5 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:300.17,302.39 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:302.39,303.26 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:303.26,304.10 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:306.4,306.43 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:306.43,309.5 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:313.2,313.61 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:313.61,315.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:317.2,317.55 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:317.55,319.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:321.2,321.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:324.109,326.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:326.16,328.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:330.2,335.116 5 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:335.116,337.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:339.2,339.75 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:339.75,341.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:343.2,343.54 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:343.54,345.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:346.2,349.16 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:349.16,351.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:352.2,357.33 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:357.33,359.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:361.2,361.19 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:362.14,364.24 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:364.24,366.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:366.9,366.32 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:366.32,368.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:369.15,371.24 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:371.24,373.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:373.9,373.32 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:373.32,375.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:378.2,378.16 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:378.16,380.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:382.2,382.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:385.106,387.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:387.16,389.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:391.2,393.31 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:393.31,395.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:397.2,399.33 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:399.33,400.34 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:401.17,402.61 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:403.11,404.62 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:404.62,406.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:407.4,407.68 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:407.68,409.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:411.8,412.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:412.52,414.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:416.2,421.9 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:421.9,423.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:425.2,425.73 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:425.73,427.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:428.2,428.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:431.109,433.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:433.16,435.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:437.2,441.31 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:441.31,443.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:445.2,445.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:445.33,446.34 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:447.17,448.61 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:449.11,450.62 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:450.62,452.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:453.4,454.68 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:454.68,456.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:458.8,459.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:459.52,461.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:462.3,462.35 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:465.2,469.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:469.9,471.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:473.2,473.73 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:473.73,475.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:476.2,476.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:479.104,481.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:481.16,483.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:485.2,487.33 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:487.33,489.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:491.2,491.51 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:491.51,493.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:494.2,497.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:497.9,499.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:501.2,501.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:502.10,503.60 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:503.60,505.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:506.3,506.54 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:507.14,508.70 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:508.70,510.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:511.3,511.64 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:515.33,635.2 1 0 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:22.51,23.18 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:23.18,25.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:26.2,26.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:29.49,30.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:30.19,32.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:33.2,33.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:36.50,37.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:37.19,39.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:40.2,40.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:43.52,44.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:44.19,46.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:47.2,47.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:50.52,51.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:51.19,53.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:54.2,54.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:57.50,58.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:58.19,60.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:61.2,61.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:64.51,65.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:65.19,67.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:68.2,68.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:71.50,72.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:72.19,74.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:75.2,75.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:78.51,79.18 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:79.18,81.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,82.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:31.105,33.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:33.16,35.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:37.2,40.25 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:40.25,42.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:44.2,44.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:44.38,46.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:48.2,48.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:48.33,50.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:50.17,52.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:53.3,54.59 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:54.59,56.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:57.3,57.59 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:60.2,60.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:60.51,62.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:63.2,66.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:66.9,68.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:70.2,71.36 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:71.36,72.42 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:72.42,73.26 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:73.26,76.5 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:77.4,77.12 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:79.3,80.13 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:82.2,82.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:82.55,84.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:86.2,86.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:89.105,91.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:91.16,93.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:95.2,98.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:98.33,100.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:102.2,102.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:102.52,104.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:105.2,108.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:108.9,110.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:112.2,115.31 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:115.31,117.19 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:117.19,119.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:121.3,121.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:121.34,123.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:125.3,125.31 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:125.31,127.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:129.3,129.35 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:129.35,132.12 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:134.3,134.32 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:137.2,137.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:140.108,142.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:142.16,144.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:146.2,149.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:149.33,151.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:153.2,153.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:153.52,155.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:156.2,159.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:159.9,161.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:163.2,166.31 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:166.31,168.19 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:168.19,170.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:172.3,172.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:172.34,174.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:176.3,176.35 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:176.35,179.12 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:181.3,181.31 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:181.31,183.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:185.3,185.18 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:188.2,188.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:191.106,193.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:193.16,195.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:197.2,199.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:199.33,201.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:203.2,203.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:203.52,205.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:206.2,209.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:209.9,211.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:213.2,214.27 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:214.27,215.32 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:215.32,217.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:219.3,219.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:219.33,222.12 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:224.3,224.29 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:224.29,226.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:229.2,229.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:232.111,234.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:234.16,236.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:238.2,241.19 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:241.19,243.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:243.17,245.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:246.3,246.13 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:246.13,248.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:249.3,249.12 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:252.2,253.19 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:253.19,254.46 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:254.46,256.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:256.9,258.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:261.2,261.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:261.33,263.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:265.2,265.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:265.52,267.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:268.2,271.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:271.9,273.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:276.2,276.24 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:276.24,278.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:278.17,280.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:281.3,281.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:281.34,283.18 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:283.18,284.36 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:284.36,286.14 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:288.5,288.37 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:288.37,291.14 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:293.5,293.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:293.33,295.14 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:299.3,299.26 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:303.2,304.29 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:304.29,306.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:309.2,311.46 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:311.46,315.16 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:315.16,316.59 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:316.59,318.5 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:322.2,323.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:323.16,325.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:326.2,326.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:326.38,328.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:328.17,329.41 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:329.41,331.13 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:333.4,333.42 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:333.42,336.13 3 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:338.4,338.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:338.38,340.13 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:345.2,345.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:348.105,350.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:350.16,352.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:354.2,356.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:356.33,358.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:360.2,360.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:360.52,362.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:363.2,366.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:366.9,368.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:370.2,370.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:373.106,375.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:375.16,377.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:379.2,381.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:381.33,383.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:385.2,385.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:385.52,387.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:388.2,391.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:391.9,393.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:395.2,396.29 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:396.29,398.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:400.2,400.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:403.108,405.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:405.16,407.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:409.2,415.47 5 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:415.47,417.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:417.17,419.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:420.3,420.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:421.8,423.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:423.17,425.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:426.3,426.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:429.2,429.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:429.33,430.62 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:430.62,432.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:433.3,435.48 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:435.48,437.57 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:437.57,439.5 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:440.4,440.96 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:441.9,443.57 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:443.57,445.5 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:446.4,446.60 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:450.2,450.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:450.52,452.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:453.2,456.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:456.9,458.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:460.2,460.24 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:460.24,462.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:464.2,464.28 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:465.10,466.69 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:467.11,469.48 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:469.48,471.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:471.9,473.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:474.15,476.48 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:476.48,478.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:478.9,480.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:483.2,483.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:483.55,485.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:487.2,487.40 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:487.40,489.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:491.2,492.47 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:495.108,497.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:497.16,499.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:501.2,503.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:503.33,505.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:507.2,507.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:507.52,509.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:510.2,513.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:513.9,515.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:517.2,518.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:518.33,520.34 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:520.34,522.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:523.3,523.35 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:523.35,526.4 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:527.3,527.31 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:527.31,529.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:532.2,532.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:535.108,537.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:537.16,539.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:541.2,544.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:544.33,546.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:548.2,548.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:548.52,550.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:551.2,554.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:554.9,556.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:558.2,558.24 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:558.24,560.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:562.2,562.30 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:565.105,567.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:567.16,569.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:571.2,574.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:574.33,576.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:578.2,578.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:578.51,580.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:581.2,584.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:584.9,586.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:588.2,590.31 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:590.31,591.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:591.25,594.4 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:597.2,597.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:597.55,599.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:601.2,601.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:604.33,725.2 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:22.50,23.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:23.18,25.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:26.2,26.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:29.52,30.18 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:30.18,32.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:33.2,33.22 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:36.50,37.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:37.18,39.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:40.2,40.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:43.53,44.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:44.18,46.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:47.2,47.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:50.51,51.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:51.19,53.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:54.2,54.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:57.56,58.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:58.34,60.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.2,61.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.19,63.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:64.2,64.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:67.50,68.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:68.19,70.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:71.2,71.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:74.51,75.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:75.19,77.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:78.2,78.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:81.53,82.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:82.19,84.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:85.2,85.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:88.53,89.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:89.19,91.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:92.2,92.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:95.53,96.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:96.19,98.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:99.2,99.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1 github.com/echovault/echovault/pkg/echovault/api_acl.go:125.72,127.23 2 0 github.com/echovault/echovault/pkg/echovault/api_acl.go:127.23,129.3 1 0 github.com/echovault/echovault/pkg/echovault/api_acl.go:130.2,131.16 2 0 @@ -1926,6 +903,1029 @@ github.com/echovault/echovault/pkg/echovault/modules.go:108.3,108.18 1 0 github.com/echovault/echovault/pkg/echovault/modules.go:112.2,112.34 1 0 github.com/echovault/echovault/pkg/echovault/modules.go:112.34,115.3 2 0 github.com/echovault/echovault/pkg/echovault/modules.go:117.2,117.72 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:29.115,35.29 4 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:35.29,36.54 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:36.54,42.42 4 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:42.42,44.5 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:46.4,49.12 3 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:52.3,52.36 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:52.36,59.43 5 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:59.43,61.5 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:63.4,65.21 2 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:69.2,71.25 2 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:74.109,78.35 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:78.35,79.65 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:79.65,80.41 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:80.41,82.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:83.4,83.12 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:85.3,85.13 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:88.2,88.51 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:91.110,92.18 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:93.9,98.36 4 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:98.36,99.66 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:99.66,100.52 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:100.52,104.6 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:105.5,105.13 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:107.4,108.14 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:110.3,111.26 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:113.9,117.45 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:117.45,119.4 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:120.3,120.42 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:120.42,124.37 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:124.37,125.67 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:125.67,126.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:126.53,127.59 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:127.59,131.8 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:133.6,133.14 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:135.5,135.54 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:135.54,138.6 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:140.9,140.50 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:140.50,144.37 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:144.37,145.67 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:145.67,146.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:146.53,148.24 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:148.24,151.8 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:153.6,153.14 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:155.5,155.33 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:155.33,158.6 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:160.9,160.49 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:160.49,164.37 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:164.37,165.67 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:165.67,166.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:166.53,167.55 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:167.55,171.8 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:173.6,173.14 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:175.5,175.50 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:175.50,178.6 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:180.9,182.4 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:183.3,184.26 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:185.10,186.54 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:190.103,192.2 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:194.33,202.60 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:202.60,202.86 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:211.60,213.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:221.62,221.88 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:230.62,230.88 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:240.62,240.88 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:251.60,253.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:254.113,255.49 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:255.49,257.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:258.5,258.45 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:267.60,269.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:270.113,272.18 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:272.18,274.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:275.5,275.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:284.60,286.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:287.113,288.47 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:288.47,290.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:291.5,291.45 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:31.105,33.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:33.16,35.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:37.2,40.25 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:40.25,42.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:44.2,44.38 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:44.38,46.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:48.2,48.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:48.33,50.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:50.17,52.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:53.3,54.59 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:54.59,56.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:57.3,57.59 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:60.2,60.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:60.51,62.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:63.2,66.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:66.9,68.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:70.2,71.36 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:71.36,72.42 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:72.42,73.26 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:73.26,76.5 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:77.4,77.12 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:79.3,80.13 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:82.2,82.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:82.55,84.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:86.2,86.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:89.105,91.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:91.16,93.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:95.2,98.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:98.33,100.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:102.2,102.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:102.52,104.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:105.2,108.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:108.9,110.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:112.2,115.31 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:115.31,117.19 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:117.19,119.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:121.3,121.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:121.34,123.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:125.3,125.31 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:125.31,127.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:129.3,129.35 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:129.35,132.12 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:134.3,134.32 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:137.2,137.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:140.108,142.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:142.16,144.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:146.2,149.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:149.33,151.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:153.2,153.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:153.52,155.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:156.2,159.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:159.9,161.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:163.2,166.31 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:166.31,168.19 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:168.19,170.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:172.3,172.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:172.34,174.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:176.3,176.35 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:176.35,179.12 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:181.3,181.31 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:181.31,183.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:185.3,185.18 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:188.2,188.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:191.106,193.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:193.16,195.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:197.2,199.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:199.33,201.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:203.2,203.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:203.52,205.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:206.2,209.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:209.9,211.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:213.2,214.27 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:214.27,215.32 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:215.32,217.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:219.3,219.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:219.33,222.12 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:224.3,224.29 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:224.29,226.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:229.2,229.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:232.111,234.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:234.16,236.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:238.2,241.19 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:241.19,243.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:243.17,245.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:246.3,246.13 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:246.13,248.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:249.3,249.12 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:252.2,253.19 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:253.19,254.46 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:254.46,256.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:256.9,258.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:261.2,261.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:261.33,263.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:265.2,265.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:265.52,267.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:268.2,271.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:271.9,273.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:276.2,276.24 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:276.24,278.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:278.17,280.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:281.3,281.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:281.34,283.18 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:283.18,284.36 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:284.36,286.14 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:288.5,288.37 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:288.37,291.14 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:293.5,293.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:293.33,295.14 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:299.3,299.26 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:303.2,304.29 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:304.29,306.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:309.2,311.46 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:311.46,315.16 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:315.16,316.59 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:316.59,318.5 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:322.2,323.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:323.16,325.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:326.2,326.38 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:326.38,328.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:328.17,329.41 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:329.41,331.13 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:333.4,333.42 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:333.42,336.13 3 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:338.4,338.38 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:338.38,340.13 2 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:345.2,345.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:348.105,350.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:350.16,352.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:354.2,356.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:356.33,358.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:360.2,360.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:360.52,362.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:363.2,366.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:366.9,368.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:370.2,370.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:373.106,375.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:375.16,377.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:379.2,381.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:381.33,383.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:385.2,385.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:385.52,387.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:388.2,391.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:391.9,393.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:395.2,396.29 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:396.29,398.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:400.2,400.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:403.108,405.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:405.16,407.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:409.2,415.47 5 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:415.47,417.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:417.17,419.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:420.3,420.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:421.8,423.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:423.17,425.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:426.3,426.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:429.2,429.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:429.33,430.62 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:430.62,432.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:433.3,435.48 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:435.48,437.57 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:437.57,439.5 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:440.4,440.96 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:441.9,443.57 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:443.57,445.5 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:446.4,446.60 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:450.2,450.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:450.52,452.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:453.2,456.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:456.9,458.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:460.2,460.24 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:460.24,462.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:464.2,464.28 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:465.10,466.69 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:467.11,469.48 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:469.48,471.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:471.9,473.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:474.15,476.48 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:476.48,478.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:478.9,480.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:483.2,483.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:483.55,485.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:487.2,487.40 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:487.40,489.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:491.2,492.47 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:495.108,497.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:497.16,499.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:501.2,503.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:503.33,505.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:507.2,507.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:507.52,509.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:510.2,513.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:513.9,515.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:517.2,518.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:518.33,520.34 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:520.34,522.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:523.3,523.35 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:523.35,526.4 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:527.3,527.31 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:527.31,529.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:532.2,532.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:535.108,537.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:537.16,539.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:541.2,544.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:544.33,546.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:548.2,548.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:548.52,550.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:551.2,554.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:554.9,556.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:558.2,558.24 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:558.24,560.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:562.2,562.30 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:565.105,567.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:567.16,569.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:571.2,574.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:574.33,576.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:578.2,578.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:578.51,580.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:581.2,584.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:584.9,586.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:588.2,590.31 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:590.31,591.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:591.25,594.4 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:597.2,597.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:597.55,599.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:601.2,601.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:604.33,725.2 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:22.50,23.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:23.18,25.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:26.2,26.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:29.52,30.18 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:30.18,32.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:33.2,33.22 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:36.50,37.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:37.18,39.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:40.2,40.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:43.53,44.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:44.18,46.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:47.2,47.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:50.51,51.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:51.19,53.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:54.2,54.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:57.56,58.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:58.34,60.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.2,61.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.19,63.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:64.2,64.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:67.50,68.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:68.19,70.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:71.2,71.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:74.51,75.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:75.19,77.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:78.2,78.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:81.53,82.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:82.19,84.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:85.2,85.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:88.53,89.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:89.19,91.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:92.2,92.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:95.53,96.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:96.19,98.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:99.2,99.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:34.108,35.34 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:35.34,37.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:38.2,39.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:39.9,41.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:42.2,42.67 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:42.67,44.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:45.2,45.42 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:48.106,49.19 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:49.19,51.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:53.2,54.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:54.9,56.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:58.2,60.30 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:60.30,61.27 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:61.27,64.9 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:68.2,68.16 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:68.16,70.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:73.2,77.18 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:77.18,79.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:79.8,81.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:82.2,82.21 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:82.21,84.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:85.2,85.17 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:85.17,87.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:89.2,90.29 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:90.29,92.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:95.2,96.51 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:96.51,97.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:97.22,99.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:101.3,101.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:103.2,103.51 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:103.51,104.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:104.22,106.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:108.3,108.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:112.2,113.48 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:113.48,114.21 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:114.21,116.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:118.3,118.47 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:120.2,120.48 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:120.48,121.21 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:121.21,123.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:125.3,125.47 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:129.2,130.79 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:130.79,131.37 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:131.37,133.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:135.2,136.30 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:136.30,137.10 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:138.100,140.53 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:141.53,143.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:144.52,146.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:151.2,153.54 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:153.54,155.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:156.2,156.54 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:156.54,158.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:160.2,162.25 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:165.102,166.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:166.18,168.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:170.2,174.35 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:174.35,175.36 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:175.36,176.48 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:176.48,178.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:179.4,179.12 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:181.3,181.50 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:181.50,182.51 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:182.51,185.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:189.2,189.19 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:189.19,192.34 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:192.34,195.4 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:196.3,197.28 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:197.28,199.24 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:199.24,201.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:203.3,203.26 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:206.2,206.19 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:206.19,208.46 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:208.46,209.43 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:209.43,211.38 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:211.38,213.30 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:213.30,215.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:217.5,217.28 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:222.2,222.74 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:225.102,227.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:227.9,229.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:230.2,231.33 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:231.33,233.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:234.2,235.25 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:238.106,240.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:240.9,242.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:243.2,243.45 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:243.45,245.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:246.2,246.42 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:249.108,250.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:250.18,252.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:253.2,254.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:254.9,256.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:257.2,257.53 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:257.53,259.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:260.2,260.42 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:263.106,265.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:265.9,267.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:268.2,269.74 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:272.103,273.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:273.18,275.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:276.2,277.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:277.9,279.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:280.2,282.33 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:282.33,285.19 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:285.19,287.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:287.9,289.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:291.3,291.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:291.22,293.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:295.3,295.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:295.18,297.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:299.3,299.43 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:299.43,300.61 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:300.61,302.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:303.4,303.58 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:303.58,305.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:308.3,308.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:308.52,309.23 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:309.23,311.13 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:313.4,313.39 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:316.3,316.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:316.52,317.23 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:317.23,319.13 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:321.4,321.39 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:324.3,324.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:324.49,325.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:325.22,327.13 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:329.4,329.37 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:332.3,332.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:332.49,333.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:333.22,335.13 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:337.4,337.37 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:340.3,340.45 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:340.45,341.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:341.52,343.13 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:345.4,345.41 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:348.3,348.45 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:348.45,349.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:349.52,351.5 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:354.3,354.55 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:354.55,356.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:358.3,358.55 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:358.55,360.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:361.3,361.54 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:364.2,365.25 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:368.103,369.19 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:369.19,371.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:373.2,374.9 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:374.9,376.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:378.2,382.16 4 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:382.16,384.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:386.2,386.15 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:386.15,387.35 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:387.35,389.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:392.2,396.20 3 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:396.20,397.59 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:397.59,399.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:402.2,402.37 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:402.37,403.59 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:403.59,405.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:409.2,409.29 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:409.29,413.31 3 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:413.31,414.35 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:414.35,417.43 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:417.43,419.6 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:419.11,422.6 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:423.5,423.10 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:427.3,427.17 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:427.17,429.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:432.2,432.42 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:435.103,436.18 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:436.18,438.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:440.2,441.9 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:441.9,443.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:445.2,449.16 4 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:449.16,451.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:453.2,453.15 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:453.15,454.35 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:454.35,456.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:459.2,461.20 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:461.20,464.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:464.17,466.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:467.3,468.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:468.17,470.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:473.2,473.37 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:473.37,476.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:476.17,478.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:479.3,480.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:480.17,482.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:485.2,486.16 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:486.16,488.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:490.2,490.42 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:493.33,501.60 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:501.60,503.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:512.60,514.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:523.62,525.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:534.62,536.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:545.62,547.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:556.62,558.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:567.62,569.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:578.62,580.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:589.62,591.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:603.62,605.7 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:614.62,616.7 1 0 +github.com/echovault/echovault/pkg/modules/connection/commands.go:26.108,27.18 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:28.10,29.54 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:30.9,31.34 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:32.9,33.72 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:37.33,45.60 1 0 +github.com/echovault/echovault/pkg/modules/connection/commands.go:45.60,47.5 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:34.13,35.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:35.34,39.3 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:41.2,42.29 2 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:42.29,44.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:52.104,54.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:54.16,56.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:58.2,63.16 5 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:63.16,65.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:69.2,69.16 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:69.16,70.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:70.34,72.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:72.9,74.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:77.2,77.44 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:77.44,79.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:79.34,81.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:82.3,82.36 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:83.8,83.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:83.51,85.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:85.33,87.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:88.3,88.45 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:89.8,91.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:91.34,94.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:94.9,97.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:99.2,99.16 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:99.16,101.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:102.2,104.76 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:104.76,106.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:109.2,109.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:109.28,111.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:113.2,113.17 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:116.105,117.44 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:117.44,119.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:121.2,124.15 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:124.15,125.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:125.29,126.16 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:126.16,132.5 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:137.2,137.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:137.30,138.15 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:138.15,143.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:148.2,148.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:148.28,149.31 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:149.31,150.52 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:150.52,152.5 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:153.4,154.12 2 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:156.3,156.60 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:156.60,158.4 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:159.3,159.55 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:163.2,163.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:163.28,164.58 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:164.58,166.4 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:169.2,169.42 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:172.104,174.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:174.16,176.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:177.2,179.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:179.33,181.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:183.2,184.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:184.16,186.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:187.2,191.51 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:194.105,196.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:196.16,198.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:200.2,203.27 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:203.27,204.31 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:204.31,206.12 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:208.3,208.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:208.33,210.18 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:210.18,212.5 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:213.4,214.12 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:216.3,216.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:218.2,218.15 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:218.15,219.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:219.34,220.14 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:220.14,223.5 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:227.2,227.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:227.28,229.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:231.2,233.30 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:233.30,234.24 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:234.24,236.12 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:238.3,238.96 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:241.2,241.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:244.104,246.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:246.16,248.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:249.2,250.27 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:250.27,252.17 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:252.17,254.12 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:256.3,256.13 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:258.2,258.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:261.108,263.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:263.16,265.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:267.2,269.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:269.33,271.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:273.2,273.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:273.51,275.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:276.2,279.31 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:279.31,281.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:283.2,285.30 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:288.111,290.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:290.16,292.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:294.2,296.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:296.33,298.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:300.2,300.52 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:300.52,302.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:303.2,307.31 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:307.31,309.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:311.2,312.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:312.46,314.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:316.2,316.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:319.104,321.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:321.16,323.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:325.2,327.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:327.33,329.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:331.2,331.52 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:331.52,333.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:334.2,338.31 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:338.31,340.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:342.2,343.39 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:343.39,345.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:347.2,347.12 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:347.12,349.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:351.2,351.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:354.107,356.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:356.16,358.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:360.2,364.16 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:364.16,366.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:367.2,368.42 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:368.42,370.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:372.2,372.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:372.33,374.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:376.2,376.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:376.51,378.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:379.2,381.19 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:381.19,384.3 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:386.2,388.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:389.12,390.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:390.39,392.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:393.3,393.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:394.12,395.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:395.39,397.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:398.3,398.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:399.12,400.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:400.39,402.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:403.3,403.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:403.39,405.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:406.3,406.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:407.12,408.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:408.39,409.40 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:409.40,411.5 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:412.4,412.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:414.3,414.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:415.10,416.71 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:419.2,419.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:422.109,424.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:424.16,426.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:428.2,432.16 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:432.16,434.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:435.2,436.44 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:436.44,438.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:440.2,440.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:440.33,442.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:444.2,444.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:444.51,446.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:447.2,449.19 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:449.19,452.3 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:454.2,456.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:457.12,458.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:458.39,460.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:461.3,461.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:462.12,463.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:463.39,465.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:466.3,466.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:467.12,468.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:468.39,470.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:471.3,471.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:471.39,473.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:474.3,474.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:475.12,476.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:476.39,477.40 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:477.40,479.5 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:480.4,480.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:482.3,482.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:483.10,484.71 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:487.2,487.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:490.33,659.2 1 0 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0 +github.com/echovault/echovault/pkg/modules/generic/utils.go:31.77,32.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:32.19,34.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:35.2,35.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:36.13,38.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:40.12,41.26 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:41.26,43.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:44.3,45.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:47.12,48.26 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:48.26,50.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:51.3,52.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:54.12,55.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:55.19,57.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:58.3,58.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:58.29,60.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:61.3,63.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:63.17,65.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:66.3,67.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:69.12,70.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:70.19,72.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:73.3,73.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:73.29,75.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:76.3,78.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:78.17,80.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:81.3,82.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:84.14,85.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:85.19,87.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:88.3,88.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:88.29,90.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:91.3,93.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:93.17,95.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:96.3,97.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:99.14,100.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:100.19,102.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:103.3,103.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:103.29,105.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:30.105,32.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:32.16,34.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:36.2,38.33 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:38.33,41.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:43.2,43.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:43.52,45.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:46.2,48.63 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:48.63,50.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:52.2,52.57 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:55.110,57.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:57.16,59.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:61.2,64.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:64.9,66.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:68.2,68.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:68.33,70.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:72.2,72.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:72.52,74.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:75.2,78.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:78.9,80.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:82.2,82.40 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:82.40,84.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:86.2,86.57 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:89.110,91.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:91.16,93.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:95.2,99.24 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:99.24,101.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:103.2,103.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:103.33,105.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:107.2,107.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:107.52,109.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:110.2,113.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:113.9,115.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:118.2,118.40 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:118.40,120.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:123.2,123.51 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:123.51,125.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:127.2,130.15 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:130.15,132.43 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:132.43,135.4 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:136.3,136.20 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:140.2,140.18 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:140.18,142.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:147.2,151.17 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:151.17,153.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:155.2,155.13 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:155.13,158.18 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:158.18,160.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:160.9,162.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:165.2,165.19 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:168.108,170.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:170.16,172.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:174.2,177.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:177.9,179.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:181.2,181.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:181.33,183.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:185.2,185.51 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:185.51,187.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:188.2,191.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:191.9,193.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:195.2,195.40 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:195.40,197.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:199.2,200.55 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:200.55,202.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:204.2,204.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:207.109,209.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:209.16,211.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:213.2,217.24 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:217.24,219.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:221.2,221.30 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:221.30,223.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:225.2,225.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:225.33,227.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:229.2,229.51 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:229.51,231.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:232.2,235.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:235.9,237.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:239.2,239.40 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:239.40,241.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:243.2,243.34 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:243.34,244.64 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:244.64,246.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:247.3,247.43 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:250.2,250.66 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:250.66,252.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:253.2,253.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:256.108,258.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:258.16,260.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:262.2,266.9 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:266.9,268.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:270.2,272.33 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:272.33,274.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:276.2,276.51 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:276.51,278.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:279.2,282.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:282.9,284.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:286.2,286.9 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:287.10,287.10 0 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:289.17,291.34 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:291.34,292.26 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:292.26,293.10 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:295.4,295.43 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:295.43,298.5 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:300.17,302.39 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:302.39,303.26 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:303.26,304.10 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:306.4,306.43 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:306.43,309.5 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:313.2,313.61 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:313.61,315.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:317.2,317.55 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:317.55,319.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:321.2,321.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:324.109,326.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:326.16,328.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:330.2,335.116 5 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:335.116,337.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:339.2,339.75 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:339.75,341.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:343.2,343.54 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:343.54,345.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:346.2,349.16 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:349.16,351.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:352.2,357.33 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:357.33,359.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:361.2,361.19 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:362.14,364.24 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:364.24,366.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:366.9,366.32 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:366.32,368.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:369.15,371.24 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:371.24,373.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:373.9,373.32 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:373.32,375.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:378.2,378.16 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:378.16,380.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:382.2,382.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:385.106,387.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:387.16,389.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:391.2,393.31 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:393.31,395.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:397.2,399.33 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:399.33,400.34 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:401.17,402.61 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:403.11,404.62 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:404.62,406.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:407.4,407.68 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:407.68,409.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:411.8,412.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:412.52,414.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:416.2,421.9 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:421.9,423.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:425.2,425.73 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:425.73,427.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:428.2,428.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:431.109,433.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:433.16,435.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:437.2,441.31 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:441.31,443.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:445.2,445.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:445.33,446.34 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:447.17,448.61 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:449.11,450.62 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:450.62,452.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:453.4,454.68 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:454.68,456.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:458.8,459.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:459.52,461.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:462.3,462.35 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:465.2,469.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:469.9,471.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:473.2,473.73 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:473.73,475.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:476.2,476.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:479.104,481.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:481.16,483.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:485.2,487.33 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:487.33,489.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:491.2,491.51 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:491.51,493.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:494.2,497.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:497.9,499.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:501.2,501.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:502.10,503.60 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:503.60,505.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:506.3,506.54 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:507.14,508.70 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:508.70,510.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:511.3,511.64 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:515.33,635.2 1 0 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:22.51,23.18 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:23.18,25.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:26.2,26.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:29.49,30.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:30.19,32.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:33.2,33.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:36.50,37.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:37.19,39.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:40.2,40.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:43.52,44.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:44.19,46.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:47.2,47.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:50.52,51.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:51.19,53.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:54.2,54.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:57.50,58.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:58.19,60.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:61.2,61.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:64.51,65.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:65.19,67.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:68.2,68.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:71.50,72.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:72.19,74.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:75.2,75.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:78.51,79.18 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:79.18,81.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,82.30 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1 github.com/echovault/echovault/pkg/modules/pubsub/commands.go:28.113,30.9 2 1 github.com/echovault/echovault/pkg/modules/pubsub/commands.go:30.9,32.3 1 0 github.com/echovault/echovault/pkg/modules/pubsub/commands.go:34.2,36.24 2 1 diff --git a/pkg/modules/acl/commands_test.go b/pkg/modules/acl/commands_test.go index e0a3d521..fa8d55b0 100644 --- a/pkg/modules/acl/commands_test.go +++ b/pkg/modules/acl/commands_test.go @@ -21,7 +21,11 @@ import ( "github.com/echovault/echovault/internal/config" "github.com/echovault/echovault/pkg/constants" "github.com/echovault/echovault/pkg/echovault" + "github.com/tidwall/resp" + "net" "slices" + "strings" + "testing" ) var bindAddr string @@ -176,1267 +180,1267 @@ func generateSHA256Password(plain string) string { return string(h.Sum(nil)) } -//func Test_HandleAuth(t *testing.T) { -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// r := resp.NewConn(conn) -// -// tests := []struct { -// cmd []resp.Value -// wantRes string -// wantErr string -// }{ -// { // 1. Authenticate with default user without specifying username -// cmd: []resp.Value{resp.StringValue("AUTH"), resp.StringValue("password1")}, -// wantRes: "OK", -// wantErr: "", -// }, -// { // 2. Authenticate with plaintext password -// cmd: []resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue("with_password_user"), -// resp.StringValue("password2"), -// }, -// wantRes: "OK", -// wantErr: "", -// }, -// { // 3. Authenticate with SHA256 password -// cmd: []resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue("with_password_user"), -// resp.StringValue("password3"), -// }, -// wantRes: "OK", -// wantErr: "", -// }, -// { // 4. Authenticate with no password user -// cmd: []resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue("no_password_user"), -// resp.StringValue("password4"), -// }, -// wantRes: "OK", -// wantErr: "", -// }, -// { // 5. Fail to authenticate with disabled user -// cmd: []resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue("disabled_user"), -// resp.StringValue("password5"), -// }, -// wantRes: "", -// wantErr: "Error user disabled_user is disabled", -// }, -// { // 6. Fail to authenticate with non-existent user -// cmd: []resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue("non_existent_user"), -// resp.StringValue("password6"), -// }, -// wantRes: "", -// wantErr: "Error no user with username non_existent_user", -// }, -// { // 7. Command too short -// cmd: []resp.Value{resp.StringValue("AUTH")}, -// wantRes: "", -// wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), -// }, -// { // 8. Command too long -// cmd: []resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue("user"), -// resp.StringValue("password1"), -// resp.StringValue("password2"), -// }, -// wantRes: "", -// wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), -// }, -// } -// -// for _, test := range tests { -// if err = r.WriteArray(test.cmd); err != nil { -// t.Error(err) -// } -// rv, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if test.wantErr != "" { -// if rv.Error().Error() != test.wantErr { -// t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, rv.Error().Error()) -// } -// continue -// } -// if rv.String() != test.wantRes { -// t.Errorf("expected response \"%s\", got \"%s\"", test.wantRes, rv.String()) -// } -// } -//} -// -//func Test_HandleCat(t *testing.T) { -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// r := resp.NewConn(conn) -// -// // Authenticate connection -// if err = r.WriteArray([]resp.Value{resp.StringValue("AUTH"), resp.StringValue("password1")}); err != nil { -// t.Error(err) -// } -// rv, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if rv.String() != "OK" { -// t.Error("could not authenticate user") -// } -// -// // Since only ACL commands are loaded in this test suite, this test will only test against the -// // list of categories and commands available in the ACL module. -// tests := []struct { -// cmd []resp.Value -// wantRes []string -// wantErr string -// }{ -// { // 1. Return list of categories -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT")}, -// wantRes: []string{ -// constants.ConnectionCategory, -// constants.SlowCategory, -// constants.FastCategory, -// constants.AdminCategory, -// constants.DangerousCategory, -// }, -// wantErr: "", -// }, -// { // 2. Return list of commands in connection category -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.ConnectionCategory)}, -// wantRes: []string{"auth"}, -// wantErr: "", -// }, -// { // 3. Return list of commands in slow category -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.SlowCategory)}, -// wantRes: []string{"auth", "acl|cat", "acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, -// wantErr: "", -// }, -// { // 4. Return list of commands in fast category -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.FastCategory)}, -// wantRes: []string{"acl|whoami"}, -// wantErr: "", -// }, -// { // 5. Return list of commands in admin category -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.AdminCategory)}, -// wantRes: []string{"acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, -// wantErr: "", -// }, -// { // 6. Return list of commands in dangerous category -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.DangerousCategory)}, -// wantRes: []string{"acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, -// wantErr: "", -// }, -// { // 7. Return error when category does not exist -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue("non-existent")}, -// wantRes: nil, -// wantErr: "Error category NON-EXISTENT not found", -// }, -// { // 8. Command too long -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue("category1"), resp.StringValue("category2")}, -// wantRes: nil, -// wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), -// }, -// } -// -// for _, test := range tests { -// if err = r.WriteArray(test.cmd); err != nil { -// t.Error(err) -// } -// rv, _, err = r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if test.wantErr != "" { -// if rv.Error().Error() != test.wantErr { -// t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, rv.Error().Error()) -// } -// continue -// } -// resArr := rv.Array() -// // Check if all the elements in the expected array are in the response array -// for _, expected := range test.wantRes { -// if !slices.ContainsFunc(resArr, func(value resp.Value) bool { -// return value.String() == expected -// }) { -// t.Errorf("could not find expected command \"%s\" in the response array for category", expected) -// } -// } -// // Check if all the elements in the response array are in the expected array -// for _, value := range resArr { -// if !slices.ContainsFunc(test.wantRes, func(expected string) bool { -// return value.String() == expected -// }) { -// t.Errorf("could not find response command \"%s\" in the expected array", value.String()) -// } -// } -// } -//} -// -//func Test_HandleUsers(t *testing.T) { -// var port uint16 = 7491 -// mockServer := setUpServer(bindAddr, port, false, "") -// go func() { -// mockServer.Start() -// }() -// -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// -// r := resp.NewConn(conn) -// -// users := []string{"default", "with_password_user", "no_password_user", "disabled_user"} -// -// if err = r.WriteArray([]resp.Value{resp.StringValue("ACL"), resp.StringValue("USERS")}); err != nil { -// t.Error(err) -// } -// -// rv, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// -// resArr := rv.Array() -// -// // Check if all the expected users are in the response array -// for _, user := range users { -// if !slices.ContainsFunc(resArr, func(value resp.Value) bool { -// return value.String() == user -// }) { -// t.Errorf("could not find expected user \"%s\" in response array", user) -// } -// } -// -// // Check if all the users in the response array are in the expected users -// for _, value := range resArr { -// if !slices.ContainsFunc(users, func(user string) bool { -// return value.String() == user -// }) { -// t.Errorf("could not find response user \"%s\" in expected users array", value.String()) -// } -// } -//} -// -//func Test_HandleSetUser(t *testing.T) { -// var port uint16 = 7492 -// mockServer := setUpServer(bindAddr, port, false, "") -// go func() { -// mockServer.Start() -// }() -// acl, ok := mockServer.GetACL().(*internal_acl.ACL) -// if !ok { -// t.Error("error loading ACL module") -// } -// -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// -// r := resp.NewConn(conn) -// -// tests := []struct { -// presetUser *internal_acl.User -// cmd []resp.Value -// wantRes string -// wantErr string -// wantUser *internal_acl.User -// }{ -// { -// // 1. Create new enabled user -// presetUser: nil, -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_1"), -// resp.StringValue("on"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_1") -// user.Enabled = true -// user.Normalise() -// return user -// }(), -// }, -// { -// // 2. Create new disabled user -// presetUser: nil, -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_2"), -// resp.StringValue("off"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_2") -// user.Enabled = false -// user.Normalise() -// return user -// }(), -// }, -// { -// // 3. Create new enabled user with both plaintext and SHA256 passwords -// presetUser: nil, -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_3"), -// resp.StringValue("on"), -// resp.StringValue(">set_user_3_plaintext_password_1"), -// resp.StringValue(">set_user_3_plaintext_password_2"), -// resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("set_user_3_hash_password_1"))), -// resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("set_user_3_hash_password_2"))), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_3") -// user.Enabled = true -// user.Passwords = []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, -// } -// user.Normalise() -// return user -// }(), -// }, -// { -// // 4. Remove plaintext and SHA256 password from existing user -// presetUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_4") -// user.Enabled = true -// user.Passwords = []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, -// } -// user.Normalise() -// return user -// }(), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_4"), -// resp.StringValue("on"), -// resp.StringValue("password1"), -// resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("password2"))), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_16") -// user.Enabled = true -// user.NoPassword = true -// user.Passwords = []internal_acl.Password{} -// user.Normalise() -// return user -// }(), -// }, -// { -// // 17. Delete all existing users passwords using 'nopass' -// presetUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_17") -// user.Enabled = true -// user.NoPassword = true -// user.Passwords = []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password1"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, -// } -// user.Normalise() -// return user -// }(), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_17"), -// resp.StringValue("on"), -// resp.StringValue("nopass"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_17") -// user.Enabled = true -// user.NoPassword = true -// user.Passwords = []internal_acl.Password{} -// user.Normalise() -// return user -// }(), -// }, -// { -// // 18. Clear all of an existing user's passwords using 'resetpass' -// presetUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_18") -// user.Enabled = true -// user.NoPassword = true -// user.Passwords = []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password1"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, -// } -// user.Normalise() -// return user -// }(), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_18"), -// resp.StringValue("on"), -// resp.StringValue("nopass"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_18") -// user.Enabled = true -// user.NoPassword = true -// user.Passwords = []internal_acl.Password{} -// user.Normalise() -// return user -// }(), -// }, -// { -// // 19. Clear all of an existing user's command privileges using 'nocommands' -// presetUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_19") -// user.Enabled = true -// user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"} -// user.ExcludedCommands = []string{"rewriteaof", "save"} -// user.Normalise() -// return user -// }(), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_19"), -// resp.StringValue("on"), -// resp.StringValue("nocommands"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_19") -// user.Enabled = true -// user.IncludedCommands = []string{} -// user.ExcludedCommands = []string{"*"} -// user.IncludedCategories = []string{} -// user.ExcludedCategories = []string{"*"} -// user.Normalise() -// return user -// }(), -// }, -// { -// // 20. Clear all of an existing user's allowed keys using 'resetkeys' -// presetUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_20") -// user.Enabled = true -// user.IncludedWriteKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"} -// user.IncludedReadKeys = []string{"key1", "key2", "key3", "key7", "key8", "key9"} -// user.Normalise() -// return user -// }(), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_20"), -// resp.StringValue("on"), -// resp.StringValue("resetkeys"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_20") -// user.Enabled = true -// user.NoKeys = true -// user.IncludedReadKeys = []string{} -// user.IncludedWriteKeys = []string{} -// user.Normalise() -// return user -// }(), -// }, -// { -// // 21. Allow user to access all channels using 'resetchannels' -// presetUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_21") -// user.IncludedPubSubChannels = []string{"channel1", "channel2"} -// user.ExcludedPubSubChannels = []string{"channel3", "channel4"} -// user.Normalise() -// return user -// }(), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("SETUSER"), -// resp.StringValue("set_user_21"), -// resp.StringValue("resetchannels"), -// }, -// wantRes: "OK", -// wantErr: "", -// wantUser: func() *internal_acl.User { -// user := internal_acl.CreateUser("set_user_21") -// user.IncludedPubSubChannels = []string{} -// user.ExcludedPubSubChannels = []string{"*"} -// user.Normalise() -// return user -// }(), -// }, -// } -// -// for i, test := range tests { -// if test.presetUser != nil { -// acl.Users = append(acl.Users, test.presetUser) -// } -// if err = r.WriteArray(test.cmd); err != nil { -// t.Error(err) -// } -// v, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if test.wantErr != "" { -// if v.Error().Error() != test.wantErr { -// t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) -// } -// continue -// } -// if v.String() != test.wantRes { -// t.Errorf("expected response \"%s\", got \"%s\"", test.wantRes, v.String()) -// } -// if test.wantUser == nil { -// continue -// } -// expectedUser := test.wantUser -// currUserIdx := slices.IndexFunc(acl.Users, func(user *internal_acl.User) bool { -// return user.Username == expectedUser.Username -// }) -// if currUserIdx == -1 { -// t.Errorf("expected to find user with username \"%s\" but could not find them.", expectedUser.Username) -// } -// if err = compareUsers(expectedUser, acl.Users[currUserIdx]); err != nil { -// t.Errorf("test idx: %d, %+v", i, err) -// } -// } -//} -// -//func Test_HandleGetUser(t *testing.T) { -// var port uint16 = 7493 -// mockServer := setUpServer(bindAddr, port, false, "") -// go func() { -// mockServer.Start() -// }() -// acl, _ := mockServer.GetACL().(*internal_acl.ACL) -// -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// -// r := resp.NewConn(conn) -// -// tests := []struct { -// presetUser *internal_acl.User -// cmd []resp.Value -// wantRes []resp.Value -// wantErr string -// }{ -// { // 1. Get the user and all their details -// presetUser: &internal_acl.User{ -// Username: "get_user_1", -// Enabled: true, -// NoPassword: false, -// NoKeys: false, -// Passwords: []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "get_user_password_1"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("get_user_password_2")}, -// }, -// IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, -// ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, -// IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, -// ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, -// IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, -// IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, -// IncludedPubSubChannels: []string{"channel1", "channel2"}, -// ExcludedPubSubChannels: []string{"channel3", "channel4"}, -// }, -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("GETUSER"), resp.StringValue("get_user_1")}, -// wantRes: []resp.Value{ -// resp.StringValue("username"), -// resp.ArrayValue([]resp.Value{resp.StringValue("get_user_1")}), -// resp.StringValue("flags"), -// resp.ArrayValue([]resp.Value{ -// resp.StringValue("on"), -// }), -// resp.StringValue("categories"), -// resp.ArrayValue([]resp.Value{ -// resp.StringValue(fmt.Sprintf("+@%s", constants.WriteCategory)), -// resp.StringValue(fmt.Sprintf("+@%s", constants.ReadCategory)), -// resp.StringValue(fmt.Sprintf("+@%s", constants.PubSubCategory)), -// resp.StringValue(fmt.Sprintf("-@%s", constants.AdminCategory)), -// resp.StringValue(fmt.Sprintf("-@%s", constants.ConnectionCategory)), -// resp.StringValue(fmt.Sprintf("-@%s", constants.DangerousCategory)), -// }), -// resp.StringValue("commands"), -// resp.ArrayValue([]resp.Value{ -// resp.StringValue("+acl|setuser"), -// resp.StringValue("+acl|getuser"), -// resp.StringValue("+acl|deluser"), -// resp.StringValue("-rewriteaof"), -// resp.StringValue("-save"), -// resp.StringValue("-acl|load"), -// resp.StringValue("-acl|save"), -// }), -// resp.StringValue("keys"), -// resp.ArrayValue([]resp.Value{ -// // Keys here -// resp.StringValue("%RW~key1"), -// resp.StringValue("%RW~key2"), -// resp.StringValue("%R~key3"), -// resp.StringValue("%R~key4"), -// resp.StringValue("%W~key5"), -// resp.StringValue("%W~key6"), -// }), -// resp.StringValue("channels"), -// resp.ArrayValue([]resp.Value{ -// // Channels here -// resp.StringValue("+&channel1"), -// resp.StringValue("+&channel2"), -// resp.StringValue("-&channel3"), -// resp.StringValue("-&channel4"), -// }), -// }, -// wantErr: "", -// }, -// { // 2. Return user not found error -// presetUser: nil, -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("GETUSER"), -// resp.StringValue("non_existent_user")}, -// wantRes: nil, -// wantErr: "Error user not found", -// }, -// } -// -// for _, test := range tests { -// if test.presetUser != nil { -// acl.Users = append(acl.Users, test.presetUser) -// } -// if err = r.WriteArray(test.cmd); err != nil { -// t.Error(err) -// } -// v, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if test.wantErr != "" { -// if v.Error().Error() != test.wantErr { -// t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) -// } -// continue -// } -// resArr := v.Array() -// for i := 0; i < len(resArr); i++ { -// if slices.Contains([]string{"username", "flags", "categories", "commands", "keys", "channels"}, resArr[i].String()) { -// // String item -// if resArr[i].String() != test.wantRes[i].String() { -// t.Errorf("expected response component %+v, got %+v", test.wantRes[i], resArr[i]) -// } -// } else { -// // Array item -// var expected []string -// for _, item := range test.wantRes[i].Array() { -// expected = append(expected, item.String()) -// } -// -// var res []string -// for _, item := range resArr[i].Array() { -// res = append(res, item.String()) -// } -// -// if err = compareSlices(res, expected); err != nil { -// t.Error(err) -// } -// } -// } -// } -//} -// -//func Test_HandleDelUser(t *testing.T) { -// var port uint16 = 7494 -// mockServer := setUpServer(bindAddr, port, false, "") -// go func() { -// mockServer.Start() -// }() -// acl, _ := mockServer.GetACL().(*internal_acl.ACL) -// -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// -// r := resp.NewConn(conn) -// -// tests := []struct { -// presetUser *internal_acl.User -// cmd []resp.Value -// wantRes string -// wantErr string -// }{ -// { -// // 1. Delete existing user while skipping default user and non-existent user -// presetUser: internal_acl.CreateUser("user_to_delete"), -// cmd: []resp.Value{ -// resp.StringValue("ACL"), -// resp.StringValue("DELUSER"), -// resp.StringValue("default"), -// resp.StringValue("user_to_delete"), -// resp.StringValue("non_existent_user"), -// }, -// wantRes: "OK", -// wantErr: "", -// }, -// { -// // 2. Command too short -// presetUser: nil, -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("DELUSER")}, -// wantRes: "", -// wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), -// }, -// } -// -// for _, test := range tests { -// if test.presetUser != nil { -// acl.Users = append(acl.Users, test.presetUser) -// } -// if err = r.WriteArray(test.cmd); err != nil { -// t.Error(err) -// } -// v, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if test.wantErr != "" { -// if v.Error().Error() != test.wantErr { -// t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) -// } -// continue -// } -// // Check that default user still exists in the list of users -// if !slices.ContainsFunc(acl.Users, func(user *internal_acl.User) bool { -// return user.Username == "default" -// }) { -// t.Error("could not find user with username \"default\" in the ACL after deleting user") -// } -// // Check that the deleted user is no longer in the list -// if slices.ContainsFunc(acl.Users, func(user *internal_acl.User) bool { -// return user.Username == "user_to_delete" -// }) { -// t.Error("deleted user found in the ACL") -// } -// } -//} -// -//func Test_HandleWhoAmI(t *testing.T) { -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// -// r := resp.NewConn(conn) -// -// tests := []struct { -// username string -// password string -// wantRes string -// }{ -// { // 1. With default user -// username: "default", -// password: "password1", -// wantRes: "default", -// }, -// { // 2. With user authenticated by plaintext password -// username: "with_password_user", -// password: "password2", -// wantRes: "with_password_user", -// }, -// { // 3. With user authenticated by SHA256 password -// username: "with_password_user", -// password: "password3", -// wantRes: "with_password_user", -// }, -// } -// -// for _, test := range tests { -// // Authenticate -// if err = r.WriteArray([]resp.Value{ -// resp.StringValue("AUTH"), -// resp.StringValue(test.username), -// resp.StringValue(test.password), -// }); err != nil { -// t.Error(err) -// } -// v, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if v.String() != "OK" { -// t.Errorf("expected response for auth with %s:%s to be \"OK\", got %s", test.username, test.password, v.String()) -// } -// // Check whoami response value -// if err = r.WriteArray([]resp.Value{resp.StringValue("ACL"), resp.StringValue("WHOAMI")}); err != nil { -// t.Error(err) -// } -// v, _, err = r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if v.String() != test.wantRes { -// t.Errorf("expected whoami response to be \"%s\", got \"%s\"", test.wantRes, v.String()) -// } -// } -//} -// -//func Test_HandleList(t *testing.T) { -// var port uint16 = 7495 -// mockServer := setUpServer(bindAddr, port, false, "") -// go func() { -// mockServer.Start() -// }() -// acl, _ := mockServer.GetACL().(*internal_acl.ACL) -// -// conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) -// if err != nil { -// t.Error(err) -// } -// defer func() { -// _ = conn.Close() -// }() -// -// r := resp.NewConn(conn) -// -// tests := []struct { -// presetUsers []*internal_acl.User -// cmd []resp.Value -// wantRes []string -// wantErr string -// }{ -// { // 1. Get the user and all their details -// presetUsers: []*internal_acl.User{ -// { -// Username: "list_user_1", -// Enabled: true, -// NoPassword: false, -// NoKeys: false, -// Passwords: []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "list_user_password_1"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_2")}, -// }, -// IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, -// ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, -// IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, -// ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, -// IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, -// IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, -// IncludedPubSubChannels: []string{"channel1", "channel2"}, -// ExcludedPubSubChannels: []string{"channel3", "channel4"}, -// }, -// { -// Username: "list_user_2", -// Enabled: true, -// NoPassword: true, -// NoKeys: true, -// Passwords: []internal_acl.Password{}, -// IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, -// ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, -// IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, -// ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, -// IncludedReadKeys: []string{}, -// IncludedWriteKeys: []string{}, -// IncludedPubSubChannels: []string{"channel1", "channel2"}, -// ExcludedPubSubChannels: []string{"channel3", "channel4"}, -// }, -// { -// Username: "list_user_3", -// Enabled: true, -// NoPassword: false, -// NoKeys: false, -// Passwords: []internal_acl.Password{ -// {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "list_user_password_3"}, -// {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_4")}, -// }, -// IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, -// ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, -// IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, -// ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, -// IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, -// IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, -// IncludedPubSubChannels: []string{"channel1", "channel2"}, -// ExcludedPubSubChannels: []string{"channel3", "channel4"}, -// }, -// }, -// cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("LIST")}, -// wantRes: []string{ -// "default on +@all +all %RW~* +&*", -// fmt.Sprintf("with_password_user on >password2 #%s +@all +all", generateSHA256Password("password3")), -// "no_password_user on nopass >password4", -// "disabled_user off >password5", -// fmt.Sprintf(`list_user_1 on >list_user_password_1 #%s +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save %s +&channel1 +&channel2 -&channel3 -&channel4`, generateSHA256Password("list_user_password_2"), "%RW~key1 %RW~key2 %R~key3 %R~key4"), -// fmt.Sprintf(`list_user_2 on nopass nokeys +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save +&channel1 +&channel2 -&channel3 -&channel4`), -// fmt.Sprintf(`list_user_3 on >list_user_password_3 #%s +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save %s +&channel1 +&channel2 -&channel3 -&channel4`, generateSHA256Password("list_user_password_4"), "%RW~key1 %RW~key2 %R~key3 %R~key4"), -// }, -// wantErr: "", -// }, -// } -// -// for _, test := range tests { -// for _, user := range test.presetUsers { -// acl.Users = append(acl.Users, user) -// } -// if err = r.WriteArray(test.cmd); err != nil { -// t.Error(err) -// } -// v, _, err := r.ReadValue() -// if err != nil { -// t.Error(err) -// } -// if test.wantErr != "" { -// if v.Error().Error() != test.wantErr { -// t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) -// } -// continue -// } -// resArr := v.Array() -// if len(resArr) != len(test.wantRes) { -// t.Errorf("expected response of lenght %d, got lenght %d", len(test.wantRes), len(resArr)) -// } -// var resStr []string -// for i := 0; i < len(resArr); i++ { -// resStr = strings.Split(resArr[i].String(), " ") -// if !slices.ContainsFunc(test.wantRes, func(s string) bool { -// expectedUserSlice := strings.Split(s, " ") -// return compareSlices(resStr, expectedUserSlice) == nil -// }) { -// t.Errorf("could not find the following user in expected slice: %+v", resStr) -// } -// clear(resStr) -// } -// } -//} +func Test_HandleAuth(t *testing.T) { + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + r := resp.NewConn(conn) + + tests := []struct { + cmd []resp.Value + wantRes string + wantErr string + }{ + { // 1. Authenticate with default user without specifying username + cmd: []resp.Value{resp.StringValue("AUTH"), resp.StringValue("password1")}, + wantRes: "OK", + wantErr: "", + }, + { // 2. Authenticate with plaintext password + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("with_password_user"), + resp.StringValue("password2"), + }, + wantRes: "OK", + wantErr: "", + }, + { // 3. Authenticate with SHA256 password + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("with_password_user"), + resp.StringValue("password3"), + }, + wantRes: "OK", + wantErr: "", + }, + { // 4. Authenticate with no password user + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("no_password_user"), + resp.StringValue("password4"), + }, + wantRes: "OK", + wantErr: "", + }, + { // 5. Fail to authenticate with disabled user + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("disabled_user"), + resp.StringValue("password5"), + }, + wantRes: "", + wantErr: "Error user disabled_user is disabled", + }, + { // 6. Fail to authenticate with non-existent user + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("non_existent_user"), + resp.StringValue("password6"), + }, + wantRes: "", + wantErr: "Error no user with username non_existent_user", + }, + { // 7. Command too short + cmd: []resp.Value{resp.StringValue("AUTH")}, + wantRes: "", + wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), + }, + { // 8. Command too long + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("user"), + resp.StringValue("password1"), + resp.StringValue("password2"), + }, + wantRes: "", + wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), + }, + } + + for _, test := range tests { + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + rv, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if rv.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, rv.Error().Error()) + } + continue + } + if rv.String() != test.wantRes { + t.Errorf("expected response \"%s\", got \"%s\"", test.wantRes, rv.String()) + } + } +} + +func Test_HandleCat(t *testing.T) { + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + r := resp.NewConn(conn) + + // Authenticate connection + if err = r.WriteArray([]resp.Value{resp.StringValue("AUTH"), resp.StringValue("password1")}); err != nil { + t.Error(err) + } + rv, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if rv.String() != "OK" { + t.Error("could not authenticate user") + } + + // Since only ACL commands are loaded in this test suite, this test will only test against the + // list of categories and commands available in the ACL module. + tests := []struct { + cmd []resp.Value + wantRes []string + wantErr string + }{ + { // 1. Return list of categories + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT")}, + wantRes: []string{ + constants.ConnectionCategory, + constants.SlowCategory, + constants.FastCategory, + constants.AdminCategory, + constants.DangerousCategory, + }, + wantErr: "", + }, + { // 2. Return list of commands in connection category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.ConnectionCategory)}, + wantRes: []string{"auth"}, + wantErr: "", + }, + { // 3. Return list of commands in slow category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.SlowCategory)}, + wantRes: []string{"auth", "acl|cat", "acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, + wantErr: "", + }, + { // 4. Return list of commands in fast category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.FastCategory)}, + wantRes: []string{"acl|whoami"}, + wantErr: "", + }, + { // 5. Return list of commands in admin category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.AdminCategory)}, + wantRes: []string{"acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, + wantErr: "", + }, + { // 6. Return list of commands in dangerous category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(constants.DangerousCategory)}, + wantRes: []string{"acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, + wantErr: "", + }, + { // 7. Return error when category does not exist + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue("non-existent")}, + wantRes: nil, + wantErr: "Error category NON-EXISTENT not found", + }, + { // 8. Command too long + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue("category1"), resp.StringValue("category2")}, + wantRes: nil, + wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), + }, + } + + for _, test := range tests { + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + rv, _, err = r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if rv.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, rv.Error().Error()) + } + continue + } + resArr := rv.Array() + // Check if all the elements in the expected array are in the response array + for _, expected := range test.wantRes { + if !slices.ContainsFunc(resArr, func(value resp.Value) bool { + return value.String() == expected + }) { + t.Errorf("could not find expected command \"%s\" in the response array for category", expected) + } + } + // Check if all the elements in the response array are in the expected array + for _, value := range resArr { + if !slices.ContainsFunc(test.wantRes, func(expected string) bool { + return value.String() == expected + }) { + t.Errorf("could not find response command \"%s\" in the expected array", value.String()) + } + } + } +} + +func Test_HandleUsers(t *testing.T) { + var port uint16 = 7491 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start() + }() + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + users := []string{"default", "with_password_user", "no_password_user", "disabled_user"} + + if err = r.WriteArray([]resp.Value{resp.StringValue("ACL"), resp.StringValue("USERS")}); err != nil { + t.Error(err) + } + + rv, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + + resArr := rv.Array() + + // Check if all the expected users are in the response array + for _, user := range users { + if !slices.ContainsFunc(resArr, func(value resp.Value) bool { + return value.String() == user + }) { + t.Errorf("could not find expected user \"%s\" in response array", user) + } + } + + // Check if all the users in the response array are in the expected users + for _, value := range resArr { + if !slices.ContainsFunc(users, func(user string) bool { + return value.String() == user + }) { + t.Errorf("could not find response user \"%s\" in expected users array", value.String()) + } + } +} + +func Test_HandleSetUser(t *testing.T) { + var port uint16 = 7492 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start() + }() + acl, ok := mockServer.GetACL().(*internal_acl.ACL) + if !ok { + t.Error("error loading ACL module") + } + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUser *internal_acl.User + cmd []resp.Value + wantRes string + wantErr string + wantUser *internal_acl.User + }{ + { + // 1. Create new enabled user + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_1"), + resp.StringValue("on"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_1") + user.Enabled = true + user.Normalise() + return user + }(), + }, + { + // 2. Create new disabled user + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_2"), + resp.StringValue("off"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_2") + user.Enabled = false + user.Normalise() + return user + }(), + }, + { + // 3. Create new enabled user with both plaintext and SHA256 passwords + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_3"), + resp.StringValue("on"), + resp.StringValue(">set_user_3_plaintext_password_1"), + resp.StringValue(">set_user_3_plaintext_password_2"), + resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("set_user_3_hash_password_1"))), + resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("set_user_3_hash_password_2"))), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_3") + user.Enabled = true + user.Passwords = []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, + } + user.Normalise() + return user + }(), + }, + { + // 4. Remove plaintext and SHA256 password from existing user + presetUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_4") + user.Enabled = true + user.Passwords = []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, + } + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_4"), + resp.StringValue("on"), + resp.StringValue("password1"), + resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("password2"))), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_16") + user.Enabled = true + user.NoPassword = true + user.Passwords = []internal_acl.Password{} + user.Normalise() + return user + }(), + }, + { + // 17. Delete all existing users passwords using 'nopass' + presetUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_17") + user.Enabled = true + user.NoPassword = true + user.Passwords = []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password1"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, + } + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_17"), + resp.StringValue("on"), + resp.StringValue("nopass"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_17") + user.Enabled = true + user.NoPassword = true + user.Passwords = []internal_acl.Password{} + user.Normalise() + return user + }(), + }, + { + // 18. Clear all of an existing user's passwords using 'resetpass' + presetUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_18") + user.Enabled = true + user.NoPassword = true + user.Passwords = []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password1"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, + } + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_18"), + resp.StringValue("on"), + resp.StringValue("nopass"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_18") + user.Enabled = true + user.NoPassword = true + user.Passwords = []internal_acl.Password{} + user.Normalise() + return user + }(), + }, + { + // 19. Clear all of an existing user's command privileges using 'nocommands' + presetUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_19") + user.Enabled = true + user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"} + user.ExcludedCommands = []string{"rewriteaof", "save"} + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_19"), + resp.StringValue("on"), + resp.StringValue("nocommands"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_19") + user.Enabled = true + user.IncludedCommands = []string{} + user.ExcludedCommands = []string{"*"} + user.IncludedCategories = []string{} + user.ExcludedCategories = []string{"*"} + user.Normalise() + return user + }(), + }, + { + // 20. Clear all of an existing user's allowed keys using 'resetkeys' + presetUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_20") + user.Enabled = true + user.IncludedWriteKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"} + user.IncludedReadKeys = []string{"key1", "key2", "key3", "key7", "key8", "key9"} + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_20"), + resp.StringValue("on"), + resp.StringValue("resetkeys"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_20") + user.Enabled = true + user.NoKeys = true + user.IncludedReadKeys = []string{} + user.IncludedWriteKeys = []string{} + user.Normalise() + return user + }(), + }, + { + // 21. Allow user to access all channels using 'resetchannels' + presetUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_21") + user.IncludedPubSubChannels = []string{"channel1", "channel2"} + user.ExcludedPubSubChannels = []string{"channel3", "channel4"} + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_21"), + resp.StringValue("resetchannels"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *internal_acl.User { + user := internal_acl.CreateUser("set_user_21") + user.IncludedPubSubChannels = []string{} + user.ExcludedPubSubChannels = []string{"*"} + user.Normalise() + return user + }(), + }, + } + + for i, test := range tests { + if test.presetUser != nil { + acl.Users = append(acl.Users, test.presetUser) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + if v.String() != test.wantRes { + t.Errorf("expected response \"%s\", got \"%s\"", test.wantRes, v.String()) + } + if test.wantUser == nil { + continue + } + expectedUser := test.wantUser + currUserIdx := slices.IndexFunc(acl.Users, func(user *internal_acl.User) bool { + return user.Username == expectedUser.Username + }) + if currUserIdx == -1 { + t.Errorf("expected to find user with username \"%s\" but could not find them.", expectedUser.Username) + } + if err = compareUsers(expectedUser, acl.Users[currUserIdx]); err != nil { + t.Errorf("test idx: %d, %+v", i, err) + } + } +} + +func Test_HandleGetUser(t *testing.T) { + var port uint16 = 7493 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start() + }() + acl, _ := mockServer.GetACL().(*internal_acl.ACL) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUser *internal_acl.User + cmd []resp.Value + wantRes []resp.Value + wantErr string + }{ + { // 1. Get the user and all their details + presetUser: &internal_acl.User{ + Username: "get_user_1", + Enabled: true, + NoPassword: false, + NoKeys: false, + Passwords: []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "get_user_password_1"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("get_user_password_2")}, + }, + IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, + ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, + IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("GETUSER"), resp.StringValue("get_user_1")}, + wantRes: []resp.Value{ + resp.StringValue("username"), + resp.ArrayValue([]resp.Value{resp.StringValue("get_user_1")}), + resp.StringValue("flags"), + resp.ArrayValue([]resp.Value{ + resp.StringValue("on"), + }), + resp.StringValue("categories"), + resp.ArrayValue([]resp.Value{ + resp.StringValue(fmt.Sprintf("+@%s", constants.WriteCategory)), + resp.StringValue(fmt.Sprintf("+@%s", constants.ReadCategory)), + resp.StringValue(fmt.Sprintf("+@%s", constants.PubSubCategory)), + resp.StringValue(fmt.Sprintf("-@%s", constants.AdminCategory)), + resp.StringValue(fmt.Sprintf("-@%s", constants.ConnectionCategory)), + resp.StringValue(fmt.Sprintf("-@%s", constants.DangerousCategory)), + }), + resp.StringValue("commands"), + resp.ArrayValue([]resp.Value{ + resp.StringValue("+acl|setuser"), + resp.StringValue("+acl|getuser"), + resp.StringValue("+acl|deluser"), + resp.StringValue("-rewriteaof"), + resp.StringValue("-save"), + resp.StringValue("-acl|load"), + resp.StringValue("-acl|save"), + }), + resp.StringValue("keys"), + resp.ArrayValue([]resp.Value{ + // Keys here + resp.StringValue("%RW~key1"), + resp.StringValue("%RW~key2"), + resp.StringValue("%R~key3"), + resp.StringValue("%R~key4"), + resp.StringValue("%W~key5"), + resp.StringValue("%W~key6"), + }), + resp.StringValue("channels"), + resp.ArrayValue([]resp.Value{ + // Channels here + resp.StringValue("+&channel1"), + resp.StringValue("+&channel2"), + resp.StringValue("-&channel3"), + resp.StringValue("-&channel4"), + }), + }, + wantErr: "", + }, + { // 2. Return user not found error + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("GETUSER"), + resp.StringValue("non_existent_user")}, + wantRes: nil, + wantErr: "Error user not found", + }, + } + + for _, test := range tests { + if test.presetUser != nil { + acl.Users = append(acl.Users, test.presetUser) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + resArr := v.Array() + for i := 0; i < len(resArr); i++ { + if slices.Contains([]string{"username", "flags", "categories", "commands", "keys", "channels"}, resArr[i].String()) { + // String item + if resArr[i].String() != test.wantRes[i].String() { + t.Errorf("expected response component %+v, got %+v", test.wantRes[i], resArr[i]) + } + } else { + // Array item + var expected []string + for _, item := range test.wantRes[i].Array() { + expected = append(expected, item.String()) + } + + var res []string + for _, item := range resArr[i].Array() { + res = append(res, item.String()) + } + + if err = compareSlices(res, expected); err != nil { + t.Error(err) + } + } + } + } +} + +func Test_HandleDelUser(t *testing.T) { + var port uint16 = 7494 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start() + }() + acl, _ := mockServer.GetACL().(*internal_acl.ACL) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUser *internal_acl.User + cmd []resp.Value + wantRes string + wantErr string + }{ + { + // 1. Delete existing user while skipping default user and non-existent user + presetUser: internal_acl.CreateUser("user_to_delete"), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("DELUSER"), + resp.StringValue("default"), + resp.StringValue("user_to_delete"), + resp.StringValue("non_existent_user"), + }, + wantRes: "OK", + wantErr: "", + }, + { + // 2. Command too short + presetUser: nil, + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("DELUSER")}, + wantRes: "", + wantErr: fmt.Sprintf("Error %s", constants.WrongArgsResponse), + }, + } + + for _, test := range tests { + if test.presetUser != nil { + acl.Users = append(acl.Users, test.presetUser) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + // Check that default user still exists in the list of users + if !slices.ContainsFunc(acl.Users, func(user *internal_acl.User) bool { + return user.Username == "default" + }) { + t.Error("could not find user with username \"default\" in the ACL after deleting user") + } + // Check that the deleted user is no longer in the list + if slices.ContainsFunc(acl.Users, func(user *internal_acl.User) bool { + return user.Username == "user_to_delete" + }) { + t.Error("deleted user found in the ACL") + } + } +} + +func Test_HandleWhoAmI(t *testing.T) { + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + username string + password string + wantRes string + }{ + { // 1. With default user + username: "default", + password: "password1", + wantRes: "default", + }, + { // 2. With user authenticated by plaintext password + username: "with_password_user", + password: "password2", + wantRes: "with_password_user", + }, + { // 3. With user authenticated by SHA256 password + username: "with_password_user", + password: "password3", + wantRes: "with_password_user", + }, + } + + for _, test := range tests { + // Authenticate + if err = r.WriteArray([]resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue(test.username), + resp.StringValue(test.password), + }); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if v.String() != "OK" { + t.Errorf("expected response for auth with %s:%s to be \"OK\", got %s", test.username, test.password, v.String()) + } + // Check whoami response value + if err = r.WriteArray([]resp.Value{resp.StringValue("ACL"), resp.StringValue("WHOAMI")}); err != nil { + t.Error(err) + } + v, _, err = r.ReadValue() + if err != nil { + t.Error(err) + } + if v.String() != test.wantRes { + t.Errorf("expected whoami response to be \"%s\", got \"%s\"", test.wantRes, v.String()) + } + } +} + +func Test_HandleList(t *testing.T) { + var port uint16 = 7495 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start() + }() + acl, _ := mockServer.GetACL().(*internal_acl.ACL) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUsers []*internal_acl.User + cmd []resp.Value + wantRes []string + wantErr string + }{ + { // 1. Get the user and all their details + presetUsers: []*internal_acl.User{ + { + Username: "list_user_1", + Enabled: true, + NoPassword: false, + NoKeys: false, + Passwords: []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "list_user_password_1"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_2")}, + }, + IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, + ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, + IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + { + Username: "list_user_2", + Enabled: true, + NoPassword: true, + NoKeys: true, + Passwords: []internal_acl.Password{}, + IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, + ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{}, + IncludedWriteKeys: []string{}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + { + Username: "list_user_3", + Enabled: true, + NoPassword: false, + NoKeys: false, + Passwords: []internal_acl.Password{ + {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "list_user_password_3"}, + {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_4")}, + }, + IncludedCategories: []string{constants.WriteCategory, constants.ReadCategory, constants.PubSubCategory}, + ExcludedCategories: []string{constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, + IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + }, + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("LIST")}, + wantRes: []string{ + "default on +@all +all %RW~* +&*", + fmt.Sprintf("with_password_user on >password2 #%s +@all +all", generateSHA256Password("password3")), + "no_password_user on nopass >password4", + "disabled_user off >password5", + fmt.Sprintf(`list_user_1 on >list_user_password_1 #%s +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save %s +&channel1 +&channel2 -&channel3 -&channel4`, generateSHA256Password("list_user_password_2"), "%RW~key1 %RW~key2 %R~key3 %R~key4"), + fmt.Sprintf(`list_user_2 on nopass nokeys +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save +&channel1 +&channel2 -&channel3 -&channel4`), + fmt.Sprintf(`list_user_3 on >list_user_password_3 #%s +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save %s +&channel1 +&channel2 -&channel3 -&channel4`, generateSHA256Password("list_user_password_4"), "%RW~key1 %RW~key2 %R~key3 %R~key4"), + }, + wantErr: "", + }, + } + + for _, test := range tests { + for _, user := range test.presetUsers { + acl.Users = append(acl.Users, user) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + resArr := v.Array() + if len(resArr) != len(test.wantRes) { + t.Errorf("expected response of lenght %d, got lenght %d", len(test.wantRes), len(resArr)) + } + var resStr []string + for i := 0; i < len(resArr); i++ { + resStr = strings.Split(resArr[i].String(), " ") + if !slices.ContainsFunc(test.wantRes, func(s string) bool { + expectedUserSlice := strings.Split(s, " ") + return compareSlices(resStr, expectedUserSlice) == nil + }) { + t.Errorf("could not find the following user in expected slice: %+v", resStr) + } + clear(resStr) + } + } +}