> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bevor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Graph-native Analysis

> Follow semantic relationships beyond the edited lines to expose downstream security impact

export const productGraphData = {
  "transform": "translate(460 270) scale(0.6650689592134665) translate(-460.2042221770588 -258.93103884088833)",
  "nodes": "370.68,261.78,2,0,0;238.56,335.83,2,0,0;227.44,312.67,1,0,0;352.78,263.51,1,0,0;325.41,349.69,1,0,0;326.85,385.35,1,0,0;248.67,299.29,1,0,0;306.17,355.18,1,0,0;244.35,318.80,1,0,0;216.23,326.74,1,0,0;266.65,299.98,1,0,0;262.29,317.44,1,0,0;206.10,311.86,1,0,0;219.44,344.44,1,0,0;299.64,318.18,1,0,0;231.18,295.07,1,0,0;346.41,305.56,0,0,0;356.87,436.85,2,0,0;373.78,442.98,1,0,0;319.90,366.82,1,0,0;325.98,428.77,1,0,0;352.31,410.62,1,0,0;424.21,457.79,1,0,0;341.70,479.90,1,0,0;424.65,370.07,1,0,0;357.68,389.02,1,0,0;414.11,314.44,1,0,0;405.31,298.75,1,0,0;342.85,497.84,1,0,0;372.55,461.48,1,0,0;402.29,503.51,1,0,0;358.75,489.44,1,0,0;403.06,485.55,1,0,0;454.99,424.03,1,0,0;421.78,508.68,1,0,0;359.06,331.77,1,0,0;334.34,463.49,1,0,0;358.10,507.40,1,0,0;357.60,471.50,1,0,0;388.55,453.27,1,0,0;389.40,434.07,1,0,0;386.36,492.24,1,0,0;461.76,353.42,1,0,0;427.21,491.53,1,0,0;394.54,334.85,1,0,0;390.41,472.74,1,0,0;408.22,520.50,1,0,0;350.26,455.10,1,0,0;373.72,479.44,1,0,0;418.27,475.93,1,0,0;366.51,421.68,1,0,0;399.53,352.81,0,0,0;559.58,447.09,2,0,0;557.79,468.20,1,0,0;558.06,387.81,2,0,0;539.03,416.71,2,0,0;322.13,332.00,1,0,0;386.34,399.16,1,0,0;538.32,474.42,1,0,0;542.60,456.94,1,0,0;555.04,408.49,1,0,0;404.15,402.92,1,0,0;521.99,466.85,1,0,0;570.16,418.26,1,0,0;526.40,449.13,1,0,0;554.16,426.46,1,0,0;420.86,437.64,1,0,0;446.77,343.48,0,0,0;251.06,353.10,1,0,0;318.15,405.37,1,0,0;339.26,337.49,0,0,0;244.31,489.89,2,0,0;274.06,470.68,2,0,0;235.59,474.15,1,0,0;248.74,461.86,2,0,0;271.74,488.53,2,0,0;293.78,505.40,2,0,0;289.71,487.88,2,0,0;312.55,460.46,1,0,0;275.80,506.06,1,0,0;257.44,477.60,1,0,0;239.42,440.45,1,0,0;231.53,456.62,1,0,0;256.63,445.70,1,0,0;258.59,500.81,1,0,0;295.75,409.80,0,0,0;374.86,513.97,1,0,0;344.38,354.86,0,0,0;308.81,439.59,1,0,0;338.92,372.02,0,0,0;274.83,389.28,2,0,0;517.94,390.31,2,0,0;511.96,407.27,1,0,0;383.89,416.96,1,0,0;253.87,386.89,1,0,0;404.14,444.29,1,0,0;309.63,421.21,1,0,0;277.67,407.04,1,0,0;341.17,396.20,1,0,0;334.47,412.90,1,0,0;259.98,403.81,1,0,0;241.98,404.07,1,0,0;401.44,420.69,1,0,0;283.98,423.89,1,0,0;395.74,383.85,0,0,0;201.83,401.11,2,0,0;188.56,371.24,2,0,0;204.01,380.47,2,0,0;188.30,389.24,2,0,0;185.71,353.48,2,0,0;201.45,344.76,1,0,0;217.53,392.33,1,0,0;237.60,365.10,1,0,0;236.01,384.70,1,0,0;204.52,362.49,1,0,0;298.92,371.65,0,0,0;628.13,351.31,2,0,0;633.85,334.25,2,0,0;620.40,367.55,2,0,0;640.05,364.79,2,0,0;645.77,347.73,1,0,0;621.12,321.54,1,0,0;651.48,330.67,1,0,0;666.61,351.62,1,0,0;598.05,349.63,0,0,0;703.66,280.35,0,0,0;296.36,452.59,0,0,0;311.62,239.04,2,0,0;326.84,248.63,2,0,0;422.08,292.02,0,0,0;603.08,224.86,2,0,0;602.10,182.56,2,0,0;599.60,207.10,2,0,0;617.26,213.82,2,0,0;622.10,180.15,2,0,0;630.87,202.05,2,0,0;619.75,231.63,2,0,0;613.87,196.15,2,0,0;503.97,287.63,0,0,0;686.37,223.90,2,0,0;688.22,247.86,1,0,0;696.97,297.04,1,0,0;662.15,275.17,0,0,0;733.23,242.56,2,0,0;750.44,247.79,2,0,0;740.32,226.03,2,0,0;683.19,285.47,2,0,0;708.96,328.27,1,0,0;730.18,277.21,1,0,0;678.38,163.49,3,0,0;703.29,230.00,1,0,0;696.77,315.03,1,0,0;734.83,294.59,1,0,0;716.85,312.10,1,0,0;749.19,283.75,1,0,0;742.10,263.73,1,0,0;694.81,180.87,3,0,0;721.26,229.13,1,0,0;710.95,208.53,1,0,0;715.51,266.80,0,0,0;694.62,200.97,1,0,0;673.95,236.91,0,0,0;728.50,212.46,0,0,0;672.48,332.54,1,0,0;639.56,317.19,0,0,0;666.66,292.59,0,0,0;667.72,253.79,2,0,0;680.22,304.42,1,0,0;715.14,294.19,1,0,0;706.17,249.01,3,0,0;678.68,268.06,1,0,0;696.20,263.98,0,0,0;299.63,338.44,2,0,0;270.34,354.98,2,0,0;288.27,353.45,2,0,0;262.18,338.95,2,0,0;335.86,283.46,1,0,0;262.98,371.39,1,0,0;280.95,372.37,1,0,0;333.30,317.89,1,0,0;282.44,333.14,1,0,0;372.48,296.47,0,0,0;516.50,434.09,2,0,0;419.43,419.70,1,0,0;483.65,428.90,1,0,0;488.49,411.59,1,0,0;481.20,496.10,1,0,0;501.89,423.60,1,0,0;465.56,484.08,1,0,0;497.04,440.92,1,0,0;462.63,501.83,1,0,0;444.37,529.37,1,0,0;471.03,415.89,1,0,0;479.93,446.50,1,0,0;466.00,457.88,1,0,0;463.15,440.06,1,0,0;494.94,477.56,1,0,0;447.56,511.66,1,0,0;406.71,369.46,1,0,0;478.11,471.18,1,0,0;461.31,523.27,1,0,0;509.14,454.24,1,0,0;476.38,513.44,1,0,0;492.03,459.80,1,0,0;454.53,369.87,0,0,0;438.04,446.02,2,0,0;497.77,396.17,2,0,0;446.45,493.70,2,0,0;469.52,395.87,1,0,0;489.23,343.49,1,0,0;439.53,359.95,0,0,0;538.44,196.55,0,0,0;472.40,367.91,0,0,0;440.12,402.47,0,0,0;585.48,175.67,3,0,0;587.81,193.51,3,0,0;612.70,156.84,3,0,0;444.90,561.16,1,0,0;425.17,560.33,0,0,0;622.39,65.49,2,0,0;702.85,136.41,3,0,0;658.77,143.91,3,0,0;620.64,134.86,3,0,0;673.91,76.89,3,0,0;677.27,94.56,3,0,0;609.02,78.87,3,0,0;639.62,70.67,1,0,0;660.18,100.19,3,0,0;626.53,83.01,3,0,0;657.57,69.37,1,0,0;673.60,112.18,3,0,0;614.20,96.10,3,0,0;641.68,149.52,1,0,0;662.45,126.30,3,0,0;645.35,131.92,3,0,0;649.03,114.30,0,0,0;518.51,13.60,1,0,0;510.66,29.86,1,0,0;576.74,32.68,1,0,0;500.57,14.96,1,0,0;564.96,46.28,3,0,0;596.25,18.89,1,0,0;551.16,2.27,0,0,0;483.20,530.09,1,0,0;506.14,376.70,0,0,0;695.64,97.47,2,0,0;683.87,136.87,2,0,0;691.53,118.12,0,0,0;606.43,112.33,1,0,0;630.32,119.58,1,0,0;635.49,53.16,1,0,0;649.72,85.56,1,0,0;635.96,101.94,0,0,0;566.79,-6.62,1,0,0;579.40,12.57,0,0,0;744.31,309.88,1,0,0;731.51,322.53,0,0,0;477.86,179.21,2,0,0;416.92,138.32,2,0,0;445.11,176.67,2,0,0;446.54,158.74,2,0,0;461.35,168.94,1,0,0;449.41,122.88,1,0,0;512.72,135.61,1,0,0;479.04,143.29,1,0,0;494.28,171.86,1,0,0;461.61,186.92,1,0,0;462.79,151.02,1,0,0;431.72,148.54,1,0,0;430.29,166.46,1,0,0;433.17,130.61,1,0,0;494.01,133.30,1,0,0;447.98,140.81,1,0,0;494.02,153.87,1,0,0;479.20,123.10,1,0,0;477.60,161.22,1,0,0;466.26,110.59,1,0,0;449.20,104.90,1,0,0;432.95,112.62,1,0,0;464.23,133.08,1,0,0;446.42,216.70,0,0,0;406.73,462.12,1,0,0;437.42,420.24,0,0,0;339.32,440.80,1,0,0;368.97,403.85,0,0,0;538.41,111.83,2,0,0;502.17,45.72,1,0,0;572.52,100.46,1,0,0;563.75,70.55,1,0,0;560.13,25.77,1,0,0;550.74,57.31,1,0,0;543.63,18.60,1,0,0;497.68,63.15,1,0,0;533.19,3.21,3,0,0;546.17,37.12,1,0,0;546.49,75.63,1,0,0;530.73,46.36,1,0,0;559.50,88.04,1,0,0;528.60,28.50,1,0,0;580.58,62.74,1,0,0;507.58,93.49,1,0,0;555.25,105.51,1,0,0;576.76,82.98,1,0,0;553.52,123.41,1,0,0;499.74,109.68,1,0,0;493.69,82.06,1,0,0;541.38,94.07,1,0,0;510.53,75.74,1,0,0;523.68,101.52,1,0,0;588.28,46.48,1,0,0;531.10,66.35,0,0,0;572.21,122.55,2,0,0;475.75,80.77,2,0,0;479.69,63.21,2,0,0;558.82,140.61,2,0,0;526.63,83.77,1,0,0;519.87,119.10,0,0,0;515.00,58.31,1,0,0;458.59,59.82,0,0,0;369.23,20.14,2,0,0;410.16,22.07,2,0,0;375.81,43.72,2,0,0;351.25,19.65,2,0,0;400.76,37.40,2,0,0;416.72,45.67,2,0,0;394.61,13.08,2,0,0;425.31,12.36,2,0,0;342.68,3.83,2,0,0;424.88,-6.31,2,0,0;357.76,-29.24,3,0,0;378.64,4.83,1,0,0;415.29,-37.73,3,0,0;408.92,-14.59,1,0,0;326.20,226.58,1,0,0;362.88,75.20,1,0,0;441.28,20.64,1,0,0;359.83,35.47,1,0,0;393.75,-4.89,1,0,0;409.73,3.39,1,0,0;426.12,30.34,1,0,0;370.08,-11.00,1,0,0;341.08,36.44,3,0,0;385.19,28.39,1,0,0;392.93,-22.86,3,0,0;440.47,2.66,1,0,0;375.71,-28.08,3,0,0;360.65,4.32,1,0,0;388.40,85.25,0,0,0;439.08,-43.29,1,0,0;459.23,-32.86,0,0,0;492.19,361.26,2,0,0;518.69,268.95,2,0,0;568.93,286.80,2,0,0;570.85,258.74,2,0,0;525.28,373.21,2,0,0;488.29,253.54,2,0,0;388.22,257.82,2,0,0;506.24,249.22,2,0,0;575.06,241.25,2,0,0;553.27,254.92,2,0,0;517.61,235.27,2,0,0;547.27,236.27,2,0,0;537.28,263.16,2,0,0;545.03,279.39,2,0,0;493.40,321.39,2,0,0;518.33,356.61,2,0,0;500.88,266.39,2,0,0;608.39,249.28,2,0,0;402.20,156.09,2,0,0;626.24,251.55,2,0,0;432.55,329.73,2,0,0;540.47,394.71,2,0,0;593.09,239.82,2,0,0;334.84,264.75,1,0,0;363.24,311.91,1,1,1;316.88,263.62,1,0,0;340.80,237.05,1,0,0;386.14,308.18,1,1,0;487.74,278.68,1,1,0;467.40,334.85,1,0,0;476.62,239.85,1,0,0;445.74,313.41,1,0,0;376.78,243.94,1,0,0;559.52,193.50,1,0,0;377.10,173.58,3,0,0;365.19,230.17,1,0,0;463.98,262.66,1,0,0;554.66,176.18,2,0,0;448.84,252.95,0,0,0;488.28,378.94,3,0,0;541.24,439.01,3,0,0;475.61,318.84,1,0,0;459.53,234.22,1,0,0;394.82,191.27,3,0,0;634.20,219.91,3,0,0;493.50,233.63,1,0,0;599.02,272.08,1,0,0;581.08,273.54,1,0,0;588.78,257.28,1,0,0;518.87,297.73,1,0,0;412.82,191.48,3,0,0;645.74,186.98,3,0,0;513.63,159.77,3,0,0;516.45,217.33,1,0,0;665.57,218.17,3,0,0;656.28,233.58,3,0,0;619.17,280.97,3,0,0;449.55,387.16,1,0,0;422.11,401.93,1,0,0;532.10,245.94,1,0,0;574.58,310.37,3,0,0;542.35,305.54,1,0,0;431.58,386.63,3,0,0;413.60,386.07,1,0,0;374.25,377.81,1,0,0;591.04,288.51,2,0,0;462.68,288.12,0,0,1;310.50,183.26,2,0,0;297.70,195.91,2,0,0;336.10,123.33,2,0,0;275.36,141.65,2,0,0;293.15,178.50,2,0,0;309.24,165.32,2,0,0;280.15,158.98,2,0,0;243.28,208.50,2,0,0;331.59,142.59,2,0,0;349.06,146.86,2,0,0;255.96,221.28,2,0,0;302.10,135.07,2,0,0;296.85,152.29,2,0,0;277.34,111.34,2,0,0;253.25,163.80,2,0,0;229.67,195.91,2,0,0;285.97,127.12,2,0,0;266.73,125.87,2,0,0;280.28,313.19,1,0,0;221.07,374.70,3,0,0;299.81,284.28,1,0,0;325.61,172.75,1,0,0;326.87,190.69,1,0,0;294.48,244.50,1,0,0;266.05,202.18,3,0,0;188.21,203.08,3,0,0;281.51,232.03,1,0,0;282.09,287.45,1,0,0;293.70,301.19,1,0,0;363.19,185.00,1,0,0;343.05,198.59,1,0,0;251.05,192.25,3,0,0;241.00,120.07,3,0,0;286.76,214.82,1,0,0;300.93,117.13,1,0,0;318.05,111.58,1,0,0;359.03,128.39,1,0,0;341.79,180.64,1,0,0;279.88,190.67,3,0,0;318.97,61.95,3,0,0;413.69,114.11,3,0,0;363.46,160.75,1,0,0;250.75,77.96,3,0,0;235.43,87.39,3,0,0;256.42,144.23,3,0,0;373.86,341.99,1,0,0;372.46,359.91,1,0,0;340.53,162.69,1,0,0;364.23,202.96,3,0,0;383.09,216.56,1,0,0;328.12,208.64,3,0,0;309.03,221.20,1,0,0;356.49,368.19,1,0,0;319.22,129.54,2,0,0;356.47,245.88,0,0,0;277.16,249.47,2,0,0;274.03,267.19,2,0,0;240.51,267.88,2,0,0;254.32,256.35,2,0,0;237.42,250.15,2,0,0;257.40,274.07,2,0,0;225.57,213.41,2,0,0;187.11,241.05,2,0,0;219.36,248.78,2,0,0;379.51,324.87,1,0,0;205.63,198.55,3,0,0;292.07,267.12,1,0,0;185.24,266.13,3,0,0;311.39,297.99,1,0,0;201.61,251.70,1,0,0;221.32,230.90,1,0,0;203.58,233.83,1,0,0;238.57,225.84,3,0,0;388.88,367.26,1,0,0;417.52,353.55,1,0,0;329.25,300.16,0,0,0;200.68,216.07,1,0,0;210.15,267.53,1,0,0;169.97,211.77,1,0,0;188.90,178.95,1,0,0;173.74,191.91,1,0,0;251.24,238.62,0,0,0;323.79,91.98,1,0,0;302.26,96.85,1,0,0;290.37,83.34,1,0,0;268.87,69.95,1,0,0;256.56,111.03,1,0,0;275.49,93.45,1,0,0;284.61,61.23,1,0,0;305.98,74.38,1,0,0;314.48,148.12,0,0,0;586.08,218.97,1,0,0;540.68,216.59,1,0,0;516.57,186.62,1,0,0;558.27,220.34,0,0,0;717.19,431.12,1,0,0;702.09,460.31,0,0,0;666.45,444.20,2,0,0;646.14,411.30,2,0,0;640.36,490.18,2,0,0;610.05,482.06,2,0,0;632.00,431.54,2,0,0;622.93,494.61,2,0,0;682.54,436.19,2,0,0;641.80,391.68,2,0,0;629.13,476.12,2,0,0;667.55,426.27,2,0,0;663.93,408.64,2,0,0;649.77,428.91,2,0,0;642.05,463.60,2,0,0;648.68,446.85,2,0,0;677.64,458.27,2,0,0;683.61,418.23,2,0,0;659.84,460.92,2,0,0;658.03,495.01,2,0,0;694.63,389.07,2,0,0;671.02,475.02,2,0,0;653.25,477.67,2,0,0;598.59,455.59,1,0,0;582.62,443.68,1,0,0;589.02,414.35,1,0,0;581.65,461.64,1,0,0;596.76,398.11,1,0,0;622.42,416.33,1,0,0;688.80,472.38,3,0,0;615.90,439.55,1,0,0;682.19,489.13,3,0,0;717.34,413.13,3,0,0;630.91,449.47,1,0,0;699.98,486.48,3,0,0;617.99,461.99,1,0,0;716.13,449.07,3,0,0;699.36,442.54,3,0,0;638.44,269.25,3,0,0;667.70,388.06,1,0,0;680.71,400.48,1,0,0;697.55,406.83,1,0,0;700.43,424.59,1,0,0;599.85,429.90,0,0,0",
  "edges": "104,90,4;104,91,4;104,92,4;104,93,4;104,94,4;104,95,4;104,96,4;104,97,4;104,98,4;104,99,4;104,100,4;104,101,4;104,102,4;104,103,4;16,0,4;16,1,4;16,2,4;16,3,4;16,4,4;16,5,4;16,6,4;16,7,4;16,8,4;16,9,4;16,10,4;16,11,4;16,12,4;16,13,4;16,14,4;16,15,4;235,219,4;222,221,4;235,226,4;226,223,4;226,225,4;235,229,4;229,228,4;235,232,4;232,231,4;242,236,4;242,237,4;242,238,4;242,239,4;242,241,4;244,243,4;87,86,4;282,281,4;89,88,4;142,139,4;142,140,4;142,141,4;159,143,4;159,144,4;159,145,4;159,146,4;159,147,4;159,148,4;159,150,4;150,149,4;159,151,4;159,152,4;159,153,4;159,154,4;159,155,4;159,157,4;157,156,4;159,158,4;85,71,4;85,72,4;85,73,4;85,74,4;85,75,4;85,76,4;85,77,4;85,78,4;85,79,4;85,80,4;85,81,4;85,82,4;85,83,4;85,84,4;204,182,4;204,183,4;204,184,4;204,185,4;204,186,4;204,187,4;204,188,4;204,189,4;204,190,4;204,191,4;204,192,4;204,193,4;204,194,4;204,195,4;204,196,4;204,197,4;204,198,4;204,199,4;204,200,4;204,201,4;204,202,4;204,203,4;67,52,4;67,53,4;67,54,4;67,55,4;67,56,4;67,57,4;67,58,4;67,59,4;67,60,4;67,61,4;67,62,4;67,63,4;67,64,4;67,65,4;67,66,4;70,68,4;70,69,4;51,17,4;51,18,4;51,19,4;51,20,4;51,21,4;51,22,4;51,23,4;51,24,4;51,25,4;51,26,4;51,27,4;51,28,4;51,29,4;51,30,4;51,31,4;51,32,4;51,33,4;51,34,4;51,35,4;51,36,4;51,37,4;51,38,4;51,39,4;51,40,4;51,41,4;51,42,4;51,43,4;51,44,4;51,45,4;51,46,4;51,47,4;51,48,4;51,49,4;51,50,4;218,217,4;216,214,4;216,215,4;247,245,4;247,246,4;115,105,4;115,106,4;115,107,4;115,108,4;115,109,4;115,110,4;115,111,4;115,112,4;115,113,4;115,114,4;284,283,4;129,127,4;129,128,4;210,205,4;210,206,4;210,207,4;210,208,4;210,209,4;498,493,4;498,494,4;498,495,4;498,496,4;498,497,4;507,499,4;507,500,4;507,501,4;507,502,4;507,503,4;507,504,4;507,505,4;507,506,4;511,508,4;511,509,4;511,510,4;492,472,4;492,473,4;492,474,4;492,475,4;492,476,4;492,477,4;492,478,4;492,479,4;492,480,4;492,481,4;492,483,4;483,482,4;492,485,4;485,484,4;492,486,4;492,487,4;492,488,4;492,490,4;490,489,4;492,491,4;416,350,4;416,351,4;416,352,4;416,353,4;416,354,4;416,355,4;416,357,4;416,358,4;416,359,4;416,360,4;416,361,4;416,363,4;416,365,4;416,366,4;416,367,4;416,368,4;416,369,4;416,370,4;416,371,4;416,372,4;416,374,4;416,377,4;416,378,4;416,379,4;416,380,4;416,382,4;416,385,4;385,384,4;416,391,4;391,389,4;391,390,4;416,392,4;416,395,4;395,393,4;395,394,4;416,396,4;416,397,4;416,398,4;416,399,4;416,403,4;403,400,4;403,401,4;403,402,4;416,407,4;407,406,4;406,404,4;406,405,4;416,408,4;416,409,4;416,411,4;411,410,4;416,413,4;413,412,4;416,414,4;416,415,4;471,417,4;471,418,4;471,419,4;471,420,4;471,421,4;471,422,4;471,423,4;471,424,4;471,425,4;471,426,4;471,427,4;471,428,4;471,429,4;471,430,4;471,431,4;471,432,4;471,433,4;471,434,4;471,435,4;471,437,4;437,436,4;471,438,4;471,439,4;471,440,4;471,443,4;443,441,4;443,442,4;471,444,4;471,445,4;471,446,4;471,447,4;471,450,4;450,448,4;450,449,4;471,451,4;471,452,4;471,453,4;471,454,4;471,458,4;458,455,4;458,456,4;458,457,4;471,462,4;462,461,4;461,459,4;461,460,4;471,463,4;471,464,4;471,466,4;466,465,4;471,468,4;468,467,4;471,469,4;471,470,4;513,512,4;555,514,4;555,515,4;555,516,4;555,517,4;555,518,4;555,519,4;555,520,4;555,521,4;555,522,4;555,523,4;555,524,4;555,525,4;555,526,4;555,527,4;555,528,4;555,529,4;555,530,4;555,531,4;555,532,4;555,533,4;555,534,4;555,535,4;555,536,4;555,537,4;555,538,4;555,539,4;555,540,4;555,542,4;542,541,4;555,545,4;545,543,4;545,544,4;555,547,4;547,546,4;555,551,4;551,548,4;551,549,4;551,550,4;555,552,4;555,553,4;555,554,4;388,356,4;388,360,4;388,362,4;388,364,4;388,366,4;388,370,4;388,373,4;388,375,4;388,376,4;388,378,4;388,381,4;388,383,4;388,386,4;388,387,4;181,172,4;181,173,4;181,174,4;181,175,4;181,176,4;181,177,4;181,178,4;181,179,4;181,180,4;252,248,4;252,249,4;252,250,4;252,251,4;310,285,4;310,286,4;310,287,4;310,288,4;310,289,4;310,290,4;310,291,4;310,292,4;310,294,4;294,293,4;310,295,4;310,296,4;310,297,4;310,298,4;310,299,4;310,300,4;310,301,4;310,302,4;310,303,4;310,304,4;310,305,4;310,306,4;310,307,4;310,308,4;310,309,4;124,116,4;124,117,4;124,118,4;124,119,4;124,120,4;124,121,4;124,122,4;124,123,4;254,253,4;161,160,4;164,163,4;347,319,4;347,320,4;347,321,4;347,322,4;347,323,4;347,324,4;347,325,4;347,326,4;347,327,4;347,328,4;347,330,4;330,329,4;347,332,4;332,331,4;347,333,4;347,334,4;347,335,4;347,336,4;347,337,4;347,338,4;347,339,4;347,340,4;347,342,4;342,341,4;347,344,4;344,343,4;347,346,4;346,345,4;349,348,4;316,311,4;316,312,4;316,313,4;316,314,4;316,315,4;318,317,4;256,255,4;280,257,4;280,258,4;280,259,4;280,260,4;280,261,4;280,262,4;280,263,4;280,264,4;280,265,4;280,266,4;280,267,4;280,268,4;280,269,4;280,270,4;280,271,4;280,272,4;280,273,4;280,274,4;280,275,4;280,276,4;280,277,4;280,278,4;280,279,4;171,166,4;171,167,4;171,168,4;171,170,4;138,130,4;138,131,4;138,132,4;138,133,4;138,134,4;138,135,4;138,136,4;138,137,4;92,95,0;93,281,0;93,115,1;94,110,0;94,90,1;95,96,0;95,243,0;97,111,0;97,90,1;98,112,0;98,102,0;98,92,0;98,97,0;99,113,0;99,103,0;99,92,0;99,97,0;100,114,0;100,103,0;101,97,0;101,90,2;101,107,4;101,107,0;101,107,1;104,244,3;104,244,1;104,115,3;104,115,1;104,282,3;104,282,1;2,1,1;3,7,0;4,178,0;5,88,0;5,115,1;6,110,0;6,1,1;6,2,0;7,8,0;7,86,0;9,111,0;9,1,1;9,2,0;10,112,0;10,14,0;10,3,0;10,9,0;11,113,0;11,15,0;11,3,0;11,9,0;12,114,0;12,15,0;13,1,1;13,2,0;13,9,0;13,107,4;13,107,0;13,107,1;14,1,1;14,2,0;15,1,1;15,2,0;16,181,3;16,181,1;16,87,3;16,87,1;16,115,3;16,115,1;16,89,3;16,89,1;220,245,4;220,245,0;220,247,1;222,248,0;222,252,1;221,249,0;221,252,1;221,246,4;221,246,0;221,247,1;221,251,0;223,245,4;223,245,0;223,247,1;226,248,0;226,252,1;225,249,0;225,252,1;224,249,0;224,252,1;224,246,4;224,246,0;224,247,1;224,251,0;225,250,0;229,252,1;228,249,0;228,252,1;227,249,0;227,252,1;227,246,4;227,246,0;227,247,1;227,251,0;228,250,0;232,252,1;231,249,0;231,252,1;230,249,0;230,252,1;230,246,4;230,246,0;230,247,1;230,251,0;231,250,0;233,246,4;233,246,0;233,247,1;233,252,1;234,246,4;234,246,0;234,247,1;234,252,1;236,291,0;236,289,0;236,310,1;237,291,0;237,310,1;238,291,0;238,310,1;239,291,0;239,310,1;240,291,0;240,309,0;240,310,1;87,181,3;87,181,1;281,283,0;281,284,1;282,284,3;282,284,1;88,283,0;88,284,1;89,181,3;89,181,1;89,284,3;89,284,1;140,150,0;140,159,1;141,147,0;141,159,1;142,161,3;142,161,1;147,255,0;147,256,1;148,255,0;148,256,2;150,148,0;150,125,1;149,158,0;149,232,0;149,235,1;151,255,0;151,256,1;152,255,0;152,256,2;153,151,0;153,125,1;153,152,0;154,255,0;154,256,1;155,255,0;155,256,2;155,162,0;155,162,1;157,155,0;157,125,1;156,158,0;156,232,0;156,162,0;156,162,1;156,235,1;72,71,1;73,72,1;78,88,0;78,283,0;78,126,1;78,284,1;78,89,1;79,72,1;79,73,0;79,71,1;79,80,0;81,72,1;81,73,0;81,80,0;81,71,0;81,71,1;82,72,1;82,73,0;83,72,1;83,73,0;83,80,0;83,71,0;83,71,1;84,72,1;84,73,0;85,181,3;85,181,1;85,126,3;85,126,1;85,89,3;85,89,1;204,280,1;183,281,0;183,283,0;183,210,1;183,213,1;183,282,1;183,284,1;184,208,0;184,182,1;185,203,0;186,243,0;187,203,0;187,193,0;188,202,0;188,243,0;190,195,0;190,243,0;191,190,0;191,217,0;191,243,0;191,218,1;194,189,0;194,193,0;195,192,0;195,205,4;195,205,0;195,205,1;196,195,0;197,196,0;197,217,0;197,243,0;197,218,1;198,195,0;199,195,0;200,199,0;200,217,0;200,243,0;200,218,1;202,207,4;202,207,0;202,207,1;203,192,0;204,244,3;204,244,1;204,282,3;204,282,1;204,210,3;204,210,1;204,213,3;204,213,1;204,138,3;204,138,1;53,52,1;56,178,0;57,21,0;57,283,0;57,212,1;57,284,1;57,51,1;58,52,1;58,53,0;59,52,1;59,53,0;60,52,1;60,53,0;61,40,0;62,52,1;62,53,0;62,22,0;63,52,1;63,53,0;64,52,1;64,53,0;64,22,0;65,52,1;65,53,0;66,39,0;67,181,3;67,181,1;67,51,3;67,51,1;67,212,3;67,212,1;68,178,0;69,21,0;69,78,0;69,51,1;69,85,1;70,181,3;70,181,1;70,85,3;70,85,1;70,51,3;70,51,1;51,280,1;18,17,1;19,20,0;19,178,0;20,17,1;20,18,0;20,178,0;21,88,0;21,283,0;21,210,1;21,213,1;21,89,1;21,284,1;22,208,0;22,17,1;22,18,0;23,50,0;24,17,1;24,18,0;25,17,1;25,18,0;26,50,0;26,27,0;28,47,0;28,86,0;29,50,0;29,36,0;30,49,0;30,86,0;31,17,1;31,18,0;32,40,0;32,86,0;33,209,0;33,34,0;34,32,0;34,217,0;34,86,0;34,218,1;35,17,1;35,18,0;36,17,1;36,18,0;37,31,0;37,36,0;39,17,1;39,18,0;40,17,1;40,18,0;40,35,0;40,205,4;40,205,0;40,205,1;41,40,0;42,43,0;43,41,0;43,217,0;43,86,0;43,218,1;44,40,0;45,40,0;46,45,0;46,217,0;46,86,0;46,218,1;47,48,0;48,17,1;48,18,0;49,17,1;49,18,0;49,207,4;49,207,0;49,207,1;50,35,0;51,181,3;51,181,1;51,87,3;51,87,1;51,89,3;51,89,1;51,210,3;51,210,1;51,213,3;51,213,1;51,138,3;51,138,1;214,211,1;214,134,4;214,134,0;214,138,1;215,134,4;215,134,0;215,138,1;216,211,0;216,211,1;126,284,3;126,284,1;129,284,3;129,284,1;129,210,3;129,210,1;210,284,3;210,284,1;212,210,3;212,210,1;213,210,3;213,210,1;481,102,0;481,91,1;481,472,1;481,473,2;481,204,4;481,204,1;483,493,0;482,475,1;482,478,4;482,478,0;482,478,1;483,473,2;483,474,2;483,475,2;483,476,4;483,476,0;483,476,1;483,92,0;483,472,1;485,494,0;485,475,1;484,479,4;484,479,0;484,479,1;485,475,2;485,474,2;485,198,0;485,477,4;485,477,0;485,477,1;485,92,0;485,91,1;486,495,0;486,475,1;487,496,0;487,475,1;488,497,0;488,474,1;490,195,0;490,192,0;489,480,4;489,480,0;489,480,1;491,93,0;491,183,0;491,204,1;491,104,1;492,204,3;492,204,1;492,104,3;492,104,1;492,498,3;492,498,1;416,280,1;374,179,0;377,19,0;377,56,0;377,4,0;377,14,0;377,0,1;377,350,1;377,351,1;377,355,2;377,176,0;378,353,1;378,353,2;378,363,4;378,363,0;378,363,1;378,3,0;378,0,1;379,354,1;379,354,2;379,365,4;379,365,0;379,365,1;379,3,0;379,0,1;380,359,2;380,360,2;380,366,4;380,366,0;380,366,1;380,3,0;380,0,1;382,355,2;382,128,4;382,128,0;382,128,1;382,3,0;382,0,1;384,35,0;384,368,4;384,368,0;384,368,1;385,357,2;385,127,4;385,127,0;385,127,1;385,3,0;385,0,1;389,354,1;389,370,4;389,370,0;389,370,1;390,354,1;390,371,4;390,371,0;390,371,1;391,42,0;391,357,2;391,261,0;391,3,0;391,350,1;392,453,0;392,44,0;392,3,0;392,351,1;393,35,0;393,368,4;393,368,0;393,368,1;394,358,1;394,372,4;394,372,0;394,372,1;395,358,2;395,361,4;395,361,0;395,361,1;395,3,0;395,0,1;396,358,1;399,35,0;403,26,0;400,35,0;400,368,4;400,368,0;400,368,1;403,357,1;403,409,0;402,261,0;403,261,0;407,40,0;407,61,0;407,35,0;406,358,1;404,353,1;404,369,4;404,369,0;404,369,1;405,353,1;405,367,4;405,367,0;405,367,1;407,51,1;407,67,1;408,39,0;408,66,0;408,51,1;408,67,1;409,27,0;409,355,1;411,24,0;410,359,1;410,24,0;413,25,0;412,360,1;412,25,0;414,5,0;414,21,0;414,57,0;414,283,0;414,51,1;414,67,1;414,16,1;414,284,1;416,181,3;416,181,1;416,51,3;416,51,1;416,67,3;416,67,1;416,16,3;416,16,1;416,129,3;416,129,1;471,280,1;435,179,0;437,19,0;437,56,0;437,68,0;437,4,0;437,14,0;437,0,1;437,417,1;437,418,1;437,421,2;436,81,0;437,176,0;438,504,0;438,420,1;438,420,2;438,428,4;438,428,0;438,428,1;438,3,0;438,0,1;439,425,2;439,426,2;439,429,4;439,429,0;439,429,1;439,3,0;439,0,1;440,421,2;440,128,4;440,128,0;440,128,1;440,3,0;440,0,1;441,35,0;441,431,4;441,431,0;441,431,1;442,424,1;442,432,4;442,432,0;442,432,1;443,422,2;443,127,4;443,127,0;443,127,1;443,3,0;443,0,1;444,81,0;444,3,0;444,0,1;445,83,0;445,3,0;445,0,1;446,499,0;446,42,0;446,422,2;446,261,0;446,3,0;446,417,1;447,500,0;447,44,0;447,3,0;447,418,1;450,503,0;448,35,0;448,431,4;448,431,0;448,431,1;449,423,1;449,433,4;449,433,0;449,433,1;450,423,2;450,424,2;450,427,4;450,427,0;450,427,1;450,127,4;450,127,0;450,127,1;450,3,0;450,0,1;451,502,0;451,423,1;452,505,0;453,506,0;454,501,0;454,35,0;458,26,0;455,35,0;455,431,4;455,431,0;455,431,1;458,422,1;458,464,0;457,261,0;458,261,0;462,40,0;462,61,0;462,35,0;461,423,1;459,420,1;459,434,4;459,434,0;459,434,1;460,420,1;460,430,4;460,430,0;460,430,1;462,51,1;462,67,1;463,39,0;463,66,0;463,51,1;463,67,1;464,27,0;464,421,1;466,24,0;465,425,1;465,24,0;468,25,0;467,426,1;467,25,0;469,5,0;469,21,0;469,57,0;469,69,0;469,283,0;469,51,1;469,67,1;469,70,1;469,16,1;469,284,1;471,181,3;471,181,1;471,51,3;471,51,1;471,67,3;471,67,1;471,70,3;471,70,1;471,16,3;471,16,1;471,129,3;471,129,1;471,507,3;471,507,1;515,514,1;523,515,1;531,514,1;535,102,0;535,91,1;535,525,1;535,516,2;535,517,2;535,518,2;535,519,2;535,521,2;536,517,2;536,92,0;536,91,1;537,518,2;537,92,0;537,91,1;538,519,2;538,92,0;538,91,1;539,521,2;539,92,0;539,91,1;540,522,2;540,515,1;540,523,1;540,514,1;540,526,4;540,526,0;540,526,1;540,92,0;540,525,1;542,515,1;542,523,1;541,514,1;541,514,4;541,531,0;541,531,1;542,527,4;542,527,0;542,527,1;542,92,0;542,525,1;545,515,1;545,523,1;543,514,1;543,514,4;543,531,0;543,531,1;544,532,4;544,532,0;544,532,1;545,514,1;545,512,0;545,518,1;545,517,1;545,520,1;545,519,1;545,513,0;545,516,1;545,513,1;545,524,2;545,528,4;545,528,0;545,528,1;545,92,0;545,525,1;547,515,1;547,523,1;546,514,1;546,514,4;546,531,0;546,531,1;547,514,1;547,530,4;547,530,0;547,530,1;547,92,0;547,525,1;548,516,1;548,533,4;548,533,0;548,533,1;551,524,1;549,534,4;549,534,0;549,534,1;551,515,1;551,523,1;551,514,1;551,529,4;551,529,0;551,529,1;550,508,0;550,511,0;550,521,1;550,511,1;552,523,1;553,523,1;554,523,1;554,514,1;555,104,3;555,104,1;366,179,0;370,4,0;370,14,0;370,0,1;370,176,0;373,14,0;373,356,1;373,3,0;373,0,1;375,15,0;375,356,1;375,374,0;375,3,0;375,0,1;376,510,0;376,6,0;376,356,1;376,0,1;378,508,0;378,209,0;378,210,0;378,210,1;378,362,4;378,362,0;378,362,1;378,356,1;381,509,0;381,212,1;381,212,0;381,209,0;381,210,0;381,210,1;381,208,0;381,364,4;381,364,0;381,364,1;381,3,0;381,0,1;383,360,1;383,211,1;386,5,0;386,211,1;386,16,1;388,181,3;388,181,1;388,211,3;388,211,1;388,16,3;388,16,1;388,511,3;388,511,1;176,172,1;176,180,0;177,172,1;177,180,0;177,175,4;177,175,0;177,175,1;179,172,1;179,180,0;180,172,1;286,315,0;286,316,1;287,315,0;287,316,1;288,315,0;288,316,1;289,286,0;289,290,0;290,315,0;290,316,1;291,290,0;292,315,0;292,316,1;293,253,0;293,290,0;293,254,1;295,294,0;295,315,0;295,308,0;295,316,1;295,285,1;297,296,0;297,315,0;297,308,0;297,316,1;297,285,1;298,290,0;300,315,0;300,316,1;301,300,0;301,315,0;301,308,0;301,316,1;301,285,1;302,315,0;302,316,1;303,302,0;303,315,0;303,308,0;303,316,1;303,285,1;305,304,0;305,315,0;305,308,0;305,316,1;305,285,1;306,315,0;306,316,1;307,306,0;307,315,0;307,308,0;307,316,1;307,285,1;308,285,1;309,290,0;309,302,0;120,123,0;122,123,0;122,121,0;123,116,1;123,116,2;123,119,4;123,119,0;123,119,1;124,244,3;124,244,1;163,121,0;163,165,1;164,124,3;164,124,1;329,319,1;329,327,4;329,327,0;329,327,1;331,320,1;331,319,1;331,328,4;331,328,0;331,328,1;333,179,0;334,319,2;334,321,2;334,322,2;334,323,2;334,176,0;335,320,2;335,324,4;335,324,0;335,324,1;335,330,0;336,320,2;336,325,4;336,325,0;336,325,1;336,330,0;337,321,2;337,322,2;337,323,2;337,326,4;337,326,0;337,326,1;337,330,0;338,319,2;338,330,0;339,321,1;339,332,0;340,322,1;340,332,0;341,321,1;341,453,0;341,322,1;342,332,0;343,321,1;343,322,1;344,348,0;344,323,1;344,349,0;344,349,1;344,332,0;346,323,1;345,321,1;345,322,1;346,332,0;347,181,3;347,181,1;317,315,0;317,316,1;280,316,1;261,304,0;261,310,1;262,261,0;262,318,1;263,264,0;263,306,0;263,310,1;264,257,1;265,264,0;266,267,0;267,268,0;268,277,0;268,278,0;269,270,0;270,271,0;271,315,0;271,267,0;272,273,0;273,274,0;274,278,0;274,315,0;274,277,0;275,276,0;276,278,0;276,315,0;165,125,3;165,125,1;167,164,0;167,164,1;167,153,0;167,168,0;167,159,1;167,142,4;167,142,1;169,165,1;169,170,0;169,166,4;169,166,0;169,166,1;170,150,0;170,159,1;171,142,3;171,142,1",
  "diffs": [{
    "label": "setVault()",
    "detail": "Change one authorization condition",
    "file": "src/core/ImprintProv.sol",
    "node": 378
  }, {
    "label": "mint()",
    "detail": "Change two validation lines",
    "file": "src/core/ImprintProv.sol",
    "node": 391
  }, {
    "label": "supportsInterface()",
    "detail": "Change one return branch",
    "file": "src/core/ImprintRWA.sol",
    "node": 469
  }]
};

