[{"data":1,"prerenderedAt":597},["ShallowReactive",2],{"navigation_docs":3,"trending-repo-martin-olivier\u002Fairgorah":249,"page-views-\u002Ftrending\u002Fmartin-olivier\u002Fairgorah":595},[4,29,104,124,194],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Start",false,"\u002Fstart","1.start",[10,14,19,24],{"title":11,"path":7,"stem":12,"icon":13},"What jscpd finds","1.start\u002Findex","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Configuration basics","\u002Fstart\u002Fconfiguration","1.start\u002F4.configuration","i-lucide-settings-2",{"title":30,"icon":6,"path":31,"stem":32,"children":33,"page":6},"Guides","\u002Fguides","2.guides",[34,39,44,49,54,59,64,69,74,79,84,89,94,99],{"title":35,"path":36,"stem":37,"icon":38},"Use jscpd in CI","\u002Fguides\u002Fci","2.guides\u002F01.ci","i-lucide-github",{"title":40,"path":41,"stem":42,"icon":43},"Pre-commit hooks","\u002Fguides\u002Fpre-commit","2.guides\u002F02.pre-commit","i-lucide-git-commit",{"title":45,"path":46,"stem":47,"icon":48},"Fail only on new duplication","\u002Fguides\u002Fbaseline","2.guides\u002F03.baseline","i-lucide-git-compare",{"title":50,"path":51,"stem":52,"icon":53},"Monorepos","\u002Fguides\u002Fmonorepos","2.guides\u002F04.monorepos","i-lucide-folder-tree",{"title":55,"path":56,"stem":57,"icon":58},"Cross-format detection","\u002Fguides\u002Fcross-format","2.guides\u002F05.cross-format","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Agents","\u002Fguides\u002Fagents","2.guides\u002F06.agents","i-lucide-cpu",{"title":65,"path":66,"stem":67,"icon":68},"Editors","\u002Fguides\u002Feditors","2.guides\u002F07.editors","i-lucide-code",{"title":70,"path":71,"stem":72,"icon":73},"Duplication over git history","\u002Fguides\u002Fhistory","2.guides\u002F08.history","i-lucide-chart-no-axes-combined",{"title":75,"path":76,"stem":77,"icon":78},"Dashboard and health score","\u002Fguides\u002Fdashboard","2.guides\u002F09.dashboard","i-lucide-layout-dashboard",{"title":80,"path":81,"stem":82,"icon":83},"Dead code","\u002Fguides\u002Fdead-code","2.guides\u002F10.dead-code","i-lucide-ghost",{"title":85,"path":86,"stem":87,"icon":88},"Comparing two codebases","\u002Fguides\u002Fcompare","2.guides\u002F11.compare","i-lucide-git-compare-arrows",{"title":90,"path":91,"stem":92,"icon":93},"Semantic clones","\u002Fguides\u002Fsemantic-clones","2.guides\u002F12.semantic-clones","i-lucide-brain-circuit",{"title":95,"path":96,"stem":97,"icon":98},"Similar functions","\u002Fguides\u002Fsimilarity","2.guides\u002F13.similarity","i-lucide-list-tree",{"title":100,"path":101,"stem":102,"icon":103},"Boundaries","\u002Fguides\u002Fboundaries","2.guides\u002F14.boundaries","i-lucide-fence",{"title":105,"icon":6,"path":106,"stem":107,"children":108,"page":6},"Concepts","\u002Fconcepts","3.concepts",[109,114,119],{"title":110,"path":111,"stem":112,"icon":113},"Types of code clones","\u002Fconcepts\u002Fclone-types","3.concepts\u002F1.clone-types","i-lucide-copy",{"title":115,"path":116,"stem":117,"icon":118},"How detection works","\u002Fconcepts\u002Fhow-detection-works","3.concepts\u002F2.how-detection-works","i-lucide-scan-search",{"title":120,"path":121,"stem":122,"icon":123},"The health score","\u002Fconcepts\u002Fhealth-score","3.concepts\u002F3.health-score","i-lucide-heart-pulse",{"title":125,"icon":6,"path":126,"stem":127,"children":128,"page":6},"Reference","\u002Freference","4.reference",[129,134,139,144,181,186,190],{"title":130,"path":131,"stem":132,"icon":133},"CLI options","\u002Freference\u002Fcli","4.reference\u002F1.cli","i-lucide-terminal",{"title":135,"path":136,"stem":137,"icon":138},"The config file","\u002Freference\u002Fconfig-file","4.reference\u002F2.config-file","i-lucide-settings",{"title":140,"path":141,"stem":142,"icon":143},"Exit codes","\u002Freference\u002Fexit-codes","4.reference\u002F3.exit-codes","i-lucide-log-out",{"title":145,"icon":6,"path":146,"stem":147,"children":148},"Reporters","\u002Freference\u002Freporters","4.reference\u002F4.reporters\u002Findex",[149,151,156,161,166,171,176],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-file-chart-column",{"title":152,"path":153,"stem":154,"icon":155},"HTML reporter","\u002Freference\u002Freporters\u002Fhtml","4.reference\u002F4.reporters\u002F2.html","i-lucide-file-code",{"title":157,"path":158,"stem":159,"icon":160},"JSON reporter","\u002Freference\u002Freporters\u002Fjson","4.reference\u002F4.reporters\u002F3.json","i-lucide-braces",{"title":162,"path":163,"stem":164,"icon":165},"Badge reporter","\u002Freference\u002Freporters\u002Fbadge","4.reference\u002F4.reporters\u002F4.badge","i-lucide-award",{"title":167,"path":168,"stem":169,"icon":170},"SARIF reporter","\u002Freference\u002Freporters\u002Fsarif","4.reference\u002F4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":172,"path":173,"stem":174,"icon":175},"CodeClimate reporter","\u002Freference\u002Freporters\u002Fcodeclimate","4.reference\u002F4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":177,"path":178,"stem":179,"icon":180},"OpenMetrics reporter","\u002Freference\u002Freporters\u002Fopenmetrics","4.reference\u002F4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":182,"path":183,"stem":184,"icon":185},"Supported formats","\u002Freference\u002Fsupported-formats","4.reference\u002F5.supported-formats","i-lucide-languages",{"title":187,"path":188,"stem":189,"icon":38},"GitHub Action","\u002Freference\u002Fgithub-action","4.reference\u002F6.github-action",{"title":191,"path":192,"stem":193,"icon":68},"Rust crates","\u002Freference\u002Frust-crates","4.reference\u002F7.rust-crates",{"title":195,"icon":6,"path":196,"stem":197,"children":198,"page":6},"Project","\u002Fproject","5.project",[199,204,209,214,239,244],{"title":200,"path":201,"stem":202,"icon":203},"Changelog","\u002Fproject\u002Fchangelog","5.project\u002F1.changelog","i-lucide-scroll-text",{"title":205,"path":206,"stem":207,"icon":208},"Migrating from v4 to v5","\u002Fproject\u002Fmigration","5.project\u002F2.migration","i-lucide-arrow-right-left",{"title":210,"path":211,"stem":212,"icon":213},"jscpd v4 (TypeScript)","\u002Fproject\u002Fv4","5.project\u002F3.v4","i-simple-icons-typescript",{"title":215,"icon":6,"path":216,"stem":217,"children":218},"Benchmarks","\u002Fproject\u002Fbenchmarks","5.project\u002F4.benchmarks\u002Findex",[219,221,226,230,235],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-gauge",{"title":222,"path":223,"stem":224,"icon":225},"Detection Speed","\u002Fproject\u002Fbenchmarks\u002Fdetection-speed","5.project\u002F4.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":227,"path":228,"stem":229,"icon":58},"Multi-Format Detection","\u002Fproject\u002Fbenchmarks\u002Fcross-format","5.project\u002F4.benchmarks\u002F3.cross-format",{"title":231,"path":232,"stem":233,"icon":234},"AI Token Efficiency","\u002Fproject\u002Fbenchmarks\u002Fai-token-efficiency","5.project\u002F4.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":236,"path":237,"stem":238,"icon":93},"Embedding Models","\u002Fproject\u002Fbenchmarks\u002Fembedding-models","5.project\u002F4.benchmarks\u002F5.embedding-models",{"title":240,"path":241,"stem":242,"icon":243},"Research","\u002Fproject\u002Fresearch","5.project\u002F5.research","i-lucide-graduation-cap",{"title":245,"path":246,"stem":247,"icon":248},"Articles","\u002Fproject\u002Farticles","5.project\u002F6.articles","i-lucide-newspaper",{"name":250,"url":251,"appearances":252,"latest":268},"martin-olivier\u002Fairgorah","https:\u002F\u002Fgithub.com\u002Fmartin-olivier\u002Fairgorah",[253],{"date":254,"rank":255,"stars":256,"starsToday":257,"headSha":258,"sources":259,"lines":260,"clones":261,"duplicatedLines":262,"percentage":263,"codePercentage":264,"codeSources":265,"healthScore":266,"healthGrade":267},"2026-11-15",11,5986,270,"f5833ff068e7703fac33cc20442e2ceda190c3eb",53,8516,40,445,5.23,5.43,46,64.2,"C",{"date":254,"generatedAt":269,"name":250,"url":251,"description":270,"language":271,"stars":256,"starsToday":257,"defaultBranch":272,"headSha":258,"durationMs":273,"total":274,"formats":278,"topClones":297,"code":456,"health":519,"complexity":547,"deadCode":594},"2026-11-15T05:21:58.194Z","A WiFi security auditing software","Rust","main",843,{"sources":259,"lines":260,"tokens":275,"clones":261,"duplicatedLines":262,"duplicatedTokens":276,"percentage":263,"percentageTokens":277},50234,2864,5.7,[279,282,287,291,294],{"format":280,"sources":265,"lines":281,"clones":261,"duplicatedLines":262,"percentage":264},"rust",8197,{"format":283,"sources":284,"lines":285,"clones":286,"duplicatedLines":286,"percentage":286},"yaml",1,127,0,{"format":288,"sources":289,"lines":290,"clones":286,"duplicatedLines":286,"percentage":286},"toml",4,103,{"format":292,"sources":284,"lines":293,"clones":286,"duplicatedLines":286,"percentage":286},"markdown",58,{"format":295,"sources":284,"lines":296,"clones":286,"duplicatedLines":286,"percentage":286},"docker",31,[298,327,354,379,390,403,413,426,437,449],{"format":280,"lines":299,"tokens":300,"first":301,"others":305,"copies":313,"excerpt":314,"kind":326},15,104,{"name":302,"start":303,"end":304},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Fconnections\u002Fapp.rs",1121,1135,[306,310],{"name":307,"start":308,"end":309},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Fconnections\u002Fscan.rs",109,123,{"name":307,"start":311,"end":312},168,183,3,{"lines":315,"total":299},[316,317,318,319,320,321,322,323,324,325],"file_chooser_dialog.set_current_name(&format!(\"{essid}.cap\"));","file_chooser_dialog.run_async(clone!(","    #[strong]","    app_data,","    move |this, response| {","        this.close();","","        if response == ResponseType::Accept {","            let gio_file = match this.file() {","                Some(file) => file,","code",{"format":280,"lines":328,"tokens":329,"first":330,"others":333,"copies":289,"excerpt":343,"excerptSecond":350,"kind":326},7,51,{"name":302,"start":331,"end":332},577,583,[334,337,340],{"name":302,"start":335,"end":336},1014,1020,{"name":302,"start":338,"end":339},1042,1048,{"name":302,"start":341,"end":342},1080,1086,{"lines":344,"total":328},[345,318,319,346,347,348,349],"app_data.app_gui.previous_but.connect_clicked(clone!(","    move |_| {","        let iter = match app_data.app_gui.aps_view.selection().selected() {","            Some((_, iter)) => iter,","            None => return update_buttons_sensitivity(&app_data),",{"lines":351,"total":328},[352,318,319,346,347,348,353],"app_data.app_gui.deauth_but.connect_clicked(clone!(","            None => return,",{"format":280,"lines":355,"tokens":356,"first":357,"others":361,"copies":313,"excerpt":369,"kind":326},12,72,{"name":358,"start":359,"end":360},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Fconnections\u002Fdecrypt.rs",9,20,[362,365],{"name":363,"start":328,"end":364},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Fconnections\u002Finterface.rs",18,{"name":366,"start":367,"end":368},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Fconnections\u002Fsettings.rs",8,19,{"lines":370,"total":355},[371,372,322,373,374,322,375,376,377,378],"use std::collections::HashSet;","use std::rc::Rc;","fn connect_controller(app_data: Rc\u003CAppData>) {","    let controller = gtk4::EventControllerKey::new();","    controller.connect_key_pressed(clone!(","        #[strong]","        app_data,","        move |_, key, _, _| {",{"format":280,"lines":380,"tokens":381,"first":382,"others":385,"copies":389,"kind":326},23,132,{"name":307,"start":383,"end":384},202,224,[386],{"name":307,"start":387,"end":388},245,267,2,{"format":280,"lines":359,"tokens":391,"first":392,"others":395,"copies":313,"kind":326},60,{"name":302,"start":393,"end":394},149,157,[396,400],{"name":397,"start":398,"end":399},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Fconnections\u002Fdeauth.rs",33,41,{"name":358,"start":401,"end":402},30,38,{"format":280,"lines":404,"tokens":405,"first":406,"others":409,"copies":389,"kind":326},14,114,{"name":302,"start":407,"end":408},900,913,[410],{"name":302,"start":411,"end":412},941,954,{"format":280,"lines":414,"tokens":415,"first":416,"others":419,"copies":313,"kind":326},10,57,{"name":302,"start":417,"end":418},201,210,[420,423],{"name":302,"start":421,"end":422},220,229,{"name":302,"start":424,"end":425},239,248,{"format":280,"lines":414,"tokens":415,"first":427,"others":430,"copies":313,"kind":326},{"name":302,"start":428,"end":429},279,288,[431,434],{"name":302,"start":432,"end":433},298,307,{"name":302,"start":435,"end":436},317,326,{"format":280,"lines":438,"tokens":439,"first":440,"others":444,"copies":389,"kind":326},21,110,{"name":441,"start":442,"end":443},"crates\u002Fagent\u002Fsrc\u002Fbackend\u002Fdeauth.rs",173,193,[445],{"name":446,"start":447,"end":448},"crates\u002Fagent\u002Fsrc\u002Fbackend\u002Fpmkid.rs",310,330,{"format":280,"lines":450,"tokens":439,"first":451,"others":453,"copies":389,"kind":326},17,{"name":302,"start":335,"end":452},1030,[454],{"name":302,"start":338,"end":455},1058,{"sources":265,"lines":281,"tokens":457,"clones":261,"duplicatedLines":262,"duplicatedTokens":276,"percentage":264,"percentageTokens":458,"formats":459,"topClones":461,"generated":517},48223,5.94,[460],{"format":280,"sources":265,"lines":281,"clones":261,"duplicatedLines":262,"percentage":264},[462,469,479,486,490,495,499,504,509,513],{"format":280,"lines":299,"tokens":300,"first":463,"others":464,"copies":313,"excerpt":467,"kind":326},{"name":302,"start":303,"end":304},[465,466],{"name":307,"start":308,"end":309},{"name":307,"start":311,"end":312},{"lines":468,"total":299},[316,317,318,319,320,321,322,323,324,325],{"format":280,"lines":328,"tokens":329,"first":470,"others":471,"copies":289,"excerpt":475,"excerptSecond":477,"kind":326},{"name":302,"start":331,"end":332},[472,473,474],{"name":302,"start":335,"end":336},{"name":302,"start":338,"end":339},{"name":302,"start":341,"end":342},{"lines":476,"total":328},[345,318,319,346,347,348,349],{"lines":478,"total":328},[352,318,319,346,347,348,353],{"format":280,"lines":355,"tokens":356,"first":480,"others":481,"copies":313,"excerpt":484,"kind":326},{"name":358,"start":359,"end":360},[482,483],{"name":363,"start":328,"end":364},{"name":366,"start":367,"end":368},{"lines":485,"total":355},[371,372,322,373,374,322,375,376,377,378],{"format":280,"lines":380,"tokens":381,"first":487,"others":488,"copies":389,"kind":326},{"name":307,"start":383,"end":384},[489],{"name":307,"start":387,"end":388},{"format":280,"lines":359,"tokens":391,"first":491,"others":492,"copies":313,"kind":326},{"name":302,"start":393,"end":394},[493,494],{"name":397,"start":398,"end":399},{"name":358,"start":401,"end":402},{"format":280,"lines":404,"tokens":405,"first":496,"others":497,"copies":389,"kind":326},{"name":302,"start":407,"end":408},[498],{"name":302,"start":411,"end":412},{"format":280,"lines":414,"tokens":415,"first":500,"others":501,"copies":313,"kind":326},{"name":302,"start":417,"end":418},[502,503],{"name":302,"start":421,"end":422},{"name":302,"start":424,"end":425},{"format":280,"lines":414,"tokens":415,"first":505,"others":506,"copies":313,"kind":326},{"name":302,"start":428,"end":429},[507,508],{"name":302,"start":432,"end":433},{"name":302,"start":435,"end":436},{"format":280,"lines":438,"tokens":439,"first":510,"others":511,"copies":389,"kind":326},{"name":441,"start":442,"end":443},[512],{"name":446,"start":447,"end":448},{"format":280,"lines":450,"tokens":439,"first":514,"others":515,"copies":389,"kind":326},{"name":302,"start":335,"end":452},[516],{"name":302,"start":338,"end":455},{"files":286,"minified":286,"sample":518},[],{"score":266,"grade":267,"size":520,"dimensions":524,"skipped":543},{"lines":521,"files":522,"class":523},8228,47,"S",[525,536],{"id":526,"source":527,"value":528,"adjusted":529,"lines":262,"halfLife":530,"formats":531,"excluded":532,"weight":284,"score":535},"duplication","jscpd",5.4,5,8.5,[280,295],[533,534],"text","data",66.3,{"id":537,"source":527,"value":538,"adjusted":539,"lines":540,"halfLife":541,"weight":284,"score":542},"complexity",37.7,34.4,3101,50,62.1,[544],{"id":545,"reason":546},"dead-code","no JavaScript, TypeScript, Python or compiler-checked Rust files",{"total":548,"mean":549,"files":550},945,20.1,[551,555,560,565,570,574,578,581,586,589],{"path":302,"complexity":552,"lines":553,"bytes":554},135,1184,42574,{"path":556,"complexity":557,"lines":558,"bytes":559},"crates\u002Fagent\u002Fsrc\u002Fbackend\u002Fsniffer.rs",93,615,20508,{"path":561,"complexity":562,"lines":563,"bytes":564},"crates\u002Fgui\u002Fsrc\u002Fbackend\u002Fclient.rs",86,504,16386,{"path":566,"complexity":567,"lines":568,"bytes":569},"crates\u002Fcommon\u002Fsrc\u002Fhandshake.rs",70,539,21046,{"path":571,"complexity":541,"lines":572,"bytes":573},"crates\u002Fagent\u002Fsrc\u002Fserver.rs",259,8695,{"path":307,"complexity":575,"lines":576,"bytes":577},48,371,12103,{"path":446,"complexity":265,"lines":579,"bytes":580},382,13824,{"path":582,"complexity":583,"lines":584,"bytes":585},"crates\u002Fagent\u002Fsrc\u002Fbackend\u002Finterface.rs",44,240,6360,{"path":358,"complexity":399,"lines":587,"bytes":588},409,13516,{"path":590,"complexity":591,"lines":592,"bytes":593},"crates\u002Fgui\u002Fsrc\u002Ffrontend\u002Finterfaces\u002Fapp.rs",37,574,17002,null,{"\u002Ftrending\u002Fmartin-olivier\u002Fairgorah":596},{"views":286,"visits":286},1794720259623]