export const GraphBlastRadius = ({data}) => {
  const graph = useMemo(() => {
    const nodes = data.nodes.split(";").map((row, index) => {
      const [x, y, kind, finding, scope] = row.split(",").map(Number);
      return {
        index,
        x,
        y,
        kind,
        finding: finding === 1,
        scope: scope === 1
      };
    });
    const edges = data.edges.split(";").map(row => {
      const [source, target, kind] = row.split(",").map(Number);
      return {
        source,
        target,
        kind
      };
    });
    const degree = new Array(nodes.length).fill(0);
    const outgoing = Array.from({
      length: nodes.length
    }, () => []);
    edges.forEach(edge => {
      degree[edge.source] += 1;
      degree[edge.target] += 1;
      outgoing[edge.source].push(edge.target);
    });
    return {
      nodes,
      edges,
      degree,
      outgoing
    };
  }, [data]);
  const impacts = useMemo(() => data.diffs.map(diff => {
    const affected = new Set([diff.node]);
    const queue = [diff.node];
    while (queue.length) {
      const current = queue.shift();
      graph.outgoing[current].forEach(target => {
        if (!affected.has(target)) {
          affected.add(target);
          queue.push(target);
        }
      });
    }
    return affected;
  }), [data, graph]);
  const diffOrder = [2, 1, 0];
  const [selectedDiff, setSelectedDiff] = useState(2);
  const [view, setView] = useState("affected");
  const affected = impacts[selectedDiff];
  const selected = data.diffs[selectedDiff];
  const maxDegree = Math.max(...graph.degree);
  const nodeRadius = index => 2.8 + Math.sqrt(graph.degree[index] / Math.max(maxDegree, 1)) * 5.7;
  const nodeColors = ["#f8fafc", "#34d399", "#a78bfa", "#94a3b8"];
  const edgeColors = ["#2dd4bf", "#a78bfa", "#a78bfa", "#fbbf24", "#475569"];
  const diffVisuals = [{
    hunk: "@@ -72,1 +72,2 @@ setVault",
    additions: 2,
    deletions: 1,
    lines: [{
      type: "remove",
      old: 72,
      text: "vault = newVault;"
    }, {
      type: "add",
      next: 72,
      text: "require(newVault != address(0), \"zero vault\");"
    }, {
      type: "add",
      next: 73,
      text: "vault = newVault;"
    }]
  }, {
    hunk: "@@ -118,1 +118,1 @@ mint",
    additions: 1,
    deletions: 1,
    lines: [{
      type: "remove",
      old: 118,
      text: "_mint(to, tokenId);"
    }, {
      type: "add",
      next: 118,
      text: "_safeMint(to, tokenId, data);"
    }]
  }, {
    hunk: "@@ -184,1 +184,2 @@ supportsInterface",
    additions: 2,
    deletions: 1,
    lines: [{
      type: "remove",
      old: 184,
      text: "return super.supportsInterface(interfaceId);"
    }, {
      type: "add",
      next: 184,
      text: "return interfaceId == type(IERC721).interfaceId"
    }, {
      type: "add",
      next: 185,
      text: "    || super.supportsInterface(interfaceId);"
    }]
  }];
  const selectedVisual = diffVisuals[selectedDiff];
  return <div className="my-7">
      <div className="mb-2 flex flex-wrap gap-2" role="tablist" aria-label="Example code diffs">
        {diffOrder.map(index => {
    const diff = data.diffs[index];
    return <button key={diff.label} type="button" onClick={() => {
      setSelectedDiff(index);
      setView("affected");
    }} role="tab" aria-selected={selectedDiff === index} className={`rounded-md border px-3 py-2 text-left transition-colors ${selectedDiff === index ? "border-blue-400 bg-blue-950 text-white" : "border-white/10 bg-black text-zinc-400 hover:border-white/25 hover:text-white"}`}>
            <code className="text-xs text-blue-200">{diff.label}</code>
            <span className="ml-2 text-xs text-zinc-500">{impacts[index].size} affected</span>
          </button>;
  })}
      </div>

      <div className="mb-3 overflow-hidden rounded-lg border border-white/15 bg-black" role="tabpanel">
        <div className="flex flex-wrap items-center justify-between gap-2 border-b border-white/15 bg-zinc-950 px-3 py-2">
          <div className="flex min-w-0 items-center gap-2">
            <span className="text-zinc-500">⌄</span>
            <code className="truncate text-xs text-zinc-300">{selected.file}</code>
          </div>
          <div className="flex items-center gap-2 font-mono text-xs">
            <span className="text-emerald-400">+{selectedVisual.additions}</span>
            <span className="text-red-400">-{selectedVisual.deletions}</span>
            <span className="flex gap-0.5" aria-hidden="true">
              {Array.from({
    length: selectedVisual.additions
  }).map((_, index) => <span key={`add-${index}`} className="h-2 w-2 bg-emerald-600" />)}
              {Array.from({
    length: selectedVisual.deletions
  }).map((_, index) => <span key={`remove-${index}`} className="h-2 w-2 bg-red-600" />)}
              <span className="h-2 w-2 bg-zinc-700" />
            </span>
          </div>
        </div>
        <div className="border-b border-blue-900 bg-blue-950 px-3 py-1.5 font-mono text-xs text-blue-300">
          {selectedVisual.hunk}
        </div>
        <div className="overflow-x-auto font-mono text-xs">
          {selectedVisual.lines.map((line, index) => {
    const added = line.type === "add";
    return <div key={`${line.type}-${index}`} className="grid min-w-max" style={{
      gridTemplateColumns: "2.25rem 2.25rem 1.5rem minmax(32rem, 1fr)",
      backgroundColor: added ? "rgba(46,160,67,0.16)" : "rgba(248,81,73,0.16)"
    }}>
                <span className="border-r border-white/10 px-2 py-1 text-right text-zinc-600">{line.old || ""}</span>
                <span className="border-r border-white/10 px-2 py-1 text-right text-zinc-600">{line.next || ""}</span>
                <span className={`px-2 py-1 ${added ? "text-emerald-400" : "text-red-400"}`}>{added ? "+" : "-"}</span>
                <code className="whitespace-pre px-1 py-1 text-zinc-300">{line.text}</code>
              </div>;
  })}
        </div>
        <div className="flex items-center justify-between border-t border-white/10 px-3 py-2 text-xs">
          <span className="text-zinc-500">{selected.detail}</span>
          <span className="text-zinc-300">→ {affected.size} affected nodes</span>
        </div>
      </div>

      <div className="overflow-hidden rounded-2xl border border-white/10 bg-black text-zinc-200">
        <div className="flex items-center justify-between border-b border-white/10 px-4 py-3 text-xs text-zinc-500">
          <span>⌘   581 nodes   1397 edges</span>
          <div className="flex items-center gap-5">
            <span>‹/› Code</span>
            <span className="text-white">⌘ Graph</span>
          </div>
        </div>

        <div className="relative w-full bg-black" style={{
    aspectRatio: "920 / 520"
  }}>
          <svg viewBox="0 0 920 560" className="h-full w-full" role="img" aria-labelledby="graph-title graph-description">
            <title id="graph-title">Impact of the selected code diff across the product code graph</title>
            <desc id="graph-description">
              The selected small diff affects {affected.size} connected code entities. Affected nodes are colored and the rest of the graph is muted.
            </desc>
            <rect width="920" height="560" fill="#000" />
            <g transform={data.transform}>
              {graph.edges.map((edge, index) => {
    const source = graph.nodes[edge.source];
    const target = graph.nodes[edge.target];
    const isAffected = affected.has(edge.source) && affected.has(edge.target);
    const midpointX = (source.x + target.x) / 2;
    const midpointY = (source.y + target.y) / 2;
    const controlX = midpointX + (460 - midpointX) * 0.12;
    const controlY = midpointY + (280 - midpointY) * 0.12;
    return <path key={index} d={`M${source.x},${source.y} Q${controlX},${controlY} ${target.x},${target.y}`} fill="none" stroke={isAffected ? edgeColors[edge.kind] : "#475569"} strokeOpacity={isAffected ? 0.64 : view === "all" ? 0.25 : 0.1} strokeWidth={isAffected ? 0.9 : 0.65} vectorEffect="non-scaling-stroke" />;
  })}

              {graph.nodes.map(node => {
    const isAffected = affected.has(node.index);
    const visible = view === "all" || isAffected;
    const fill = node.finding ? "#ef4444" : node.scope ? "#22d3ee" : visible ? nodeColors[node.kind] : node.kind === 0 ? "#525761" : "#292d35";
    return <circle key={node.index} cx={node.x} cy={node.y} r={nodeRadius(node.index)} fill={fill} stroke={node.finding ? "#fecaca" : node.scope ? "#cffafe" : visible ? "#f8fafc" : "#535965"} strokeOpacity={node.finding || node.scope ? 0.9 : visible ? 0.35 : 0.2} strokeWidth={node.finding ? 1.4 : 0.7} />;
  })}
            </g>
          </svg>

          <div className="absolute left-3 top-3 flex items-center gap-3 rounded-lg border border-white/20 bg-black/90 px-3 py-2 text-xs text-zinc-500 shadow-xl backdrop-blur sm:left-4 sm:top-4 sm:px-4">
            <span className="hidden sm:inline">% Scopes reused</span>
            <span className="text-base text-blue-300">98%</span>
            <span className="ml-1 text-base text-white">3</span>
            <span>Findings</span>
          </div>

          <div className="absolute bottom-3 left-3 w-1/2 rounded-lg border border-white/20 bg-black/95 px-3 py-2 shadow-xl backdrop-blur sm:bottom-4 sm:left-4 sm:px-4 sm:py-3">
            <div className="flex items-center gap-2.5">
              <span className="h-2.5 w-2.5 shrink-0 rounded-full bg-white" />
              <span className="truncate text-sm text-white sm:text-base">{selected.label}</span>
            </div>
            <p className="mt-1 truncate font-mono text-xs text-zinc-600">{selected.file}</p>
          </div>

          <div className="absolute bottom-3 right-3 flex overflow-hidden rounded-lg border border-white/15 bg-black/90 font-mono text-xs text-zinc-500 sm:bottom-4 sm:right-4">
            {["affected", "all"].map(option => <button key={option} type="button" onClick={() => setView(option)} aria-pressed={view === option} className={`px-3 py-2 ${view === option ? "bg-cyan-950 text-cyan-100" : "border-l border-white/10 hover:text-zinc-300"}`}>
                {option === "affected" ? "Affected" : "All code"}
              </button>)}
          </div>
        </div>
      </div>

      <p className="mt-3 text-sm text-zinc-500" aria-live="polite">
        A small change to <code>{selected.label}</code> expands to {affected.size} connected nodes before analysis begins.
      </p>
    </div>;
};

<Warning>
  Graph-native analysis is coming soon. The explorer previews how it works.
</Warning>

# Catch what the diff misses

A diff shows changed lines. Bevor follows semantic relationships to reveal what those changes can affect.

<GraphBlastRadius data={productGraphData} />

Select a small diff to reveal its downstream blast radius. Toggle **All code** for the surrounding context.

## What the graph represents

<CardGroup cols={2}>
  <Card title="Nodes are code entities" icon="circle-nodes">
    Contracts, functions, modifiers, interfaces, storage, errors, and other meaningful program elements become addressable entities.
  </Card>

  <Card title="Edges carry meaning" icon="arrow-right-arrow-left">
    Calls, reads, writes, inheritance, guards, and other relationships explain how behavior moves through the codebase.
  </Card>
</CardGroup>

Starting from changed symbols, Bevor expands across semantic edges to form the analysis scope. Relevant findings and prior decisions stay attached to that context across versions.

<Info>
  The explorer uses a small curated Solidity graph to make the relationship model legible. Production graphs can contain thousands of nodes and edges, clustered by code structure and analysis context.
</Info>

<Card title="See security posture over time" icon="chart-line" href="/features/project-analytics">
  See how findings and remediations form a measurable trajectory.
</Card>
