{"version":3,"sources":["images/logo.png","images/facebook.svg","images/twitter.svg","Localization.js","Header/index.js","images/about-background-chords.svg","About/index.js","Links/index.js","images/intro-background-chords.svg","Intro/index.js","mapToNest.js","images/toggle-background-chords.svg","Sankey/index.js","images/arrowdown.svg","images/close.svg","exportSVG.js","SankeyPage/index.js","Footer/index.js","App.js","reportWebVitals.js","index.js"],"names":["localization","process","LanguageContext","createContext","translationMap","translationKeyFromRow","d","section","element","ready","window","fetch","then","value","text","csvParse","forEach","row","key","prepare","log","logOnce","msgs","msg","join","console","localize","language","translationKey","share","site","url","encodeURIComponent","document","location","description","link","open","Header","props","setLanguage","useContext","className","src","logo","alt","to","label","map","onClick","classnames","selected","facebook","twitter","activeClassName","exact","href","target","rel","About","style","backgroundImage","backgroundChords","q","i","Links","summaryColors","xScale","scaleLinear","Intro","totalValue","summaryData","useDimensions","barRef","width","useState","tooltip","setTooltip","bars","useMemo","length","summaryValues","sortBy","pop","wide","innerWidth","adjustedTotal","reduce","a","v","Math","max","scaleWidth","domain","range","group","isLast","background","height","outerWidth","toLowerCase","paddingRight","data-name","toLocaleString","flex","onMouseOut","padding","onMouseMove","e","pageX","pageY","dataset","Object","keys","x","y","ref","marginBottom","marginLeft","marginTop","transform","name","mapToNest","Array","from","values","buildInHandle","hintHandle","defaultBarWidth","vSpace","nudgeX","barWidth","possibleColumns","columnNames","languageColumnTextKeys","ResourceGrant","Activity","colors","reverse","colorScale","scaleQuantile","defaultFontRange","fontScale","clamp","yScale","downloadSVG","event","svg","source","XMLSerializer","serializeToString","svgBlob","Blob","type","svgUrl","URL","createObjectURL","downloadLink","createElement","download","body","appendChild","click","removeChild","exportSVG","currentTarget","generateKey","replace","generateChord","start","end","color","activeTotal","startColor","startName","endName","x0","x1","y0","y1","h0","h1","midX","startX","endX","midY","min","path","Sankey","data","id","scrollRef","useRef","sankeyId","columns","setColumns","drawers","setDrawers","columnData","setColumnData","setHeight","chords","setChords","colorLegendData","setColorLegendData","setSelected","instruction","setInstruction","hintIndex","setHintIndex","displayedHints","setDisplayedHints","builtIn","setBuiltIn","hoverHighlight","setHoverHighlight","subselect","setSubselect","selectedDatum","setSelectedDatum","inlineEverything","hideEverything","filterBySelection","useEffect","narrow","fontRange","current","getBoundingClientRect","top","scrollIntoView","behavior","totalKey","isTwoColumnDuplicate","displayColumns","slice","groupings","c","rightIndex","index","left","right","g","align","groups","push","parent","parentKey","total","filter","selectionKeys","includes","students","perstudent","split","segmentTotals","concat","yExtent","extent","cy","segment","legendColor","fontSize","childKeys","barHeight","selectedBar","parentY","percent","toFixed","centerLeftChords","centerRightChords","leftChordsWidth","leftChords","column","find","cc","rightChords","lastHeight","textAlign","marginRight","translateX","indicatorStyle","filterStyle","clearTimeout","setTimeout","clearHint","clickColumn","useCallback","active","isEverything","preventDefault","stopPropagation","nextColumns","indexOf","p","columnToggles","orderedColumns","order","everythingSelected","copy","arrow","columnSelects","position","columnStyle","zIndex","nextDrawers","j","isNone","splice","hint","hintStates","class","duration","next","hintState","close","chordGradients","offset","stopColor","chordPaths","tooltipNameKey","tooltipParentKey","splitKey","hovered","opacity","native","fill","fillOpacity","stroke","columnGroups","cx","hideDuplicateLabels","segmentSelected","textOpacity","rectOpacity","barType","textType","noSelect","cursor","data-type","data-hoverhighlight","dy","dx","textAnchor","fontWeight","rect","data-subselect","k","l","showPercent","topLabel","bottomLabel","x2","data-parent","data-value","data-perstudent","data-students","data-color","data-h","data-v","colorLegend","groupTotal","orderedColorData","invertExtent","roundedValue","round","displayValue","strokeWidth","y2","fontFamily","h","onTouchEnd","onTouchStart","viewBox","strokeLinecap","onContextMenu","hoverhighlight","SankeyPage","title","sankeyRef","schoolSites","centralSupports","formatCSV","textByLine","headerIndex","findIndex","cleanedText","trim","App","schoolData","setSchoolData","centralData","setCentralData","setSummaryData","setTotalValue","csv","combinedData","Provider","basename","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"4aAAe,MAA0B,iCCA1B,MAA0B,qCCA1B,MAA0B,oCCGnCA,G,MAAY,UAAMC,IAAN,gCAILC,EAAkBC,wBAFZ,WAIbC,EAAiB,GAEjBC,EAAwB,SAAAC,GAC5B,MAAM,GAAN,OAAUA,EAAEC,QAAZ,YAAuBD,EAAEE,UAevBC,GAAQ,EAKZC,OAAOC,MAAMX,GACVY,MAAK,SAAAC,GAAK,OAAIA,EAAMC,UACpBF,MAAK,SAAAE,IAfQ,SAACA,GACMC,YAASD,GACjBE,SAAQ,SAAAC,GACnB,IAAMC,EAAMb,EAAsBY,GAClCb,EAAec,GAAOD,KAYtBE,CAAQL,GACRL,GAAQ,KAGZ,IAAMW,EAAM,GACNC,EAAU,WAAa,IAAC,IAAD,qBAATC,EAAS,yBAATA,EAAS,gBAC3B,IAAIC,EAAMD,EAAKE,KAAK,KAChBJ,EAAIG,KAGRH,EAAIG,IAAO,GACX,EAAAE,SAAQL,IAAR,QAAeE,KAEV,SAASI,EAASC,EAAUpB,EAASC,GAC1C,IAAMU,EAlCe,SAACX,EAASC,GAC/B,OAAOH,EAAsB,CAACE,UAASC,YAiC3BoB,CAAerB,EAASC,GACpC,GAAIJ,EAAec,GAAM,CACvB,GAAId,EAAec,GAAKS,GACtB,OAAOvB,EAAec,GAAKS,GAE3BN,EAAQM,EAAU,qBAAsBpB,EAASC,QAGnDa,EAAQ,wBAAyBd,EAASC,EAASmB,GAErD,MAAM,GAAN,OAAUA,EAAV,YAAsBpB,EAAtB,YAAiCC,GC9CnC,SAASqB,EAAMC,EAAMH,GACnB,IAAMI,EAAMC,mBAAmBC,SAASC,UAClCC,EAAcH,mBAAmBN,EAASC,EAAU,SAAU,YACpE,OAAO,WACL,IAAIS,EAAO,KACX,OAAQN,GACN,IAAK,KAEHM,EAAI,gDAA4CL,GAChD,MACF,IAAK,UACHK,EAAI,+CAA2CL,EAA3C,iBAAuDI,GAC3D,MACF,QACEC,EAAO,KAGE,OAATA,GACF1B,OAAO2B,KAAKD,IAIH,SAASE,EAAOC,GAAQ,IAC7BC,EAAgBD,EAAhBC,YAEFb,EAAWc,qBAAWvC,GAC5B,OACE,sBAAKwC,UAAU,SAAf,UACE,sBAAKA,UAAU,MAAf,UACE,qBAAKA,UAAU,OAAf,SACE,qBAAKC,IAAKC,EAAMC,IAAI,OAEtB,qBAAKH,UAAU,QAAf,SACE,cAAC,IAAD,CAASI,GAAG,IAAZ,SACE,+BACGpB,EAASC,EAAU,SAAU,eAIpC,qBAAKe,UAAU,YAAf,SAfY,CAAC,CAAEK,MAAO,UAAW7B,IAAK,WAAY,CAAC6B,MAAO,aAAW7B,IAAK,YAgB7D8B,KAAI,gBAAED,EAAF,EAAEA,MAAO7B,EAAT,EAASA,IAAT,OACb,qBAAe+B,QAAS,kBAAMT,EAAYtB,IAAMwB,UAAWQ,IAAW,WAAY,CAAEC,SAAUxB,IAAaT,IAA3G,SACE,+BAAO6B,KADC7B,QAKd,sBAAKwB,UAAU,UAAf,UACE,qBAAKA,UAAU,SAAf,SACE,qBAAKC,IAAKS,EAAUP,IAAI,WAAWI,QAASpB,EAAM,KAAMF,OAE1D,qBAAKe,UAAU,SAAf,SACE,qBAAKC,IAAKU,EAASR,IAAI,UAAUI,QAASpB,EAAM,UAAWF,aAIjE,sBAAKe,UAAU,SAAf,UACE,sBAAKA,UAAU,eAAf,UACE,qBAAKA,UAAU,SAAf,SACE,cAAC,IAAD,CAASI,GAAG,IAAIQ,gBAAgB,SAASC,OAAK,EAA9C,SACE,+BACG7B,EAASC,EAAU,aAAc,cAIxC,qBAAKe,UAAU,SAAf,SACE,cAAC,IAAD,CACEI,GAAG,oBACHQ,gBAAgB,SAFlB,SAIE,+BACG5B,EAASC,EAAU,sBAAuB,eAIjD,qBAAKe,UAAU,SAAf,SACE,cAAC,IAAD,CACEI,GAAG,0BACHQ,gBAAgB,SAFlB,SAIE,+BACG5B,EAASC,EAAU,6BAA8B,kBAK1D,sBAAKe,UAAU,gBAAf,UACE,qBAAKA,UAAU,SAAf,SACE,mBAAGc,KAAK,uFAAuFC,OAAO,SAASC,IAAI,sBAAnH,SACE,+BACGhC,EAASC,EAAU,aAAc,kBAIxC,qBAAKe,UAAU,SAAf,SACE,cAAC,IAAD,CAASI,GAAG,SAASQ,gBAAgB,SAArC,SACE,+BACG5B,EAASC,EAAU,aAAc,wBC7GnC,UAA0B,oD,MCM1B,SAASgC,IACtB,IAAMhC,EAAWc,qBAAWvC,GAI5B,OACE,qBAAKwC,UAAU,QAAQkB,MAAO,CAAEC,gBAAgB,OAAD,OAASC,EAAT,MAA/C,SACE,sBAAKpB,UAAU,UAAf,UACE,6BACGhB,EAAUC,EAAU,QAAS,WAEhC,4BACGD,EAAUC,EAAU,QAAS,iBAThB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAWjBqB,KAAI,SAACe,EAAGC,GAAJ,OACjB,gCACE,6BAAKtC,EAAUC,EAAU,QAAZ,WAAyBoC,MACtC,4BAAIrC,EAAUC,EAAU,QAAZ,WAAyBoC,QAF7BC,MAMZ,mBAAGtB,UAAU,OAAb,SACGhB,EAASC,EAAU,QAAS,e,0DCtBxB,SAASsC,EAAM1B,GAAQ,IAC5BqB,EAAUrB,EAAVqB,MACFjC,EAAWc,qBAAWvC,GAE5B,OACE,sBAAKwC,UAAU,QAAQkB,MAAOA,EAA9B,UACE,qBAAKlB,UAAU,OAAf,SACE,cAAC,IAAD,CAEEI,GAAG,oBACHQ,gBAAgB,SAHlB,SAKE,qBAAKZ,UAAU,SAAf,SACE,+BACChB,EAASC,EAAU,sBAAuB,cANzC,uBAWR,qBAAKe,UAAU,OAAf,SACE,cAAC,IAAD,CAEEI,GAAG,0BACHQ,gBAAgB,SAHlB,SAKE,qBAAKZ,UAAU,SAAf,SACE,+BACChB,EAASC,EAAU,6BAA8B,cANhD,gCC3BC,UAA0B,oDCanCuC,G,MAAgB,CAAC,UAAW,UAAW,0BAA2B,8BAClEC,EAASC,cAEA,SAASC,EAAM9B,GAAQ,IAC5B+B,EAA4B/B,EAA5B+B,WAAYC,EAAgBhC,EAAhBgC,YADe,EAGPC,cAHO,mBAG5BC,EAH4B,KAGlBC,EAHkB,KAGlBA,MAHkB,EAKLC,qBALK,mBAK5BC,EAL4B,KAKnBC,EALmB,KAO7BlD,EAAWc,qBAAWvC,GAEtB4E,EAAOC,mBAAQ,WACnB,GAAIR,EAAYS,QAAUN,EAAO,CAC/B,IAAMO,EAAgBC,IAAOX,EAAYvB,KAAI,SAAA1C,GAAC,OAAIA,EAAEO,UAAQ,SAAAP,GAAC,OAAKA,KAGlE2E,EAAcE,MACd,IAAMC,EAAO1E,OAAO2E,WAAa,KAC3BC,EAAgBF,EAClBH,EAAcM,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GACtCC,KAAKC,IAAL,MAAAD,KAAI,YAAQT,IAEVW,EAAaR,EACfV,EAAK,IACLA,EAKJ,OAJAP,EACG0B,OAAO,CAAC,EAAGP,IACXQ,MAAM,CAAC,EAAGF,IAENrB,EAAYvB,KAAI,SAAC+C,EAAO/B,GAC7B,IAAMgC,EAAShC,IAAMO,EAAYS,OAAQ,EACnCN,EAAQU,EACVY,EACE7B,EAAO4B,EAAMlF,OACb6E,KAAKC,IAnBI,IAmBUxB,EAAO4B,EAAMlF,QAClCsD,EAAO4B,EAAMlF,OACXoF,EAAa/B,EAAcF,GAC3BkC,EAASd,EACX,MACA,UACEe,EAAaf,EACfY,EA3BW,IA6BTtB,EACF,OAEIxD,EAAM6E,EAAM7E,IAAIkF,cAExB,OACE,sBAAe1D,UAAU,QAAQkB,MAAO,CAAEc,MAAOyB,GAAjD,UACE,qBAAKzD,UAAU,cAAckB,MAAO,CAAEyC,aAAcL,EAAS,EAAI,SAAjE,SACE,+BACGtE,EAASC,EAAU,UAAX,UAAyBT,EAAzB,eAGb,qBAAKwB,UAAU,OAAOkB,MAAO,CAAEc,MAAOyB,GAAtC,SACE,qBAAKzD,UAAU,MAAM4D,YAAWpF,EAAK0C,MAAO,CAAEc,QAAOwB,SAAQD,kBAE/D,qBAAKvD,UAAU,cAAf,SACE,qCACIqD,EAAMlF,MAAM0F,wBAXVrF,MAkBhB,OAAO,OACN,CAACqD,EAAaG,EAAO/C,IAExB,OACE,sBAAKe,UAAU,QAAQkB,MAAO,CAAEC,gBAAgB,OAAD,OAASC,EAAT,MAA/C,UACE,qBAAKpB,UAAU,mBAAf,SACE,qBAAKA,UAAU,gBAAf,SACE,4BACGhB,EAASC,EAAU,UAAW,sBAIrC,sBACEe,UAAU,mBACVkB,MAAO,CAAE4C,KAAM,OAAQP,WAAY,6BACnCQ,WAAY,kBAAM5B,EAAW,OAH/B,UAKE,sBAAKnC,UAAU,UAAf,UACE,qBAAKA,UAAU,aAAf,SAEGhB,EAASC,EAAU,UAAW,WAEjC,sBAAKe,UAAU,aAAf,cACI4B,EAAWiC,uBAGjB,qBACE7D,UAAU,UACVkB,MAAO,CAAE8C,QAAS,GAClBC,YAAa,SAAAC,GAAM,IACTC,EAAyBD,EAAzBC,MAAOC,EAAkBF,EAAlBE,MACPC,EADyBH,EAAXnD,OACdsD,QACJC,OAAOC,KAAKF,GAAS/B,OACvBH,EAAW,aACTqC,EAAGL,EACHM,EAAGL,GACAC,IAGLlC,EAAW,OAbjB,SAiBE,qBACEuC,IAAK3C,EACL/B,UAAU,OAFZ,SAIGoC,MAGL,qBAAKpC,UAAU,gBAAf,SACE,cAACuB,EAAD,CACEL,MAAO,CAAEyD,aAAc,cAK3BzC,EACE,sBACElC,UAAU,UACVkB,MAAO,CACL0D,WAAY1C,EAAQsC,EACpBK,UAAW3C,EAAQuC,EACnBK,UAAU,aAAD,OAAe5C,EAAQsC,EAAIxG,OAAO2E,WAAa,EAAI,QAAU,KAA7D,aALb,UAQE,qBAAK3C,UAAU,WAAf,SACE,qBAAKA,UAAU,QAAf,SACGhB,EAASC,EAAU,UAAX,UAAyBiD,EAAQ6C,KAAjC,eAIb,qBAAK/E,UAAU,MAAf,SACE,qBAAKA,UAAU,QAAf,SACChB,EAASC,EAAU,UAAX,UAAyBiD,EAAQ6C,KAAjC,wBAIX,Q,2BC/JG,SAASC,EAAU1E,GAChC,OAAO2E,MAAMC,KAAK5E,GAAK,yCAAoB,CAAC9B,IAArB,KAA0B2G,OAA1B,SCDV,ICuGXC,EACAC,EDxGW,MAA0B,qDEA1B,MAA0B,sCCA1B,MAA0B,kCF0BjCC,G,MAJW,IAIMC,EAHf,GAGuBC,EAFvB,EAGNC,EAAWH,EAETI,GAAkB,CAAC,yBAA0B,mBAAoB,WAAY,QAC7EC,GAAc,CAClB,qCAAsC,mBACtC,2CAA4C,cAC5C,6BAA8B,WAC9B,yBAA0B,OAC1B,2CAA4C,mBAC5C,iDAAkD,kBAClD,mCAAoC,WACpC,+BAAgC,QAG5BC,GAAyB,CAC7B,qBAAwB,cACxBC,cAAe,mBACfC,SAAU,YAGNC,GAAS,CACb,UACA,UACA,UACA,UACA,WACAC,UACIC,GAAaC,cAAgB9C,MAAM2C,IAEnCI,GAAmB,CAAC,GAAI,IACxBC,GAAY1E,cAAc0B,MAAM+C,IAAkBE,OAAM,GACxDC,GAAS5E,cAAc0B,MAAM,CAAC,EAAG,MAAMiD,OAAM,GAEnD,SAASE,GAAYC,GACnB,OG7Da,SAAmBC,GAGhC,IACIC,GADa,IAAIC,eACGC,kBAAkBH,GAEtCI,EAAU,IAAIC,KAAK,CAACJ,GAAS,CAACK,KAAK,gCACnCC,EAASC,IAAIC,gBAAgBL,GAC7BM,EAAe5H,SAAS6H,cAAc,KAC1CD,EAAarG,KAAOkG,EACpBG,EAAaE,SAAW,YACxB9H,SAAS+H,KAAKC,YAAYJ,GAC1BA,EAAaK,QACbjI,SAAS+H,KAAKG,YAAYN,GHgDnBO,CAAUlB,EAAMmB,eAGlB,SAASC,GAAY7C,GAC1B,OAAOA,EAAK8C,QAAQ,gBAAiB,IAGvC,SAASC,GAAcC,EAAOC,GAAM,IAC1BC,EAA8BD,EAA9BC,MAAO9J,EAAuB6J,EAAvB7J,MAAO+J,EAAgBF,EAAhBE,YAChBC,EAAaJ,EAAME,MACnBG,EAAYL,EAAMhD,KAClBsD,EAAUL,EAAIjD,KACduD,EAAKP,EAAMvD,EACf+D,EAAKP,EAAIxD,EACTgE,EAAKT,EAAMtD,EACXgE,EAAKT,EAAIvD,EACTiE,EAAK1F,KAAKC,IAAI,EAAG8E,EAAMvE,QACvBmF,EAAK3F,KAAKC,IAAI,EAAG+E,EAAIxE,QACrBoF,EAAON,EAAkB,IAAXC,EAAKD,GAErB,MAAO,CACL9J,IAAI,GAAD,OAAKuJ,EAAMvJ,IAAX,YAAkBwJ,EAAIxJ,KACzByJ,QACAE,aACAhK,QACA+J,cACAE,YACAC,UACAQ,OAAQd,EAAMvD,EACdsE,KAAMd,EAAIxD,EACVoE,OACAG,KAAM/F,KAAKgG,IAAIR,EAAIC,IAAQzF,KAAKC,IAAIuF,EAAKE,EAAID,EAAKE,GAAM3F,KAAKgG,IAAIR,EAAIC,IAAO,EAC5EQ,KAAK,eAAD,OACIX,EADJ,YACUE,EADV,uBAEII,EAFJ,YAEYJ,EAFZ,YAEkBI,EAFlB,YAE0BH,EAF1B,YAEgCF,EAFhC,YAEsCE,EAFtC,uBAGIF,EAHJ,YAGUE,EAAKE,EAHf,uBAIIC,EAJJ,YAIYH,EAAKE,EAJjB,YAIuBC,EAJvB,YAI+BJ,EAAKE,EAJpC,YAI0CJ,EAJ1C,YAIgDE,EAAKE,EAJrD,wBAaO,SAASQ,GAAOrJ,GAAQ,IAC7BmC,EAAoBnC,EAApBmC,MAAOmH,EAAatJ,EAAbsJ,KAAMC,EAAOvJ,EAAPuJ,GACfC,EAAYC,mBACZC,EAAW3B,GAAYwB,GAHO,EAKNnH,mBAAS,IALH,mBAK7BuH,EAL6B,KAKpBC,EALoB,OAMNxH,mBAASyD,GAAgBpF,KAAI,SAAA1C,GAAC,OAAI,MAN5B,mBAM7B8L,EAN6B,KAMpBC,EANoB,OAOA1H,mBAAS,IAPT,mBAO7B2H,EAP6B,KAOjBC,EAPiB,OAQR5H,mBAASD,GARD,mBAQ7BwB,EAR6B,KAQrBsG,EARqB,OASR7H,mBAAS,IATD,mBAS7B8H,EAT6B,KASrBC,EATqB,OAUU/H,mBAAS,IAVnB,mBAU7BgI,EAV6B,KAUZC,EAVY,OAWJjI,qBAXI,mBAW7BxB,GAX6B,KAWnB0J,GAXmB,QAYElI,qBAZF,qBAY7BmI,GAZ6B,MAYhBC,GAZgB,SAaNpI,qBAbM,qBAa7BC,GAb6B,MAapBC,GAboB,SAcFF,mBAAS,GAdP,qBAc7BqI,GAd6B,MAclBC,GAdkB,SAeQtI,mBAAS,IAfjB,qBAe7BuI,GAf6B,MAebC,GAfa,SAgBNxI,oBAAS,GAhBH,qBAgB7ByI,GAhB6B,MAgBpBC,GAhBoB,SAkBQ1I,qBAlBR,qBAkB7B2I,GAlB6B,MAkBbC,GAlBa,SAmBF5I,qBAnBE,qBAmB7B6I,GAnB6B,MAmBlBC,GAnBkB,SAoBM9I,qBApBN,qBAoB7B+I,GApB6B,MAoBdC,GApBc,MAyB9BC,IAAmB,EACnBC,IAAiB,EACjBC,IAAoB,EAKpBnM,GAAWc,qBAAWvC,GAE5B6N,qBAAU,WACR,GAAIlC,EAAK7G,QAAUN,EAAO,CAGxB,IAAIsJ,GAAS,EACTC,EAAYpF,GAChBV,EAAWH,EACPtH,OAAO2E,YAAc,OACvB8C,EAAW,GACX8F,EAAY,CAAC,EAAG,IACZvN,OAAO2E,YAAc,MAEvB4I,EAAY,CAAC,EAAG,IAChBD,GAAS,IAIGjC,EAAUmC,QAAQC,wBAA1BC,IACE,GACRrC,EAAUmC,QAAQG,eAAe,CAAEC,SAAU,WAG/C,IAAMC,EAAW,cAEXC,EAA0C,IAAnBtC,EAAQlH,OAC/ByJ,EAAiBD,EACnB,CAACtC,EAAQ,GAAIA,EAAQ,IACrBA,EAAQwC,QAERC,EAAYF,EACbzL,KAAI,SAAC4L,EAAG5K,GACP,IACM6K,EAAa7K,EAAI,EACvB,MAAO,CACL8K,MAAO9K,EACPyD,KAAMmH,EACNG,KAAMN,EALUzK,EAAI,GAMpBgL,MAAOP,EAAeI,OAGzB7L,KAAI,SAAA4L,GAiHH,OAhHAA,EAAE1N,IAAMoJ,GAAYsE,EAAEnH,MACtBmH,EAAE/C,KAAO3G,IACPwC,EAAU3B,YAAM8F,GAAM,SAAAvL,GAAC,OAAIA,EAAEsO,EAAEnH,UAC5BzE,KAAI,SAAAiM,GAIH,GAHAA,EAAExH,KAAOwH,EAAE/N,IACX+N,EAAE/N,IAAMoJ,GAAY2E,EAAE/N,KACtB+N,EAAE/C,QAAU,GACR0C,EAAEG,KAAM,CACVE,EAAEC,MAAQ,MACVD,EAAExF,KAAO,OACT,IAAM0F,EAASzH,EAAU3B,YAAMkJ,EAAEpH,QAAQ,SAAAvH,GAAC,OAAIA,EAAEsO,EAAEG,UAMlDE,EAAE/C,QAAQkD,KACR,CACE3F,KAAM,OACNyF,MAAO,MACPC,OAAQjK,IAENiK,EACCnM,KAAI,SAAA1C,GACHA,EAAEmH,KAAOnH,EAAEY,IACXZ,EAAEY,IAAMoJ,GAAYhK,EAAEY,KACtBZ,EAAE+O,OAASJ,EAAE/N,IACbZ,EAAEgP,UAAYhF,GAAYsE,EAAEG,MAE5BzO,EAAEiP,MAAQjP,EAAEuH,OAAO7E,KAAI,SAAAyC,GAAC,OAAIA,EAAE8I,MAAWhJ,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GACjEnF,EAAEsK,YAA2CtK,EAAEuH,OAI5C2H,QAAO,SAAA/J,GAAC,OACLtC,IAEMsC,EAAEgK,cAAcC,SAASvM,OAIlCH,KAAI,SAAAyC,GAAC,OAAIA,EAAE8I,MACXhJ,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAnBnB,MAoBWnF,EAAEuH,OAAO7E,KAAI,SAAAyC,GAAC,OAAIA,EAAE,sBAAhCkK,EApBC,oBAwBR,OAHArP,EAAEqP,UAAYA,EAASpJ,iBAEvBjG,EAAEsP,WAAF,YAAoBtP,EAAEsK,YAActK,EAAEqP,UAAUpJ,iBAAiBsJ,MAAM,KAAK,IACrEvP,KAGT,eAAeoI,YAIvB,GAAIkG,EAAEI,MAAO,CACXC,EAAEC,MAAQ,QACVD,EAAExF,KAAO,QACT,IAAM0F,EAASzH,EAAU3B,YAAMkJ,EAAEpH,QAAQ,SAAAvH,GAAC,OAAIA,EAAEsO,EAAEI,WAGlDC,EAAE/C,QAAQkD,KACR,CACE3F,KAAM,QACNyF,MAAO,QACPC,OAAQjK,IAENiK,EACCnM,KAAI,SAAA1C,GACHA,EAAEmH,KAAOnH,EAAEY,IACXZ,EAAEY,IAAMoJ,GAAYhK,EAAEY,KACtBZ,EAAE+O,OAASJ,EAAE/N,IACbZ,EAAEgP,UAAYhF,GAAYsE,EAAEI,OAE5B1O,EAAEiP,MAAQjP,EAAEuH,OAAO7E,KAAI,SAAAyC,GAAC,OAAIA,EAAE8I,MAAWhJ,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GACjEnF,EAAEsK,YAA2CtK,EAAEuH,OAI5C2H,QAAO,SAAA/J,GAAC,OACLtC,IAEMsC,EAAEgK,cAAcC,SAASvM,OAIlCH,KAAI,SAAAyC,GAAC,OAAIA,EAAE8I,MACXhJ,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAnBnB,MAoBWnF,EAAEuH,OAAO7E,KAAI,SAAAyC,GAAC,OAAIA,EAAE,sBAAhCkK,EApBC,oBAwBR,OAHArP,EAAEqP,UAAYA,EAASpJ,iBAEvBjG,EAAEsP,WAAF,YAAoBtP,EAAEsK,YAActK,EAAEqP,UAAUpJ,iBAAiBsJ,MAAM,KAAK,IACrEvP,KAGT,eAAeoI,YAcvB,OAVIkG,EAAEG,MAAQH,EAAEI,QACdC,EAAEC,MAAQ,SACVD,EAAExF,KAAO,UAEXwF,EAAEM,MAAQN,EAAE/C,QAAQ,GAAGiD,OAAOnM,KAAI,SAAA1C,GAAC,OAAIA,EAAEiP,SAAOhK,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAExEwJ,EAAErE,YAAclF,KAAKC,IACnBsJ,EAAE/C,QAAQ,GAAK+C,EAAE/C,QAAQ,GAAGiD,OAAOnM,KAAI,SAAA1C,GAAC,OAAIA,EAAEsK,eAAarF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAAK,EACxFwJ,EAAE/C,QAAQ,GAAK+C,EAAE/C,QAAQ,GAAGiD,OAAOnM,KAAI,SAAA1C,GAAC,OAAIA,EAAEsK,eAAarF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAAK,GAEnFwJ,KAGX,eAAevG,UACVkG,KAGLkB,EAAgB5K,IACpByJ,EACG3L,KAAI,SAAAiM,GAAC,OAAIA,EAAEpD,KAAK7I,KAAI,SAAA1C,GAAC,OAAIA,EAAEiP,YAE3BhK,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,KAGnCkD,GAAW9C,OAAOiK,GAElB,IAAME,EAAUC,YAAOtB,EACpB3L,KAAI,SAAAiM,GAAC,OAAIA,EAAEpD,KACT7I,KAAI,SAAA1C,GAAC,OAAIA,EAAE4L,QAAQlJ,KAAI,SAAA4L,GAAC,OAAIA,EAAEO,OAAOnM,KAAI,SAAAyC,GAAC,OAAIA,EAAE8J,YAAQhK,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,OAEtFF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,OAChCF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,KACjCuD,GAAOnD,OAAO,CAAC,EAAGmK,EAAQ,KAE1BlH,GACGjD,OAAO,CAAC,EAAGmK,EAAQ,KACnBlK,MAAMmI,GAETU,EAAYA,EAAU3L,KAAI,SAAA4L,GACxB,IAAIsB,EAAKlC,EACI,EAAT/F,EACAA,EAuDJ,OApDA2G,EAAE/C,KAAO+C,EAAE/C,KAAK7I,KAAI,SAAAmN,GAGlBA,EAAQxF,MAAQhC,GAAWwH,EAAQvF,aACnCuF,EAAQC,YAAczH,GAAWwH,EAAQZ,OACzCY,EAAQE,SAAWvH,GAAUqH,EAAQvF,aACrCuF,EAAQhJ,EAAI+I,EACZC,EAAQG,UAAYH,EAAQjE,QACzBlJ,KAAI,SAAA4L,GAAC,OAAIA,EAAEO,OAAOnM,KAAI,SAAA+C,GAAK,OAAIA,EAAM7E,UACrCqE,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,IAEjC,IAAM0B,EAAI,CAAC,EAAG,GAuCd,OAtCAgJ,EAAQjE,QAAQlJ,KAAI,SAAC4L,EAAG5K,GAAJ,OAAW4K,EAAEO,OAAOnM,KAAI,SAAAiM,GAE1C,IAAMsB,EAAYvH,GAAOiG,EAAErE,aAC3BqE,EAAE9H,EAAIA,EAAEnD,GAER,IAAMwM,EAEgB,IAAlBvB,EAAErE,YAcN,OAXAqE,EAAEsB,UAAYC,EAAcD,EAAY,EAExCtB,EAAEoB,SAAWvH,GAAUmG,EAAErE,aACzBqE,EAAE/I,OAASsK,EAAc9K,KAAKC,IAAIsJ,EAAEsB,UAAWtB,EAAEoB,UAAY,EAC7DpB,EAAEwB,QAAUN,EAAQhJ,EACpB8H,EAAEtE,MAAQwF,EAAQxF,MAGlBsE,EAAEpO,MAAF,WAAcoO,EAAErE,YAAYrE,kBAC5B0I,EAAEyB,QAAF,WAAgBzB,EAAErE,YAAcuF,EAAQvF,YAAc,KAAK+F,QAAQ,GAAnE,KACAxJ,EAAEnD,IAAMiL,EAAE/I,OACH+I,QAGTkB,EAAQjK,OAASR,KAAKC,IAAL,MAAAD,KAAYyB,GAC7B+I,GAAMC,EAAQjK,OAEdgK,GAA2C,IAAnBC,EAAQjK,OAC5B,EACA8H,EACqB,EAAnBmC,EAAQE,SACW,EAAnBF,EAAQE,SAKdF,EAAQnC,OAASA,EAEVmC,KAEFvB,KAGT,IAAMjC,EAAkBjF,EAAU3B,YAChC4I,EACG3L,KAAI,SAAAiM,GAAC,OAAIA,EAAEpD,QACXtG,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,KAC/B,SAAAnF,GAAC,OAAIA,EAAE8P,gBACXxD,EAAmBD,GAWnB,IAAMiE,EAAmBjC,EAAU,GAC/BA,EAAU,GAAG9C,KAAK7I,KAAI,SAAAmN,GACpB,OAAOA,EAAQjE,QAAQ,GACnBiE,EAAQjE,QAAQ,GAAGiD,OAAOnM,KAAI,SAAA+C,GAC9B,OAAOA,KAEP,MACHR,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,IACjC,GAEEoL,EAAoBlC,EAAU,GAChCA,EAAU,GAAG9C,KAAK7I,KAAI,SAAAmN,GACpB,OAAOA,EAAQjE,QAAQ,GACnBiE,EAAQjE,QAAQ,GAAGiD,OAAOnM,KAAI,SAAA+C,GAC9B,OAAOA,KAEP,MACHR,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,IACjC,GAEEqL,EAAuC,IAArBnC,EAAU3J,OAC9BN,EAAQ,EAAIyD,EACZqG,EACE,EACA9J,EAAQyD,EAER4I,EAAapC,EAAU,GACzBA,EAAU,GAAG9C,KAAK7I,KAAI,SAAAmN,GACpB,OAAOA,EAAQjE,QAAQlJ,KAAI,SAAAgO,GACzB,OAAOA,EAAO7B,OAAOnM,KAAI,SAAA+C,GACvB,OAAOA,QAERR,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,OAChCF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,IAChCzC,KAAI,SAAAyH,GAEH,IAAMC,EAAMkG,EAAiBK,MAAK,SAAAC,GAAE,OAAIA,EAAG7B,SAAW5E,EAAMvJ,KAAOgQ,EAAGhQ,MAAQuJ,EAAM4E,UACpF,OAAO7E,GAAc,2BAEdC,GAFa,IAGhBvD,EAAGiB,EACHhB,EAAGsD,EAAMtD,EAAIsD,EAAMgG,UAJH,YAAC,eAOd/F,GAPa,IAQhBxD,EAAG4J,EACH3J,EAAGuD,EAAIvD,EAAIuD,EAAI+F,cAGlB/H,UACH,GAEEyI,EAAcxC,EAAU,GAC1BA,EAAU,GAAG9C,KAAK7I,KAAI,SAAAmN,GACpB,OAAOA,EAAQjE,QAAQlJ,KAAI,SAAAgO,GACzB,OAAOA,EAAO7B,OAAOnM,KAAI,SAAA+C,GACvB,OAAOA,QAERR,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,OAChCF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,IAChCzC,KAAI,SAAAyH,GAEH,IAAMC,EAAMmG,EAAkBI,MAAK,SAAAC,GAAE,OAAIA,EAAG7B,SAAW5E,EAAMvJ,KAAOgQ,EAAGhQ,MAAQuJ,EAAM4E,UACrF,OAAO7E,GAAc,2BAEdE,GAFa,IAGhBxD,EAAGxC,EAAQ,EAAIyD,EACfhB,EAAGuD,EAAIvD,EAAIuD,EAAI+F,UAJC,YAAC,eAOdhG,GAPa,IAQhBvD,EAAGxC,EAAQyD,EACXhB,EAAGsD,EAAMtD,EAAIsD,EAAMgG,cAGtB/H,UACH,GAEJgE,EAAUqE,EAAWhB,OAAOoB,IAC5B,IAAMjL,EAASyI,EAAU3J,OACrBU,KAAKC,IAAL,MAAAD,KAAI,YAAQiJ,EAAU3L,KAAI,SAAAiM,GAAC,OAAIA,EAAEpD,KAAK7I,KAAI,SAAA1C,GAAC,OAAIA,EAAE4F,OAAS5F,EAAE+P,UAAYrC,EAAS,EAAI,MAAIzI,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,QAAiB,EAATwC,EACzH,EACJuE,GAAU,SAAA4E,GAAU,OAAe,IAAXlL,GAAgBA,EAASkL,EAAalL,EAASkL,KACvE7E,EAAcoC,GAEd,IAAMjB,EAAgBvK,GAClBwL,EAAU3L,KAAI,SAAAiM,GAAC,OAAIA,EAAEpD,QAAMtG,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAEuK,OAAOtK,KAAI,IAAIwL,MAAK,SAAA3Q,GAAC,OAAIA,EAAEY,MAAQiC,MACjF,KAEJ,GAAIuK,EAAe,CACjB,IAAI2D,EAAY,OACZ/J,EAAa,EACbgK,EAAc,OACdC,EAAa,EACU,WAAvB7D,EAAcjE,MAChBnC,EAAa,OACb+J,EAAY,SACZE,EAAa,KACmB,SAAvB7D,EAAcjE,OACvB6H,EAAc,EACdhK,EAAa,OACb+J,EAAY,QACZE,EAAa,KAGf7D,EAAc8D,eAAiB,CAC7B9M,MAAOA,EAAQ,EACf8C,UAAU,cAAD,OAAgB+J,EAAhB,OAEX7D,EAAc+D,YAAa,CACzBnK,aACAgK,cACAD,aAGJ1D,GAAiBD,GAGjBgE,aAAa5J,GACRsF,IAAYlB,EAAQlH,SACvB8C,EAAgB6J,YAAW,WACzBxF,EAAW,CAAC/D,GAAgB,KAC5B6E,GAAa,GACbI,IAAW,KACV,SAIN,CAAC3I,EAAOmH,EAAMK,EAAS/I,GAAUiK,GAASQ,GAAkBC,GAAgBL,GAAWM,KAG1F,IAAM8D,GAAY7M,mBAAQ,kBACxB,WACMiI,IACFG,IAAkB,SAAAD,GAAc,OAC9BA,EAAewC,SAAS1C,IACpBE,EACAA,EAAe6C,OAAO/C,OAG9BC,GAAa,MAEd,CAACD,KAEE6E,GAAcC,uBAAY,SAAClD,EAAGmD,EAAQC,GAAZ,OAA6B,SAAA9I,GAC3DA,EAAM+I,iBACN/I,EAAMgJ,kBACN,IAAIC,EAAcjG,EAAQwC,QACtBqD,EACFI,EAAcA,EAAY3C,QAAO,SAAAlP,GAAC,OAAIA,IAAMsO,KACnCoD,EACTG,EAAcjN,IAAOkD,IAAiB,SAAAwG,GACpC,IAAME,EAAQ5C,EAAQkG,QAAQxD,GAC9B,OAAOE,GAAS,EAAIA,EAAQ1G,GAAgBpD,UAC3CwK,QAAO,SAAA6C,GAAC,MAAU,SAANA,KAEfF,EAAY/C,KAAKR,GAEf,CAAC,EAAG,EAAG,GAAGc,SAASyC,EAAYnN,SAC7BgI,IACFG,IAAkB,SAAAD,GAAc,OAC9BA,EAAewC,SAAS1C,IACpBE,EACAA,EAAe6C,OAAO/C,OAG9BC,GAAakF,EAAYnN,SAEzB4M,KAEFzF,EAAWgG,GACXtF,GAAY,MACZY,GAAa,SAEb,CAACmE,GAAW1F,EAASc,KACjBsF,GAAgBvN,mBAAQ,WAC5B,IAAMwN,EAAiBrN,IAAOkD,IAAiB,SAAAwG,GAC7C,IAAME,EAAQ5C,EAAQkG,QAAQxD,GAC9B,OAAOE,GAAS,EAAIA,EAAQ1G,GAAgBpD,UAE9C,OACE,qBAAKtC,UAAU,0BAA0BkB,MAAO,CAAEC,gBAAgB,OAAD,OAASC,EAAT,MAAjE,SACGsE,GACEpF,KAAI,SAAC4L,EAAG5K,GACP,IAAMwO,EAAQD,EAAeH,QAAQxD,GAC/BoD,EAAqB,SAANpD,EACf6D,GAAsBrK,GACzBoH,QAAO,SAAA6C,GAAC,MAAU,SAANA,KACZrP,KAAI,SAAAqP,GAAC,OAAInG,EAAQwD,SAAS2C,MAC1B3C,UAAS,GACNqC,EAAS7F,EAAQwD,SAASd,IAAOoD,GAAgBS,EACjD1P,EACFrB,EAASC,GAAU,gBADTqQ,EAC0B,mBAC5B,UAA+B3J,GAAY,GAAD,OAAIuG,EAAJ,YAAS3C,IAAnD,WACNyG,EACFhR,EAASC,GAAU,gBADVqQ,EAC2B,yBAC5B,UAA+B3J,GAAY,GAAD,OAAIuG,EAAJ,YAAS3C,IAAnD,iBAEZ,OACE,qBAEEvJ,UAAU,WACVkB,MAAO,CAAE4D,UAAU,cAAD,QAAiB,IAAMxD,EAAvB,OAHpB,SAKE,qBACEtB,UAAU,eACVkB,MAAO,CAAE4D,UAAU,cAAD,OAAwB,IAARgL,EAAhB,OAFpB,SAIE,qBACE9P,UAAS,aAAQqP,EAAS,UAAY,IAEtC9O,QAAS4O,GAAYjD,EAAGmD,EAAQC,GAHlC,SAKE,sBAAKtP,UAAU,WAAf,UACE,sBAAKA,UAAU,UAAf,UACE,+BACGK,IAEH,qBAAKJ,IAAKgQ,EAAO9P,IAAI,QAEvB,qBAAKH,UAAU,UAAf,SACE,+BACGgQ,cAtBNpI,GAAYsE,WAkC5B,CAAC1C,EAASD,EAAUtK,GAAUkQ,KAE3Be,GAAgB7N,mBAAQ,WAC5B,OACE,qBAAKrC,UAAU,kBAAf,SACGwJ,EAAQ6D,OAAO3H,IAAiBsG,MAAM,EAAG,GAAG1L,KAAI,SAAC4L,EAAG5K,GACnD,IAAIJ,EAAQ,CAAE,OAAU,UACd,IAANI,EACFJ,EAAQ,CAAE0N,YAAa,QACdtN,IAAOkI,EAAQlH,OAAS,IACjCpB,EAAQ,CAAE0D,WAAY,SAGxB,IAAIuL,EAAW7O,EACXA,GAAKkI,EAAQlH,OACf6N,EAAiB,IAAN7O,GACN,EACDoE,GAAgBpD,OACXkH,EAAQlH,OAAS,IAC1B6N,EAAW,GAEb,IAAMC,EAAc,CAClBtL,UAAU,cAAD,OAA2B,IAAXqL,EAAhB,MACTE,OAAQ,EAAI/O,GAGd,OACE,qBAAatB,UAAU,iBAAiBkB,MAAOkP,EAA/C,SACE,sBAAKpQ,UAAU,WAAWkB,MAAOA,EAAjC,UACE,sBACElB,UAAU,QACVO,QAAS,WACPoJ,GAAW,SAAAD,GACT,IAAM4G,EAAc5G,EAAQsC,QAE5B,OADAsE,EAAYhP,IAAMgP,EAAYhP,GACvBgP,MANb,UAUE,+BACGtR,EAASC,GAAU,gBAAX,UAA+B0G,GAAY,GAAD,OAAIuG,EAAJ,YAAS3C,IAAnD,aAEX,qBAAKtJ,IAAKgQ,EAAO9P,IAAI,QAEvB,qBAAKH,UAAS,iBAAY0J,EAAQpI,GAAK,OAAS,UAAhD,SACGoE,GAAgBpF,KAAI,SAAC1C,EAAG2S,GAAJ,OAAU3S,IAAMsO,EAAI,KACvC,qBAEElM,UAAU,SACVO,QAAS,WACP,IAAMiQ,EAAe,SAAN5S,EACX6R,EAAcjG,EAAQwC,QACtBwE,GACFtB,KACAO,EAAYgB,OAAOnP,EAAG,IAEtBmO,EAAYnO,GAAK1D,EAEnB6L,EAAWgG,GACX9F,EAAWD,EAAQpJ,KAAI,SAAA1C,GAAC,OAAI,MAC5BuM,GAAY,MACZY,GAAa,OAfjB,SAkBE,+BACGpF,GAAY,GAAD,OAAI/H,EAAJ,YAAS2L,OAlBlBgH,YApBLjP,UAiDjB,CAACkI,EAASE,EAASH,EAAU2F,GAAWjQ,KAErCyR,GAAOrO,mBAAQ,WACnB,IAAMsO,EAAa,CACjB,CACEX,KAAM,GACNY,MAAO,SACPC,SAAU,KACVC,KAAM,MAER,CACEd,KACE,iCAEiB,YAAb/Q,GACE,0SACA,wWAEJ,sBAAMsB,QAAS4O,GAAY,oBAAoB,GAAO,GAAQnP,UAAU,eAAxE,SACgB,YAAbf,GAAyB,cAAgB,4BAE9B,YAAbA,GAAyB,OAAS,MACnC,sBAAMsB,QAAS4O,GAAY,YAAY,GAAO,GAAQnP,UAAU,eAAhE,SACgB,YAAbf,GAAyB,aAAe,mBAI/C2R,MAAO,OACPC,SAAU,KAEVC,KAAM,GAER,CACEd,KAAMhR,EAASC,GAAU,gBAAiB,eAC1C2R,MAAO,OACPC,SAAU,IACVC,KAAM,GAER,CACEd,KAAMhR,EAASC,GAAU,gBAAiB,gBAC1C2R,MAAO,QACPC,SAAU,IACVC,KAAM,IAGJC,EAAYvG,GAAewC,SAAS1C,IACtCqG,EAAW,GACXA,EAAWrG,IAYf,OAVA0E,aAAa3J,GACT0L,EAAUF,WACZxL,EAAa4J,YAAW,WACjBzE,GAAewC,SAAS1C,KAC3BG,GAAkBD,GAAe6C,OAAO/C,KAE1CC,GAAawG,EAAUD,QACtBC,EAAUF,WAIb,sBACE7Q,UAAS,eAAU+Q,EAAUH,OAC7BrQ,QAAS2O,GAFX,UAIE,qBAAKlP,UAAU,QAAf,SACE,qBAAKC,IAAK+Q,EAAO7Q,IAAI,QAEvB,sBAAsBH,UAAS,YAAOsK,IAAtC,SACGyG,EAAUf,MADF1F,SAKd,CAACA,GAAWE,GAAgB0E,GAAWjQ,GAAUkQ,KA6B9C8B,GAAiB5O,mBAAQ,kBAC7B0H,EAAOzJ,KAAI,SAAC4L,EAAG5K,GAAJ,OACT,iCAEE8H,GAAI8C,EAAE1N,IAFR,UAIE,sBAAM0S,OAAO,KAAKC,UAAWjF,EAAE/D,aAC/B,sBAAM+I,OAAO,OAAOC,UAAWjF,EAAEjE,UALnC,UACU3G,EADV,YACe4K,EAAE1N,WAOlB,CAACuL,IAEEqH,GAAa/O,mBAAQ,WACzB,IAAMgP,EAAiBnP,GAAU0F,GAAY1F,GAAQ6C,MAAQ,KACvDuM,EAAmBpP,GAAU0F,GAAY1F,GAAQyK,QAAU,KACjE,OACE5C,EAAOzJ,KAAI,SAAC4L,EAAG5K,GACb,IAAMiQ,EAAWrF,EAAE1N,IAAI2O,MAAM,KACvBqE,EACDtP,IAAWqP,EAASvE,SAASqE,IAAmBE,EAASvE,SAASsE,IAElE1G,IAAkB2G,EAASvE,SAASpC,IAErC6G,EAAUD,EACV,KACA,IAYJ,OAXI/Q,KACFgR,EAAU,GAEgBvF,EAAEhE,aAAqCqJ,EAASvE,SAASvM,KAAc8Q,EAASvE,SAASlC,KAAcoB,EAAEhE,eACjIuJ,EAAUD,EACN,KACAtP,IAAW0I,GACT,IACA,OAGH6G,EACL,cAAC,SAAD,CACEC,QAAM,EAENxM,KAAM,CACJuM,QAAS,GAEXrR,GAAI,CACFqR,UACAxI,KAAMiD,EAAEjD,MARZ,SAWG,gBAAGwI,EAAH,EAAGA,QAASxI,EAAZ,EAAYA,KAAZ,OACC,cAAC,WAASA,KAAV,CAEE0I,KAAI,gBAAWzF,EAAE1N,IAAb,MACJoT,YAAaH,EACb7T,EAAGqL,EACH4I,OAAO,QAJF3F,EAAE1N,OAbb,UAEU0N,EAAE1N,IAFZ,YAEmB0N,EAAEtD,OAmBnB,UAGP,CAACmB,EAAQtJ,GAAUyB,GAASkJ,GAAmBF,GAAkBJ,GAAWF,KAEzEkH,GAAezP,mBAAQ,kBAC3BuH,EAAWtJ,KAAI,SAACgO,EAAQhN,GACtB,IAAMyQ,EAAW,IAANzQ,EAAUmE,EAAWzD,GAAS4H,EAAWtH,OAAS,GAAKhB,EAC5DwK,EAA0C,IAAnBtC,EAAQlH,QAAsB,IAANhB,GAAWgN,EAAO9P,MAAQoL,EAAW,GAAGpL,IACvFwT,EAAyC,IAAnBxI,EAAQlH,QAAsB,IAANhB,GAAWgN,EAAO9P,MAAQoL,EAAW,GAAGpL,IAE5F,OAAOsN,EAAuB,KAC5B,mBAEEhH,UAAS,oBAAeiN,EAAf,QAFX,SAIGzD,EAAOnF,KAAK7I,KAAI,SAACmN,EAAS8C,GAIzB,IAAM0B,IACkBxE,EAAQjK,SAE5B/C,IAAYgN,EAAQjP,MAAQiC,IAAYgN,EAAQG,UAAUZ,SAASvM,KAAcgN,EAAQG,UAAUZ,SAASlC,KAAc2C,EAAQjK,OAGhI0O,EAEFD,EACE,EAGsC,IAAnBxE,EAAQjK,OACzB,EACA,MAEF2O,EAAcF,EAChB,IAGE,KACAG,EAAU3E,EAAQjP,MAAQiC,GAAW,QAAU,OAE/C4R,EAAW,iBACXC,EAA2B,IAAhBJ,EAGjB,OACE,cAAC,SAAD,CACER,QAAM,EAENxM,KAAM,CACJJ,UAAU,aAAD,QAAgBW,EAAhB,QAETyM,YAAa,EACbC,YAAa,GAEf/R,GAAI,CACF0E,UAAU,aAAD,QAAgBW,EAAhB,aAA6BgI,EAAQhJ,EAArC,KAETyN,cACAC,eAbJ,SAiBG,gBAAGrN,EAAH,EAAGA,UAAWoN,EAAd,EAAcA,YAAaC,EAA3B,EAA2BA,YAA3B,OACC,eAAC,WAAS5F,EAAV,CAEEzH,UAAWA,EACXvE,QAAS+R,EAAW,KAAO,WACzBpD,KACA7E,GAAe,MACfU,GAAa,MACTtK,KAAagN,EAAQjP,IACvB2L,GAAY,MAEZA,GAAYsD,EAAQjP,MAGxB0C,MAAOoR,EAAW,KAAO,CAAEC,OAAQ,WAbrC,UAeG9E,EAAQnC,OACP,qCACE,cAAC,WAASlN,KAAV,CACEoU,YAAWH,EACXI,sBAAqBhF,EAAQjP,IAC7BkU,GAAwB,GAAnBjF,EAAQE,SACbgF,GAAsB,UAAlBlF,EAAQjB,MAAoB,EAAI/G,EACpCmN,WAAYnF,EAAQjB,MACpBmB,SAAUF,EAAQE,SAClBgE,KAAMlE,EAAQxF,MACd4K,WAAW,OACXjB,YAAaM,EATf,SAWGlT,EAASC,GAAU2G,GAAuB0I,EAAO9P,KAAMiP,EAAQ1I,KAAKrB,iBAEvE,eAAC,WAAStF,KAAV,CACEsU,IAAKjF,EAAQE,SAAW,EACxBgF,GAAsB,UAAlBlF,EAAQjB,MAAoB,EAAI/G,EACpCmN,WAAYnF,EAAQjB,MACpBmB,SAAUF,EAAQE,SAClBgE,KAAMlE,EAAQxF,MACd4K,WAAW,OACXjB,YAAaM,EAPf,cAUIzE,EAAQvF,YAAYrE,uBAI1B,eAAC,WAASzF,KAAV,CACEoU,YAAWH,EACXI,sBAAqBhF,EAAQjP,IAC7BkU,IAAKjF,EAAQE,SAAW,EACxBgF,GAAsB,UAAlBlF,EAAQjB,MAAoB,EAAI/G,EACpCmN,WAAYnF,EAAQjB,MACpBmB,SAAUF,EAAQE,SAClBgE,KAAMlE,EAAQxF,MACd4K,WAAW,OACXjB,YAAaM,EATf,UAYGlT,EAASC,GAAU2G,GAAuB0I,EAAO9P,KAAMiP,EAAQ1I,KAAKrB,eAZvE,KAYyF+J,EAAQvF,YAAYrE,oBAG/G,cAAC,WAASiP,KAAV,CACE9Q,MAAOyL,EAAQjE,QAAQlH,OAASmD,EAEhCjC,OAAQiK,EAAQjK,OAChBmO,KAAMlE,EAAQxF,MACd2J,YAAaO,EACbK,YArF0F,OAuF1FO,iBAAgBtF,EAAQjP,MAE1B,4BACGiP,EAAQjE,QAAQlJ,KAAI,SAAC4L,EAAG8G,GAAJ,OACnB,mBAEElO,UAAS,oBAAeW,EAAWuN,EAA1B,QAFX,SAIG9G,EAAEO,OAAOnM,KAAI,SAAC+C,EAAO4P,GAAO,IACnB9U,EAAyBkF,EAAzBlF,MAAO6P,EAAkB3K,EAAlB2K,QAGTkF,GAH2B7P,EAAT0B,KACX1B,EAAMG,OAAUH,EAAMsK,UAEflN,IAAWA,KAAa4C,EAAMsJ,QAC9CwG,EAAW,GACXC,EAAc,GAKhBD,EADeD,EACP,UAAM/U,EAAN,aAAgB6P,EAAhB,KAEG7P,EAYb,IAEMsT,GAAWhR,IAAkC4C,EAAMG,QAAgC,CAACiK,EAAQjP,IAAK6E,EAAM7E,KAAKwO,SAASvM,IACvH,EAGE,EAEN,OAAOgR,EACL,cAAC,SAAD,CACEC,QAAM,EAENxM,KAAM,CACJJ,UAAU,mBAIZ1E,GAAI,CACF0E,UAAU,gBAAD,OAAkBzB,EAAMoB,EAAxB,MATb,SAcG,gBAAGK,EAAH,EAAGA,UAAH,OAGC,eAAC,WAASyH,EAAV,CAEEzH,UAAWA,EACX8M,YAAaH,EAHf,UAME,sBACEzP,MAAOyD,EAEPjC,OAAQR,KAAKC,IAAI,EAAGI,EAAMwK,WAC1B8D,KAAMlE,EAAQxF,MACd4J,OAAO,gBAET,sBAAMwB,GAAI5N,EAAUoM,OAAO,UAYvB,sBACE7P,MAAOyD,EACPjC,OAAQH,EAAMG,OACdmO,KAAK,cACLC,YAAY,IACZC,OAAO,cACPW,YAAWJ,EACXkB,cAAatU,EAASC,GAAU2G,GAAuB0I,EAAO9P,KAAMiP,EAAQ1I,KAAKrB,eACjFE,YAAW5E,EAASC,GAAU2G,GAAuBvC,EAAMuJ,WAAYvJ,EAAM0B,KAAKrB,eAClF6P,aAAYlQ,EAAMlF,MAClBqV,kBAAiBnQ,EAAM6J,WACvBuG,gBAAepQ,EAAM4J,SACrByG,aAAYjG,EAAQxF,MACpB0L,SAAQzH,EAAEnF,KACV6M,SAAQnG,EAAQhJ,EAAIpB,EAAMoB,IAI/BuN,EAAsB,KACrB,qCACE,sBAEEW,GAAgB,UAAZzG,EAAEM,MAAoB/G,EAAWD,GAAUA,EAC/CkN,GAAIrP,EAAMsK,SACVA,SAAUtK,EAAMsK,SAChBiF,WAAY1G,EAAEM,MAEdmF,KAAMtO,EAAM6E,aAAe,EAAIuF,EAAQxF,MAAQ,UAPjD,SASGkL,GARG,YAUN,sBAEER,GAAgB,UAAZzG,EAAEM,MAAoB/G,EAAWD,GAAUA,EAC/CkN,GAAqB,EAAjBrP,EAAMsK,SACVA,SAAUtK,EAAMsK,SAChBiF,WAAY1G,EAAEM,MAEdmF,KAAMtO,EAAM6E,aAAe,EAAIuF,EAAQxF,MAAQ,UAPjD,SASGmL,GARG,oBAxDL/P,EAAM7E,OAhBV6E,EAAM7E,KAuFX,SA9HDwU,UAvENvF,EAAQjP,OAjBZiP,EAAQjP,SAtCrB,UACU8C,EADV,YACegN,EAAO9P,WAwQzB,CAACoL,EAAYJ,EAAQlH,OAAQ7B,GAAUuB,EAAOkN,GAAWhE,GAAkBC,GAAgBC,GAAmBN,GAAW7L,KAGtH4U,GAAcxR,mBAAQ,WAC1B,IAAMyR,EAAa7J,EAEhB3J,KAAI,SAAA+C,GAAK,OAAIA,EAAM8B,OAAO2H,QAAO,SAAA/J,GAAC,OAAIA,EAAES,UAAQlB,UAEhDO,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAErBtB,EAASC,cACZyB,OAAO,CAAC,EAAG2Q,IACX1Q,MAAM,CAAC,EAAGpB,IAGTwC,EAAI,EACFuP,EAAmBhO,GAAOzF,KAAI,SAAC2H,EAAOmE,GAC1C,IAAM/I,EAAQ4G,EAAgBsE,MAAK,SAAAlL,GAAK,OAAIA,EAAM7E,MAAQyJ,KAC1D,GAAI5E,EAAO,CACTA,EAAMmB,EAAIA,EACVnB,EAAMrB,MAAQgB,KAAKC,IAAI,GAAIxB,EAAO4B,EAAM8B,OAAO2H,QAAO,SAAA/J,GAAC,OAAIA,EAAES,UAAQlB,SAGrEkC,GAAKnB,EAAMrB,MALF,MAMYiE,GAAW+N,aAAa/L,GANpC,mBAMFF,EANE,KAMKC,EANL,KAOT3E,EAAM0E,MAAQA,GAAS,EACvB1E,EAAM2E,IAAMA,GAAO,EACnB,IAAMiM,EAbM,IAaSjR,KAAKkR,MAAM7Q,EAAM0E,MAb1B,KAcNoM,EAAyB,IAAV/H,EAAc/I,EAAM0E,MAAQkM,EACjD5Q,EAAMhD,MAAN,WAAkB8T,EAAatQ,kBAA/B,OAAkDuI,IAAUrG,GAAOzD,OAAS,EAAI,KAAO,IACvFe,EAAMsK,SAAWvH,GAAU/C,EAAM2E,KAEnC,OAAO3E,KACNyJ,QAAO,SAAAP,GAAC,OAAIA,KAEf,OACE,mBAAGzH,UAAS,uBAAkBW,EAAlB,KAAZ,SACGsO,EAAiBzT,KAAI,SAAC+C,EAAO+I,GAAR,OACpB,cAAC,SAAD,CAEEsF,QAAM,EACNxM,KAAM,CACJJ,UAAU,kBACV9C,MAAO,GAGT5B,GAAI,CACF0E,UAAU,aAAD,OAAezB,EAAMmB,EAArB,QACTxC,MAAOqB,EAAMrB,OAVjB,SAcG,gBAAG8C,EAAH,EAAGA,UAAW9C,EAAd,EAAcA,MAAd,EAAqB2L,SAArB,OACC,eAAC,WAASpB,EAAV,CAEEzH,UAAWA,EAFb,UAIE,cAAC,WAASgO,KAAV,CACE9Q,MAAOA,EACPwB,OAAQiC,EACRkM,KAAMtO,EAAM7E,MAED,IAAZ6E,EAAMmB,EAAU,KACf,sBACEqN,OAAO,QACPuC,YAAY,IACZC,GAAI5O,IAGR,cAAC,WAASrH,KAAV,CACE0G,UAAS,wBAAmBW,EAAW,EAA9B,KACTkM,KAAMtO,EAAM7E,IAEZmP,SAAUtK,EAAMsK,SAChBkF,WAAW,OALb,SAOGxP,EAAMhD,UAtBJgD,EAAM7E,OAfV6E,EAAM7E,YA6ClB,CAACwD,EAAOiI,IAEX,OACE,sBAAKjK,UAAU,SAAf,UACE,qBAAKA,UAAU,eAAf,SACE,qBAAKA,UAAU,cAAf,SACE,4BACGhB,EAASC,GAAU,gBAAiB,qBAI3C,qBAAKe,UAAU,iBAAf,SACG4P,KAEH,qBAAK5P,UAAU,eAAekB,MAAO,CAAE2D,UAAW,SAAlD,SACE,qBAAK7E,UAAU,cAAf,SACE,mBACEkB,MAAO,CACLuQ,QAAS7H,EAAWtH,QAAUkB,EAAS,EAAI,GAF/C,SAKGxE,EAASC,GAAU,gBAAiB,4BAwG3C,qBACEe,UAAU,SACVkB,MAAO,CAAEsC,OAAO,GAAD,OAAgB,IAAXiC,EAAL,OAFjB,SAIE,qBACEzF,UAAU,MACVkB,MAAO,CAAEc,QAAOwB,OAAmB,IAAXiC,EAAgB6O,WAAY,aAFtD,SAIGT,OAGL,sBACEnP,IAAK2E,EACLrJ,UAAU,kBAFZ,UAIE,qBAAKA,UAAS,2BAAsBgL,KAAkBxB,EAAQlH,OAAS,UAAY,IAAnF,SACE,qBAAKtC,UAAU,SAAf,SACgB,YAAbf,GACC,4CAAc,sBAAMe,UAAU,WAAhB,iBAAd,mBACE,wDAAuB,sBAAMA,UAAU,WAAhB,mBAAvB,wCAIR,qBACEA,UAAS,4BAAwBgL,GAA4B,GAAZ,WACjD9J,MAAO8J,GAAgBA,GAAc8D,eAAiB,GAFxD,SAIE,sBACE9O,UAAU,SACVkB,MAAO8J,GAAgBA,GAAc+D,YAAc,GAFrD,UAIE,sBAAK/O,UAAU,QAAf,UACGhB,EAASC,GAAU,gBAAiB,eAAe4I,QAAQ,aAAa,IAEzE,sBAAM7H,UAAU,WAAWkB,MAAO,CAAE+G,MAAO+C,GAAgBA,GAAc/C,MAAQ,MAAjF,SAA0F+C,GAAgBA,GAAcjG,KAAO,QAEjI,qBACE/E,UAAU,QACVO,QAAS,WAAO4J,GAAY,OAF9B,SAIE,+BAAOnL,EAASC,GAAU,gBAAiB,4BAKnD,qBAAKe,UAAU,iBAAf,SACGkQ,KAGD9F,GACE,qBACEpK,UAAU,qBACVkB,MAAO,CACL0D,WAAYwF,GAAY5F,EACxBK,UAAWuF,GAAY3F,EACvBK,UAAWsF,GAAY5F,EAAIxC,EAAQ,EAAxB,iDALf,SAUE,+BAEIoI,GAAY4F,KACR5F,GAAY4F,KACZhR,EAASC,GAAU,gBAAiB,mCAI5C,KAGJiD,GACE,sBACElC,UAAU,UACVkB,MAAO,CACL0D,WAAY1C,GAAQsC,EACpBK,UAAW3C,GAAQuC,EAGnBK,UAAU,aAAD,OAA6B,UAAd5C,GAAQqS,EAAgB,KAAO,QAA9C,aAA0DrS,GAAQa,EAAIS,EAAS,EAAI,EAAI,QAAU,KAAjG,MAEXjD,QAAS,SAAA2D,GAAC,OAAIA,EAAEsL,mBAChBgF,WAAY,SAAAtQ,GAAC,OAAIA,EAAEsL,mBACnBiF,aAAc,SAAAvQ,GACZA,EAAEsL,kBACFrN,GAAW,OAbf,UAgBE,sBAAKnC,UAAU,UAAUkB,MAAO,CAAE+G,MAAO/F,GAAQ+F,OAAjD,UACE,qBAAKjI,UAAU,WAAf,SACE,+BACGkC,GAAQyK,WAGb,sBAAK3M,UAAU,WAAf,UACE,qBAAKgC,MAAM,KAAKwB,OAAO,KAAKkR,QAAQ,YAApC,SACE,oBAAG5P,UAAU,uBAAb,UACE,sBAAM9C,MAAM,KAAKwB,OAAO,KAAKsB,UAAU,qBAAqB6M,KAAK,SACjE,sBAAM0C,GAAG,IAAIvP,UAAU,yBAAyB6M,KAAK,OAAOE,OAAQ3P,GAAQ+F,MAAO0M,cAAc,QAAQP,YAAY,MACrH,sBAAM7L,GAAG,KAAKzD,UAAU,yBAAyB6M,KAAK,OAAOE,OAAQ3P,GAAQ+F,MAAO0M,cAAc,QAAQP,YAAY,WAG1H,+BACGlS,GAAQ6C,aAIf,sBAAK/E,UAAU,UAAf,UACE,qBAAKA,UAAU,MAAf,SACE,+BACGhB,EAASC,GAAU,gBAAiB,uBAAuB4I,QAAQ,iBAAkB3F,GAAQ6C,MAAM8C,QAAQ,aAAc3F,GAAQyK,YAGtI,sBAAK3M,UAAU,MAAf,UACE,qBAAKA,UAAU,QAAQkB,MAAO,CAAE+G,MAAO/F,GAAQ+F,OAA/C,SACGjJ,EAASC,GAAU,gBAAiB,gBAEvC,qBAAKe,UAAU,QAAf,SACGkC,GAAQ/D,WAGb,sBAAK6B,UAAU,MAAf,UACE,qBAAKA,UAAU,QAAQkB,MAAO,CAAE+G,MAAO/F,GAAQ+F,OAA/C,SACGjJ,EAASC,GAAU,gBAAiB,sBAEvC,qBAAKe,UAAU,QAAf,SACGkC,GAAQgL,gBAGb,sBAAKlN,UAAU,MAAf,UACE,qBAAKA,UAAU,QAAQkB,MAAO,CAAE+G,MAAO/F,GAAQ+F,OAA/C,SACGjJ,EAASC,GAAU,gBAAiB,qBAEvC,qBAAKe,UAAU,QAAf,SACGkC,GAAQ+K,cAGb,qBAAKjN,UAAU,MAAf,SACE,+BAEqB,SAAjBkC,GAAQ6E,KACJ/H,EAASC,GAAU,gBAAiB,6BACpCD,EAASC,GAAU,gBAAiB,yCAMhD,KAEN,sBACEe,UAAU,SACVkB,MACE0I,EAAWtH,QAAUkB,EAAS,CAC5BA,OAAO,GAAD,OAAKA,EAAL,OACJ,KALR,UAQGkN,GACD,sBACE1Q,UAAU,MACVkB,MAAO,CAAEc,QAAOwB,SAAQ8Q,WAAY,aACpCM,cAAerO,GACftC,YAAa,SAAAC,GAAM,IACTC,EAAyBD,EAAzBC,MAAOC,EAAkBF,EAAlBE,MACPC,EADyBH,EAAXnD,OACdsD,QACR,GAAIC,OAAOC,KAAKF,GAAS/B,OAAQ,CAAC,IACxByE,EAAS1C,EAAT0C,KACR,GAAa,mBAATA,EAA2B,CAAC,IACtB8N,EAAmBxQ,EAAnBwQ,eACRhK,GAAkBgK,GAClB9J,GAAa,MACb5I,GAAW,MACXkI,GAAe,WACV,GAAa,cAATtD,EAAsB,CAAC,IACxB+D,EAAczG,EAAdyG,UACRC,GAAaD,GACbT,GAAe,MACflI,GAAW,MACX0I,GAAkB,UACA,SAAT9D,GAETsD,GAAe,MACflI,GAAW,MACX0I,GAAkB,OACA,WAAT9D,GACTgE,GAAa,MACb5I,GAAW,MACX0I,GAAkB,MAClBR,GAAe,aACb7F,EAAGL,EACHM,EAAGL,GACAC,MAILgG,GAAe,MACfQ,GAAkB,MAClB1I,GAAW,aACTqC,EAAGL,EACHM,EAAGL,GACAC,UAKPgG,GAAe,MACflI,GAAW,MACX0I,GAAkB,OAItB9G,WAAY,WACV5B,GAAW,MACXkI,GAAe,MACfQ,GAAkB,OAxDtB,UA2DE,+BACGoG,KAEH,sBACEjR,UAAU,aACVgC,MAAOA,EACPwB,OAAQA,EACRjD,QAAS,WACP8J,GAAe,MACfQ,GAAkB,MAClB1I,GAAW,MACXgI,GAAY,MACZY,GAAa,MACbmE,MAEFyC,KAAK,UAENP,GACAU,Y,MI3iDI,SAASgD,GAAWjV,GAAQ,IACjCsJ,EAA6BtJ,EAA7BsJ,KAAM4L,EAAuBlV,EAAvBkV,MAAOtV,EAAgBI,EAAhBJ,YADmB,EAGTqC,cAHS,mBAGjCkT,EAHiC,KAGpBhT,EAHoB,KAGpBA,MASpB,OAAOmH,EACL,qBAAKnJ,UAAU,aAAf,SAEE,sBACE0E,IAAKsQ,EACLhV,UAAU,UAFZ,UAIE,qBAAKA,UAAU,OAAf,SACE,sBAAKA,UAAU,OAAf,UACE,6BACG+U,IAEFtV,OAmBL,cAACyJ,GAAD,aACElH,MAAOA,GACHnC,SAIR,K,MCpDS,SAAS8B,GAAM9B,GAC5B,IAAMZ,EAAWc,qBAAWvC,GAC5B,OACE,qBAAKwC,UAAU,SAAf,SACE,qBAAKA,UAAU,MAAf,SACE,iCACGhB,EAASC,EAAU,SAAU,UAAW,IACzC,mBAAG6B,KAAK,mCAAmCC,OAAO,SAASC,IAAI,sBAA/D,4C,UCSJiU,GAAW,UAAM1X,IAAN,uBACX2X,GAAe,UAAM3X,IAAN,uBAErB,SAAS4X,GAAU/W,GACjB,IAAMgX,EAAahX,EAAK+O,MAAM,MACxBkI,EAAcD,EAAWE,WAAU,SAAA1X,GAAC,OAAIA,EAAEoP,SAAS,kBACnDuI,EAAcH,EAAWpJ,MAAMqJ,GAAavW,KAAK,MAWvD,OAVYT,YAASkX,GAClBjV,KAAI,SAAA1C,GAOH,OANAA,EAAEmP,cAAgB,CAChBnF,GAAYhK,EAAE,qBACdgK,GAAYhK,EAAE,2BACdgK,GAAYhK,EAAC,WACbkP,QAAO,SAAAlP,GAAC,MAAU,KAANA,KACdA,EAAE,gBAAmBA,EAAE,eAAe4X,OAAO3N,QAAQ,UAAW,IACzDjK,KACNkP,QAAO,SAAAlP,GAAC,OAAIA,EAAEmP,cAAczK,UAIpB,SAASmT,KAAO,IAAD,EACQxT,mBAAS,IADjB,mBACrByT,EADqB,KACTC,EADS,OAEU1T,mBAAS,IAFnB,mBAErB2T,EAFqB,KAERC,EAFQ,OAGU5T,mBAAS,IAHnB,mBAGrBJ,EAHqB,KAGRiU,EAHQ,OAIQ7T,mBAAS,GAJjB,mBAIrBL,EAJqB,KAITmU,EAJS,OAKI9T,mBAAS,WALb,mBAKrBhD,EALqB,KAKXa,EALW,KAsC5B,OA/BAuL,qBAAU,WACRrN,OAAOC,MAAMgX,IACV/W,MAAK,SAAAC,GAAK,OAAIA,EAAMC,UACpBF,MAAK,SAAAE,GACJ,IAAM4X,EAAMb,GAAU/W,GACtBuX,EAAcK,MAGlBhY,OAAOC,MAAMiX,IACVhX,MAAK,SAAAC,GAAK,OAAIA,EAAMC,UACpBF,MAAK,SAAAE,GACJ,IAAM4X,EAAMb,GAAU/W,GACtByX,EAAeG,QAElB,IAEH3K,qBAAU,WACR,GAAIqK,EAAWpT,QAAUsT,EAAYtT,OAAQ,CAC3C,IAAM2T,EAAeP,EAAWrI,OAAOuI,GACjC/T,EAAcmD,EAAU3B,YAAM4S,GAAc,SAAArY,GAAC,OAAIA,EAAE,kDACtD0C,KAAI,SAAA1C,GAEH,OADAA,EAAEO,MAAQP,EAAEuH,OAAO7E,KAAI,SAAAyC,GAAC,OAAIA,EAAE,kBAAgBF,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GAC/DnF,KAEXkY,EAAejU,GAEf,IAAMD,EAAaC,EAAYvB,KAAI,SAAA1C,GAAC,OAAIA,EAAEO,SAAO0E,QAAO,SAACC,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,GACzEgT,EAAcnU,MAEf,CAAC8T,EAAYE,If/CT7X,EekDL,cAACP,EAAgB0Y,SAAjB,CAA0B/X,MAAOc,EAAjC,SACE,qBAAKe,UAAU,MAAf,SAOE,eAAC,IAAD,CAAQmW,SAAU5Y,IAAlB,UACE,cAACqC,EAAD,CAAQE,YAAaA,IACrB,eAAC,IAAD,WACE,cAAC,IAAD,CAAmBmJ,KAAK,SAAxB,SACE,cAAChI,EAAD,KADS,SAGX,cAAC,IAAD,CAA+BgI,KAAK,qBAApC,SACE,cAAC6L,GAAD,CACE3L,KAAMuM,EACNtM,GAAG,sBACH2L,MAAO/V,EAASC,EAAU,sBAAuB,SACjDQ,YACE,gCACE,4BACGT,EAASC,EAAU,sBAAuB,iBAE7C,6BACGD,EAASC,EAAU,sBAAuB,mBAE7C,4BACGD,EAASC,EAAU,sBAAuB,+BAd1C,qBAoBX,cAAC,IAAD,CAAqCgK,KAAK,2BAA1C,SACE,cAAC6L,GAAD,CACE3L,KAAMyM,EACNxM,GAAG,6BACH2L,MAAO/V,EAASC,EAAU,6BAA8B,SACxDQ,YACE,8BACE,4BACGT,EAASC,EAAU,6BAA8B,sBARjD,2BAcX,cAAC,IAAD,CAAegK,KAAK,IAApB,SACE,cAACtH,EAAD,CACEC,WAAYA,EACZC,YAAaA,KAHN,QAOb,cAAC,GAAD,WAxDY,KC9EtB,IAYeuU,GAZS,SAAAC,GAClBA,GAAeA,aAAuBC,UACxC,6BAAqBpY,MAAK,YAAkD,IAA/CqY,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,OCDdO,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,GAAD,MAEFvX,SAASwX,eAAe,SAM1BX,O","file":"static/js/main.7946ecb3.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/logo.9bac1546.png\";","export default __webpack_public_path__ + \"static/media/facebook.8c95610d.svg\";","export default __webpack_public_path__ + \"static/media/twitter.1df90b4d.svg\";","import { createContext } from 'react';\nimport { csvParse } from 'd3-dsv';\n\nconst localization = `${process.env.PUBLIC_URL}/RavenswoodLocalization.csv`;\n\nconst languages = ['english', 'spanish']\n\nexport const LanguageContext = createContext(languages[0])\n\nconst translationMap = {}\n\nconst translationKeyFromRow = d => {\n return `${d.section}-${d.element}`\n}\n\nconst translationKey = (section, element) => {\n return translationKeyFromRow({section, element})\n}\n\nconst prepare = (text) => {\n const translations = csvParse(text)\n translations.forEach(row => {\n const key = translationKeyFromRow(row)\n translationMap[key] = row\n })\n}\n\nlet ready = false;\nexport function isReady() {\n return ready;\n}\n\nwindow.fetch(localization)\n .then(value => value.text())\n .then(text => {\n prepare(text);\n ready = true;\n });\n\nconst log = {}\nconst logOnce = (...msgs) => {\n let msg = msgs.join(' ')\n if (log[msg]) {\n return\n }\n log[msg] = true\n console.log(...msgs)\n}\nexport function localize(language, section, element) {\n const key = translationKey(section, element)\n if (translationMap[key]) {\n if (translationMap[key][language]) {\n return translationMap[key][language]\n } else {\n logOnce(language, 'language not found', section, element)\n }\n } else {\n logOnce('translation not found', section, element, language)\n }\n return `${language}-${section}-${element}`\n}\n","import { useContext } from 'react'\nimport { NavLink } from \"react-router-dom\";\nimport classnames from 'classnames';\n\nimport logo from '../images/logo.png';\nimport facebook from '../images/facebook.svg';\nimport twitter from '../images/twitter.svg';\n\nimport './styles.scss';\n\nimport { localize, LanguageContext } from '../Localization'\n\n\nfunction share(site, language) {\n const url = encodeURIComponent(document.location)\n const description = encodeURIComponent(localize(language, 'header', 'twitter'))\n return () => {\n let link = null\n switch (site) {\n case 'fb':\n // eslint-disable-next-line no-undef\n link = `https://www.facebook.com/sharer.php?u=${url}`\n break\n case 'twitter':\n link = `https://twitter.com/intent/tweet?url=${url}&text=${description}`\n break\n default:\n link = null\n break\n }\n if (link !== null) {\n window.open(link)\n }\n }\n}\nexport default function Header(props) {\n const { setLanguage } = props\n const languages = [{ label: 'English', key: 'english'}, {label: 'Español', key: 'spanish' }]\n const language = useContext(LanguageContext)\n return (\n
\n
\n
\n \n
\n
\n \n \n {localize(language, 'header', 'title')}\n \n \n
\n
\n {languages.map(({label, key}) => (\n
setLanguage(key)} className={classnames('language', { selected: language === key })}>\n {label}\n
\n ))}\n
\n
\n
\n facebook\n
\n
\n twitter\n
\n
\n
\n
\n
\n
\n \n \n {localize(language, 'navigation', 'home')}\n \n \n
\n
\n \n \n {localize(language, 'school site budgets', 'title')}\n \n \n
\n
\n \n \n {localize(language, 'central supports and admin', 'title')}\n \n \n
\n
\n
\n
\n \n \n {localize(language, 'navigation', 'download')}\n \n \n
\n
\n \n \n {localize(language, 'navigation', 'about')}\n \n \n
\n
\n
\n
\n );\n}\n","export default __webpack_public_path__ + \"static/media/about-background-chords.0ee27724.svg\";","import { useContext } from 'react';\nimport backgroundChords from '../images/about-background-chords.svg';\nimport { LanguageContext, localize } from '../Localization'\n\nimport './styles.scss';\n\nexport default function About() {\n const language = useContext(LanguageContext)\n\n const questionArray = [1, 2, 3, 4, 5, 6]\n\n return (\n
\n
\n

\n {localize( language, 'about', 'title' )}\n

\n

\n {localize( language, 'about', 'description' )}\n

\n {questionArray.map((q, i) => (\n
\n

{localize( language, 'about', `q${q}`)}

\n

{localize( language, 'about', `a${q}`)}

\n
\n ))}\n\n

\n {localize(language, 'about', 'note')}\n

\n
\n
\n );\n}\n","import { NavLink } from \"react-router-dom\";\nimport { useContext } from 'react';\n\nimport './styles.scss';\nimport { LanguageContext, localize } from '../Localization'\n\nexport default function Links(props) {\n const { style } = props;\n const language = useContext(LanguageContext)\n\n return (\n
\n
\n \n
\n \n {localize(language, 'school site budgets', 'title')}\n \n
\n \n
\n
\n \n
\n \n {localize(language, 'central supports and admin', 'title')}\n \n
\n \n
\n
\n );\n}\n","export default __webpack_public_path__ + \"static/media/intro-background-chords.34e9bae6.svg\";","import React, { useState, useMemo, useContext } from 'react';\nimport useDimensions from 'react-use-dimensions';\nimport { scaleLinear } from 'd3-scale';\nimport sortBy from 'lodash.sortby';\n\nimport Links from '../Links';\n\nimport backgroundChords from '../images/intro-background-chords.svg';\n\nimport './styles.scss';\nimport { LanguageContext, localize } from '../Localization'\n\n// const summaryColors = ['#C56415', '#97D7FB', '#255678', '#784A25'];\nconst summaryColors = ['#2985C5', '#C56415', 'rgba(197, 100, 21, 0.5)', 'rgba(106, 116, 122, 0.82)'];\nconst xScale = scaleLinear();\n\nexport default function Intro(props) {\n const { totalValue, summaryData } = props;\n\n const [barRef, { width }] = useDimensions();\n\n const [tooltip, setTooltip] = useState();\n\n const language = useContext(LanguageContext)\n\n const bars = useMemo(() => {\n if (summaryData.length && width) {\n const summaryValues = sortBy(summaryData.map(d => d.value), d => -d);\n const minWidth = 152;\n const innerMin = 112;\n summaryValues.pop();\n const wide = window.innerWidth > 1024;\n const adjustedTotal = wide\n ? summaryValues.reduce((a, v) => a + v, 0)\n : Math.max(...summaryValues);\n\n const scaleWidth = wide\n ? width - (minWidth + (innerMin / 2) + 1)\n : width;\n xScale\n .domain([0, adjustedTotal])\n .range([0, scaleWidth]);\n\n return summaryData.map((group, i) => {\n const isLast = i === summaryData.length -1;\n const width = wide\n ? isLast\n ? xScale(group.value)\n : Math.max(innerMin, xScale(group.value))\n : xScale(group.value);\n const background = summaryColors[i];\n const height = wide\n ? '4em'\n : '2.625em';\n const outerWidth = wide\n ? isLast\n ? minWidth\n : width\n : '100%';\n\n const key = group.key.toLowerCase()\n\n return (\n
\n
\n \n {localize(language, 'landing', `${key} label`)}\n \n
\n
\n
\n
\n
\n \n ${group.value.toLocaleString()}\n \n
\n
\n );\n });\n }\n return null;\n }, [summaryData, width, language]);\n\n return (\n
\n
\n
\n

\n {localize(language, 'landing', 'introduction') }\n

\n
\n
\n setTooltip(null)}\n >\n
\n
\n\n {localize(language, 'landing', 'title') }\n
\n
\n ${totalValue.toLocaleString()}\n
\n
\n {\n const { pageX, pageY, target } = e;\n const { dataset } = target;\n if (Object.keys(dataset).length) {\n setTooltip({\n x: pageX,\n y: pageY,\n ...dataset,\n });\n } else {\n setTooltip(null);\n }\n }}\n >\n \n {bars}\n
\n
\n
\n \n
\n \n {\n tooltip ? (\n window.innerWidth / 2 ? '-105%' : '5%'}, -100%)`,\n }}\n >\n
\n
\n {localize(language, 'landing', `${tooltip.name} label`)}\n\n
\n
\n
\n
\n {localize(language, 'landing', `${tooltip.name} description`)}\n
\n
\n \n ) : null\n }\n \n );\n}\n","export default function mapToNest(map) {\n return Array.from(map, ([key, values]) => ({key, values}));\n}\n","export default __webpack_public_path__ + \"static/media/toggle-background-chords.5f294a25.svg\";","import React, { useState, useEffect, useMemo, useRef, useContext, useCallback } from 'react';\nimport { Spring, animated } from 'react-spring/renderprops';\nimport { extent, group } from 'd3-array';\nimport { scaleLinear, scaleQuantile } from 'd3-scale';\nimport sortBy from 'lodash.sortby';\n\nimport mapToNest from '../mapToNest';\nimport exportSVG from '../exportSVG';\n\nimport backgroundChords from '../images/toggle-background-chords.svg';\n// import info from '../images/info.svg';\nimport arrow from '../images/arrowdown.svg';\nimport close from '../images/close.svg';\nimport './styles.scss';\n\nimport { LanguageContext, localize } from '../Localization'\n\nconst showValue = true;\n// const showPercent = true;\nconst showName = false;\n\nconst metrics = {\n defaultBarWidth: 24,\n vSpace: 24,\n nudgeX: 4,\n};\nconst { defaultBarWidth, vSpace, nudgeX } = metrics;\nlet barWidth = defaultBarWidth;\n\nconst possibleColumns = ['School Site/Department', 'Resource / Grant', 'Activity', 'None'];\nconst columnNames = {\n 'Resource / Grant-SchoolSiteBudgets': 'resource / grant',\n 'School Site/Department-SchoolSiteBudgets': 'school site',\n 'Activity-SchoolSiteBudgets': 'activity',\n 'None-SchoolSiteBudgets': 'None',\n 'Resource / Grant-CentralSupportsandAdmin': 'resource / grant',\n 'School Site/Department-CentralSupportsandAdmin': 'department name',\n 'Activity-CentralSupportsandAdmin': 'activity',\n 'None-CentralSupportsandAdmin': 'None',\n};\n\nconst languageColumnTextKeys = {\n \"SchoolSiteDepartment\": \"school site\",\n ResourceGrant: 'resource / grant',\n Activity: 'activity',\n}\n\nconst colors = [\n '#1E3D51',\n '#2985C5',\n '#6A747A',\n '#8C7C6B',\n '#C56415',\n].reverse();\nconst colorScale = scaleQuantile().range(colors);\n\nconst defaultFontRange = [10, 16];\nconst fontScale = scaleLinear().range(defaultFontRange).clamp(true);\nconst yScale = scaleLinear().range([0, 120]).clamp(true);\n\nfunction downloadSVG(event) {\n return exportSVG(event.currentTarget);\n}\n\nexport function generateKey(name) {\n return name.replace(/[^A-Za-z0-9]/g, '');\n}\n\nfunction generateChord(start, end) {\n const { color, value, activeTotal } = end;\n const startColor = start.color;\n const startName = start.name;\n const endName = end.name;\n const x0 = start.x,\n x1 = end.x,\n y0 = start.y,\n y1 = end.y,\n h0 = Math.max(1, start.height),\n h1 = Math.max(1, end.height),\n midX = x0 + ((x1 - x0) * 0.5);\n\n return {\n key: `${start.key}-${end.key}`,\n color,\n startColor,\n value,\n activeTotal,\n startName,\n endName,\n startX: start.x,\n endX: end.x,\n midX,\n midY: Math.min(y0, y1) + ((Math.max(y0 + h0, y1 + h1) - Math.min(y0, y1)) / 2),\n path: `\n M ${x0} ${y0}\n C ${midX} ${y0} ${midX} ${y1} ${x1} ${y1}\n L ${x1} ${y1 + h1}\n C ${midX} ${y1 + h1} ${midX} ${y0 + h0} ${x0} ${y0 + h0}\n Z\n `,\n };\n}\n\nlet buildInHandle;\nlet hintHandle;\n\nexport default function Sankey(props) {\n const { width, data, id } = props;\n const scrollRef = useRef();\n const sankeyId = generateKey(id);\n\n const [columns, setColumns] = useState([]);\n const [drawers, setDrawers] = useState(possibleColumns.map(d => false));\n const [columnData, setColumnData] = useState([]);\n const [height, setHeight] = useState(width);\n const [chords, setChords] = useState([]);\n const [colorLegendData, setColorLegendData] = useState([]);\n const [selected, setSelected] = useState();\n const [instruction, setInstruction] = useState();\n const [tooltip, setTooltip] = useState();\n const [hintIndex, setHintIndex] = useState(0);\n const [displayedHints, setDisplayedHints] = useState([]);\n const [builtIn, setBuiltIn] = useState(false);\n\n const [hoverHighlight, setHoverHighlight] = useState();\n const [subselect, setSubselect] = useState();\n const [selectedDatum, setSelectedDatum] = useState();\n //\n // const [inlineEverything, setInlineEverything] = useState(false); // overrides others\n // const [hideEverything, setHideEverything] = useState(true);\n // const [filterBySelection, setFilterBySelection] = useState(true); // when false do hover thing tk\n const inlineEverything = false;\n const hideEverything = true;\n const filterBySelection = true;\n //\n // const [hideOtherCols, setHideOtherCols] = useState(false);\n //\n\n const language = useContext(LanguageContext)\n\n useEffect(() => {\n if (data.length && width) {\n\n //\n let narrow = false;\n let fontRange = defaultFontRange;\n barWidth = defaultBarWidth;\n if (window.innerWidth <= 1280) {\n barWidth = 16;\n fontRange = [8, 14];\n if (window.innerWidth <= 768) {\n // barWidth = 8;\n fontRange = [6, 10];\n narrow = true;\n }\n }\n //\n const { top } = scrollRef.current.getBoundingClientRect();\n if (top < 0) {\n scrollRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n\n const totalKey = 'Total Costs';\n\n const isTwoColumnDuplicate = columns.length === 1;\n const displayColumns = isTwoColumnDuplicate\n ? [columns[0], columns[0]]\n : columns.slice();\n\n let groupings = displayColumns\n .map((c, i) => {\n const leftIndex = i - 1;\n const rightIndex = i + 1;\n return {\n index: i,\n name: c,\n left: displayColumns[leftIndex],\n right: displayColumns[rightIndex],\n };\n })\n .map(c => {\n c.key = generateKey(c.name);\n c.data = sortBy(\n mapToNest(group(data, d => d[c.name]))\n .map(g => {\n g.name = g.key;\n g.key = generateKey(g.key);\n g.columns = [];\n if (c.left) {\n g.align = 'end';\n g.type = 'left';\n const groups = mapToNest(group(g.values, d => d[c.left]));\n // const colIncludesSubselect = subselect && groups.map(g => g.key).includes(subselect);\n // console.log(colIncludesSubselect);\n // console.log(g.key);\n // console.log(groups.map(g => g.key));\n // segment.key === selected || segment.childKeys.includes(selected) || (segment.childKeys.includes(subselect)\n g.columns.push(\n {\n type: 'left',\n align: 'end',\n groups: sortBy(\n // mapToNest(group(g.values, d => d[c.left]))\n groups\n .map(d => {\n d.name = d.key;\n d.key = generateKey(d.key);\n d.parent = g.key;\n d.parentKey = generateKey(c.left)\n\n d.total = d.values.map(v => v[totalKey]).reduce((a, v) => a + v, 0);\n d.activeTotal = inlineEverything ? d.total : d.values\n // .filter(v => selected ? v.selectionKeys.includes(selected) : true)\n // .filter(v => selected ? (d.key === subselect) : true)\n // .filter(v => selected ? (v.selectionKeys.includes(selected) || d.key === subselect) : true)\n .filter(v => (\n selected\n ? filterBySelection\n ? v.selectionKeys.includes(selected)\n : d.key === selected || g.key === selected || (v.selectionKeys.includes(selected) && v.selectionKeys.includes(subselect))\n : true\n ))\n .map(v => v[totalKey])\n .reduce((a, v) => a + v, 0);\n const [students] = d.values.map(v => v['Students Served']);\n d.students = +students.toLocaleString();\n // d.perstudent = `$${(d.total / d.students).toLocaleString().split('.')[0]}`;\n d.perstudent = `$${(d.activeTotal / d.students).toLocaleString().split('.')[0]}`;\n return d;\n })\n // , 'total').reverse()\n , 'activeTotal').reverse()\n }\n );\n }\n if (c.right) {\n g.align = 'start';\n g.type = 'right';\n const groups = mapToNest(group(g.values, d => d[c.right]));\n // const colIncludesSubselect = subselect && groups.map(g => g.key).includes(subselect);\n // console.log(groups.map(g => g.key));\n g.columns.push(\n {\n type: 'right',\n align: 'start',\n groups: sortBy(\n // mapToNest(group(g.values, d => d[c.right]))\n groups\n .map(d => {\n d.name = d.key;\n d.key = generateKey(d.key);\n d.parent = g.key;\n d.parentKey = generateKey(c.right)\n\n d.total = d.values.map(v => v[totalKey]).reduce((a, v) => a + v, 0);\n d.activeTotal = inlineEverything ? d.total : d.values\n // .filter(v => selected ? v.selectionKeys.includes(selected) : true)\n // .filter(v => selected ? (d.key === subselect) : true)\n // .filter(v => selected ? (v.selectionKeys.includes(selected) || d.key === subselect) : true)\n .filter(v => (\n selected\n ? filterBySelection\n ? v.selectionKeys.includes(selected)\n : d.key === selected || g.key === selected || (v.selectionKeys.includes(selected) && v.selectionKeys.includes(subselect))\n : true\n ))\n .map(v => v[totalKey])\n .reduce((a, v) => a + v, 0);\n const [students] = d.values.map(v => v['Students Served']);\n d.students = +students.toLocaleString();\n // d.perstudent = `$${(d.total / d.students).toLocaleString().split('.')[0]}`;\n d.perstudent = `$${(d.activeTotal / d.students).toLocaleString().split('.')[0]}`;\n return d;\n })\n // , 'total').reverse()\n , 'activeTotal').reverse()\n }\n );\n }\n if (c.left && c.right) {\n g.align = 'middle';\n g.type = 'center';\n }\n g.total = g.columns[0].groups.map(d => d.total).reduce((a, v) => a + v, 0);\n // g.activeTotal = g.columns[0].groups.map(d => d.activeTotal).reduce((a, v) => a + v, 0);\n g.activeTotal = Math.max(\n g.columns[0] ? g.columns[0].groups.map(d => d.activeTotal).reduce((a, v) => a + v, 0) : 0,\n g.columns[1] ? g.columns[1].groups.map(d => d.activeTotal).reduce((a, v) => a + v, 0) : 0,\n );\n return g;\n })\n // , 'total').reverse();\n , 'activeTotal').reverse();\n return c;\n });\n\n const segmentTotals = sortBy(\n groupings\n .map(g => g.data.map(d => d.total))\n // .map(g => g.data.map(d => d.activeTotal).filter(v => v))\n .reduce((a, v) => a.concat(v), [])\n );\n // console.log(segmentTotals);\n colorScale.domain(segmentTotals);\n\n const yExtent = extent(groupings\n .map(g => g.data\n .map(d => d.columns.map(c => c.groups.map(v => v.total)).reduce((a, v) => a.concat(v), []))\n // .map(d => d.columns.map(c => c.groups.map(v => v.activeTotal)).reduce((a, v) => a.concat(v), []))\n .reduce((a, v) => a.concat(v), []))\n .reduce((a, v) => a.concat(v), []));\n yScale.domain([1, yExtent[1]]);\n\n fontScale\n .domain([1, yExtent[1]])\n .range(fontRange);\n\n groupings = groupings.map(c => {\n let cy = narrow\n ? vSpace * 2\n : vSpace;\n\n // const colIncludesSelected = selected && c.data.map(segment => segment.key).includes(selected);\n c.data = c.data.map(segment => {\n // segment.color = colorScale(segment.total);\n // segment.fontSize = fontScale(segment.total);\n segment.color = colorScale(segment.activeTotal);\n segment.legendColor = colorScale(segment.total);\n segment.fontSize = fontScale(segment.activeTotal);\n segment.y = cy;\n segment.childKeys = segment.columns\n .map(c => c.groups.map(group => group.key))\n .reduce((a, v) => a.concat(v), []);\n\n const y = [0, 0];\n segment.columns.map((c, i) => (c.groups.map(g => {\n // const barHeight = yScale(g.total);\n const barHeight = yScale(g.activeTotal);\n g.y = y[i];\n // const selectedBar = ;\n const selectedBar = inlineEverything\n ? true\n : g.activeTotal !== 0;\n // : !selected || [segment.key, g.key].includes(selected);\n\n g.barHeight = selectedBar ? barHeight : 0;\n // g.fontSize = fontScale(g.total);\n g.fontSize = fontScale(g.activeTotal);\n g.height = selectedBar ? Math.max(g.barHeight, g.fontSize) : 0;\n g.parentY = segment.y;\n g.color = segment.color;\n // g.value = `$${g.total.toLocaleString()}`;\n // g.percent = `${(g.total / segment.total * 100).toFixed(0)}%`;\n g.value = `$${g.activeTotal.toLocaleString()}`;\n g.percent = `${(g.activeTotal / segment.activeTotal * 100).toFixed(0)}%`;\n y[i] += g.height;\n return g;\n })));\n\n segment.height = Math.max(...y);\n cy += segment.height;\n // cy += (hideEverything || (!colIncludesSelected && hideOtherCols)) && segment.height === 0\n cy += hideEverything && segment.height === 0\n ? 0\n : narrow\n ? segment.fontSize * 4\n : segment.fontSize * 2;\n\n //\n // segment.colIncludesSelected = colIncludesSelected;\n\n segment.narrow = narrow;\n\n return segment;\n });\n return c;\n });\n\n const colorLegendData = mapToNest(group(\n groupings\n .map(g => g.data)\n .reduce((a, v) => a.concat(v), [])\n , d => d.legendColor));\n setColorLegendData(colorLegendData);\n\n // const centerChords = groupings[1]\n // ? groupings[1].data.map(segment => {\n // return segment.columns.map(column => {\n // return column.groups.map(group => {\n // return group;\n // });\n // }).reduce((a, v) => a.concat(v), []);\n // }).reduce((a, v) => a.concat(v), [])\n // : [];\n const centerLeftChords = groupings[1]\n ? groupings[1].data.map(segment => {\n return segment.columns[0]\n ? segment.columns[0].groups.map(group => {\n return group;\n })\n : [];\n }).reduce((a, v) => a.concat(v), [])\n : [];\n\n const centerRightChords = groupings[1]\n ? groupings[1].data.map(segment => {\n return segment.columns[1]\n ? segment.columns[1].groups.map(group => {\n return group;\n })\n : [];\n }).reduce((a, v) => a.concat(v), [])\n : [];\n\n const leftChordsWidth = groupings.length === 3\n ? width / 2 - barWidth\n : isTwoColumnDuplicate\n ? 0\n : width - barWidth;\n\n const leftChords = groupings[0]\n ? groupings[0].data.map(segment => {\n return segment.columns.map(column => {\n return column.groups.map(group => {\n return group;\n });\n }).reduce((a, v) => a.concat(v), []);\n }).reduce((a, v) => a.concat(v), [])\n .map(start => {\n // const end = centerChords.find(cc => cc.parent === start.key && cc.key === start.parent);\n const end = centerLeftChords.find(cc => cc.parent === start.key && cc.key === start.parent);\n return generateChord(\n {\n ...start,\n x: barWidth,\n y: start.y + start.parentY,\n },\n {\n ...end,\n x: leftChordsWidth,\n y: end.y + end.parentY,\n },\n );\n }).reverse()\n : [];\n\n const rightChords = groupings[2]\n ? groupings[2].data.map(segment => {\n return segment.columns.map(column => {\n return column.groups.map(group => {\n return group;\n });\n }).reduce((a, v) => a.concat(v), []);\n }).reduce((a, v) => a.concat(v), [])\n .map(start => {\n // const end = centerChords.find(cc => cc.parent === start.key && cc.key === start.parent);\n const end = centerRightChords.find(cc => cc.parent === start.key && cc.key === start.parent);\n return generateChord(\n {\n ...end,\n x: width / 2 + barWidth,\n y: end.y + end.parentY,\n },\n {\n ...start,\n x: width - barWidth,\n y: start.y + start.parentY,\n },\n );\n }).reverse()\n : [];\n\n setChords(leftChords.concat(rightChords)); // .filter(c => c.height !== 0)\n const height = groupings.length\n ? Math.max(...groupings.map(g => g.data.map(d => d.height + d.fontSize * (narrow ? 4 : 2)).reduce((a, v) => a + v, 0))) + (vSpace * 2) // + (barWidth * 1.5)\n : 0;\n setHeight(lastHeight => height === 0 || height > lastHeight ? height : lastHeight);\n setColumnData(groupings);\n\n const selectedDatum = selected\n ? groupings.map(g => g.data).reduce((a, v) => a.concat(v), []).find(d => d.key === selected)\n : null;\n\n if (selectedDatum) {\n let textAlign = 'left';\n let marginLeft = 0;\n let marginRight = 'auto'\n let translateX = 0;\n if (selectedDatum.type === 'center') {\n marginLeft = 'auto';\n textAlign = 'center';\n translateX = 100;\n } else if (selectedDatum.type === 'left') {\n marginRight = 0;\n marginLeft = 'auto';\n textAlign = 'right';\n translateX = 200;\n }\n\n selectedDatum.indicatorStyle = {\n width: width / 3,\n transform: `translateX(${translateX}%)`,\n };\n selectedDatum.filterStyle ={\n marginLeft,\n marginRight,\n textAlign,\n };\n }\n setSelectedDatum(selectedDatum);\n\n //\n clearTimeout(buildInHandle);\n if (!builtIn && !columns.length) {\n buildInHandle = setTimeout(() => {\n setColumns([possibleColumns[0]]);\n setHintIndex(1);\n setBuiltIn(true);\n }, 600);\n }\n //\n }\n }, [width, data, columns, selected, builtIn, inlineEverything, hideEverything, subselect, filterBySelection]);\n // }, [width, data, columns, selected, builtIn, inlineEverything, hideEverything, hideOtherCols]);\n\n const clearHint = useMemo(() => (\n function() {\n if (hintIndex) {\n setDisplayedHints(displayedHints => (\n displayedHints.includes(hintIndex)\n ? displayedHints\n : displayedHints.concat(hintIndex)\n ));\n }\n setHintIndex(0);\n }\n ), [hintIndex]);\n\n const clickColumn = useCallback((c, active, isEverything) => event => {\n event.preventDefault()\n event.stopPropagation()\n let nextColumns = columns.slice();\n if (active) {\n nextColumns = nextColumns.filter(d => d !== c);\n } else if (isEverything) {\n nextColumns = sortBy(possibleColumns, c => {\n const index = columns.indexOf(c);\n return index >= 0 ? index : possibleColumns.length;\n }).filter(p => p !== 'None');\n } else {\n nextColumns.push(c);\n }\n if ([0, 1, 2].includes(nextColumns.length)) {\n if (hintIndex) {\n setDisplayedHints(displayedHints => (\n displayedHints.includes(hintIndex)\n ? displayedHints\n : displayedHints.concat(hintIndex)\n ));\n }\n setHintIndex(nextColumns.length);\n } else {\n clearHint();\n }\n setColumns(nextColumns);\n setSelected(null);\n setSubselect(null);\n\n },[clearHint, columns, hintIndex])\n const columnToggles = useMemo(() => {\n const orderedColumns = sortBy(possibleColumns, c => {\n const index = columns.indexOf(c);\n return index >= 0 ? index : possibleColumns.length;\n });\n return (\n
\n {possibleColumns\n .map((c, i) => {\n const order = orderedColumns.indexOf(c);\n const isEverything = c === 'None';\n const everythingSelected = !possibleColumns\n .filter(p => p !== 'None')\n .map(p => columns.includes(p))\n .includes(false);\n const active = columns.includes(c) || (isEverything && everythingSelected);\n const label = isEverything\n ? localize(language, 'visualization', 'everything title')\n : localize(language, 'visualization', `${columnNames[`${c}-${sankeyId}`]} title`);\n const copy = isEverything\n ? localize(language, 'visualization', 'everything description')\n : localize(language, 'visualization', `${columnNames[`${c}-${sankeyId}`]} description`);\n\n return (\n \n \n \n
\n
\n \n {label}\n \n \n
\n
\n \n {copy}\n \n
\n
\n
\n \n \n );\n })\n }\n \n );\n }, [columns, sankeyId, language, clickColumn]);\n\n const columnSelects = useMemo(() => {\n return (\n
\n {columns.concat(possibleColumns).slice(0, 3).map((c, i) => {\n let style = { 'margin': '0 auto' };\n if (i === 0) {\n style = { marginRight: 'auto' };\n } else if (i === (columns.length - 1)) {\n style = { marginLeft: 'auto' };\n }\n\n let position = i;\n if (i >= columns.length) {\n position = i === 0\n ? -2\n : possibleColumns.length;\n } else if (columns.length > 2) {\n position = 0;\n }\n const columnStyle = {\n transform: `translateX(${position * 100}%)`,\n zIndex: 5 + i,\n };\n\n return (\n
\n
\n {\n setDrawers(drawers => {\n const nextDrawers = drawers.slice();\n nextDrawers[i] = !nextDrawers[i];\n return nextDrawers;\n });\n }}\n >\n \n {localize(language, 'visualization', `${columnNames[`${c}-${sankeyId}`]} title`)}\n \n \n
\n
\n {possibleColumns.map((d, j) => d === c ? null : (\n {\n const isNone = d === 'None';\n let nextColumns = columns.slice();\n if (isNone) {\n clearHint();\n nextColumns.splice(i, 1);\n } else {\n nextColumns[i] = d;\n }\n setColumns(nextColumns);\n setDrawers(drawers.map(d => false));\n setSelected(null);\n setSubselect(null);\n }}\n >\n \n {columnNames[`${d}-${sankeyId}`]}\n \n
\n ))}\n
\n
\n \n );\n })}\n \n );\n }, [columns, drawers, sankeyId, clearHint, language]);\n\n const hint = useMemo(() => {\n const hintStates = [\n {\n copy: '',\n class: 'hidden',\n duration: null,\n next: null,\n },\n {\n copy: (\n \n {\n language === 'english' ?\n \"Let's start with School Site budgets. This is a simple break down of budgets for each school site. You can roll over or click on the diagram to see more detailed information. Next, let's see how school site is compared to another group. You can select another group above or you can select here \" :\n \"Comencemos con los presupuestos de las escuelas. Este es un desglose simple de los presupuestos para cada sitio escolar. Puede desplazarse o hacer clic en el diagrama para ver información más detallada. A continuación, veamos cómo se compara el sitio de la escuela con otro grupo. Puede seleccionar otro grupo arriba o puede seleccionar aquí \"\n }\n \n {language === 'english' ? \"Grant Names\" : \"Nombres de subvenciones\"}\n \n {language === 'english' ? ' or ' : ' o '}\n \n {language === 'english' ? 'Activities' : 'Actividades'}\n \n \n ),\n class: 'left',\n duration: null,\n // duration: 6000,\n next: 0,\n },\n {\n copy: localize(language, 'visualization', 'hint 2 left'),\n class: 'left',\n duration: 5000,\n next: 3,\n },\n {\n copy: localize(language, 'visualization', 'hint 3 right'),\n class: 'right',\n duration: 6000,\n next: 0,\n },\n ];\n const hintState = displayedHints.includes(hintIndex)\n ? hintStates[0]\n : hintStates[hintIndex];\n\n clearTimeout(hintHandle);\n if (hintState.duration) {\n hintHandle = setTimeout(() => {\n if (!displayedHints.includes(hintIndex)) {\n setDisplayedHints(displayedHints.concat(hintIndex));\n }\n setHintIndex(hintState.next);\n }, hintState.duration);\n }\n\n return (\n \n
\n x\n
\n \n {hintState.copy}\n \n \n );\n }, [hintIndex, displayedHints, clearHint, language, clickColumn]);\n\n // const GradientAnimation = useMemo(() => (\n // Keyframes.Spring(async next => {\n // while (true) {\n // await next({\n // from: {\n // offset: 15,\n // opacity: 1,\n // },\n // to: {\n // offset: 92.5,\n // opacity: 0.25,\n // },\n // });\n // await next({\n // from: {\n // offset: 92.5,\n // opacity: 0.25,\n // },\n // to: {\n // offset: 15,\n // opacity: 1,\n // },\n // });\n // }\n // })\n // ), []);\n\n const chordGradients = useMemo(() => (\n chords.map((c, i) => (\n \n \n \n \n ))\n ), [chords]);\n\n const chordPaths = useMemo(() => {\n const tooltipNameKey = tooltip ? generateKey(tooltip.name) : null;\n const tooltipParentKey = tooltip ? generateKey(tooltip.parent) : null;\n return (\n chords.map((c, i) => {\n const splitKey = c.key.split('-');\n const hovered = (\n (tooltip && splitKey.includes(tooltipNameKey) && splitKey.includes(tooltipParentKey))\n ||\n (hoverHighlight && splitKey.includes(hoverHighlight))\n );\n let opacity = hovered\n ? 0.375\n : 0.05; // 0.1;\n if (selected) {\n opacity = 0; // 0.025;\n // if (splitKey.includes(selected)) {\n if ((filterBySelection && c.activeTotal && !inlineEverything) || splitKey.includes(selected) || (splitKey.includes(subselect) && c.activeTotal)) {\n opacity = hovered\n ? 0.375 //0.5\n : tooltip || hoverHighlight\n ? 0.05 // 125\n : 0.125; // 25;\n }\n }\n return opacity ? (\n \n {({ opacity, path }) => (\n \n )}\n \n ) : null;\n })\n );\n }, [chords, selected, tooltip, filterBySelection, inlineEverything, subselect, hoverHighlight]);\n\n const columnGroups = useMemo(() => (\n columnData.map((column, i) => {\n const cx = i === 0 ? barWidth : width / (columnData.length - 1) * i;\n const isTwoColumnDuplicate = columns.length === 1 && i === 1 && column.key === columnData[0].key;\n const hideDuplicateLabels = columns.length === 1 && i === 0 && column.key === columnData[1].key;\n\n return isTwoColumnDuplicate ? null : (\n \n {column.data.map((segment, j) => {\n // const segmentSelected = (\n // !selected || segment.key === selected || segment.childKeys.includes(selected)\n // );\n const segmentSelected = (\n (filterBySelection && segment.height && !inlineEverything)\n ||\n (!selected || segment.key === selected || segment.childKeys.includes(selected) || (segment.childKeys.includes(subselect) && segment.height))\n );\n\n const textOpacity = inlineEverything && !segmentSelected\n ? 0.125\n : segmentSelected\n ? 1\n // : hideEverything\n // : (hideEverything || (!segment.colIncludesSelected && hideOtherCols)) && segment.height === 0\n : (hideEverything && segment.height === 0) || !filterBySelection\n ? 0\n : 0.1875; // so sorry\n\n const rectOpacity = segmentSelected\n ? 0.25\n : !filterBySelection\n ? 0\n : 0.125;\n const barType = segment.key === selected ? 'close' : 'open';\n // const textType = !segmentSelected && barType === 'open' && !hideEverything ? 'hidden' : 'none';\n const textType = 'hoverhighlight';\n const noSelect = textOpacity === 0;\n\n const subselectType = rectOpacity && !filterBySelection && segment.key !== selected ? 'subselect' : 'none';\n return (\n \n {({ transform, textOpacity, rectOpacity }) => (\n {\n clearHint();\n setInstruction(null);\n setSubselect(null);\n if (selected === segment.key) {\n setSelected(null);\n } else {\n setSelected(segment.key);\n }\n }}\n style={noSelect ? null : { cursor: 'pointer' }}\n >\n {segment.narrow ? (\n <>\n \n {localize(language, languageColumnTextKeys[column.key], segment.name.toLowerCase())}\n \n \n {/* ${segment.total.toLocaleString()} */}\n ${segment.activeTotal.toLocaleString()}\n \n \n ) : (\n \n {/* {segment.name} ${segment.total.toLocaleString()} */}\n {localize(language, languageColumnTextKeys[column.key], segment.name.toLowerCase())} ${segment.activeTotal.toLocaleString()}\n \n )}\n \n \n {segment.columns.map((c, k) => (\n \n {c.groups.map((group, l) => {\n const { value, percent, name } = group;\n const tall = group.height >= group.fontSize * 2;\n\n const showPercent = selected ? selected === group.parent : true;\n let topLabel = '';\n let bottomLabel = '';\n if (showName && tall) {\n bottomLabel = name;\n }\n if (showValue && showPercent) {\n topLabel = `${value} (${percent})`\n } else if (showValue) {\n topLabel = value;\n } else if (showPercent) {\n topLabel = percent;\n } else if (showName) {\n topLabel = name;\n bottomLabel = '';\n }\n if ((showValue || showPercent) && showName && !tall) {\n topLabel += ` ${name}`;\n }\n\n // const opacity = [segment.key, group.key].includes(selected) || !selected\n const subselectHover = (!filterBySelection && [segment.key, group.key].includes(subselect) && group.activeTotal);\n\n const opacity = !selected || (filterBySelection && group.height && !inlineEverything) || [segment.key, group.key].includes(selected) || subselectHover\n ? 1\n : inlineEverything\n ? 0.125\n : 0;\n\n return opacity ? (\n \n {({ transform,\n // opacity\n }) => (\n \n \n \n {\n // segment.narrow ? (\n // \n // ) : (\n // subselectHover ? null : (\n \n // )\n }\n {hideDuplicateLabels ? null : (\n <>\n = 0 ? segment.color : '#CC3300'}\n fill={group.activeTotal >= 0 ? segment.color : '#CC3300'}\n >\n {topLabel}\n \n = 0 ? segment.color : '#CC3300'}\n fill={group.activeTotal >= 0 ? segment.color : '#CC3300'}\n >\n {bottomLabel}\n \n \n )}\n \n )}\n \n ) : null;\n })}\n \n ))}\n \n \n )}\n \n );\n })}\n \n );\n })\n ), [columnData, columns.length, selected, width, clearHint, inlineEverything, hideEverything, filterBySelection, subselect, language]);\n // ), [columnData, columns.length, selected, width, clearHint, inlineEverything, hideEverything, hideOtherCols]);\n\n const colorLegend = useMemo(() => {\n const groupTotal = colorLegendData\n // .map(group => group.values.length)\n .map(group => group.values.filter(v => v.height).length)\n // .map(group => group.values.map(v => v.values.length).reduce((a, v) => a + v, 0))\n .reduce((a, v) => a + v, 0);\n\n const xScale = scaleLinear()\n .domain([0, groupTotal])\n .range([0, width]);\n\n const roundTo = 10000;\n let x = 0;\n const orderedColorData = colors.map((color, index) => {\n const group = colorLegendData.find(group => group.key === color);\n if (group) {\n group.x = x;\n group.width = Math.max(80, xScale(group.values.filter(v => v.height).length));\n // group.width = xScale(group.values.length);\n // group.width = xScale(group.values.map(v => v.values.length).reduce((a, v) => a + v, 0));\n x += group.width;\n const [start, end] = colorScale.invertExtent(color);\n group.start = start || 0;\n group.end = end || 0;\n const roundedValue = Math.round(group.start / roundTo) * roundTo;\n const displayValue = index === 0 ? group.start : roundedValue;\n group.label = `$${displayValue.toLocaleString()}${index === colors.length - 1 ? ' +' : ''}`;\n group.fontSize = fontScale(group.end);\n }\n return group;\n }).filter(g => g);\n\n return (\n \n {orderedColorData.map((group, index) => (\n \n {({ transform, width, fontSize }) => (\n \n \n {group.x === 0 ? null : (\n \n )}\n \n {group.label}\n \n \n )}\n \n ))}\n \n );\n }, [width, colorLegendData]);\n\n return (\n
\n
\n
\n

\n {localize(language, 'visualization', 'instruction')}\n

\n
\n
\n
\n {columnToggles}\n
\n
\n
\n \n {localize(language, 'visualization', 'legend description')}\n

\n
\n {\n //
\n // {\n // setInlineEverything(inlineEverything => !inlineEverything)\n // setHideEverything(hideEverything => !hideEverything)\n // }}\n // />\n // \n // {\n // const { pageX, pageY } = e;\n // setInstruction({\n // x: pageX,\n // y: pageY,\n // copy: 'Always Show Unselected Categories'\n // // ...dataset,\n // });\n // }}\n // onMouseOut={() => {\n // setInstruction(null);\n // }}\n // onClick={() => {\n // setInlineEverything(inlineEverything => !inlineEverything)\n // setHideEverything(hideEverything => !hideEverything)\n // }}\n // />\n //
\n //
\n // {\n // setFilterBySelection(filterBySelection => !filterBySelection)\n // }}\n // />\n // \n //
\n }\n {\n // <>\n //
\n // setInlineEverything(inlineEverything => !inlineEverything)}\n // />\n // \n //
\n //
\n // setHideEverything(hideEverything => !hideEverything)}\n // />\n // \n //
\n //
\n // setHideOtherCols(hideOtherCols => !hideOtherCols)}\n // />\n // \n //
\n // \n }\n
\n \n \n {colorLegend}\n \n
\n \n
\n
\n {language === 'english' ?\n Viewing All Budget Items\n : Visualización de todos los elementos del presupuesto\n }\n
\n
\n \n \n
\n {localize(language, 'visualization', 'filtered by').replace('[category]','')}\n\n {selectedDatum ? selectedDatum.name : ''}\n
\n {setSelected(null)}}\n >\n {localize(language, 'visualization', 'clear filter')}\n \n \n \n \n
\n {columnSelects}\n
\n {\n instruction ? (\n width / 2\n ? `translate(-110%, -50%)`\n : `translate(10%, -50%)`,\n }}\n >\n \n {\n instruction.copy\n ? instruction.copy\n : localize(language, 'visualization', 'tooltip click instruction 3')\n }\n \n \n ) : null\n }\n {\n tooltip ? (\n window.innerWidth / 3 * 2 ? '-105%' : '5%'}, -50%)`,\n transform: `translate(${tooltip.h === 'right' ? '5%' : '-105%'}, ${tooltip.v > height / 4 * 3 ? '-105%' : '5%' })`,\n }}\n onClick={e => e.stopPropagation()}\n onTouchEnd={e => e.stopPropagation()}\n onTouchStart={e => {\n e.stopPropagation();\n setTooltip(null);\n }}\n >\n
\n
\n \n {tooltip.parent}\n \n
\n
\n \n \n \n \n \n \n \n \n {tooltip.name}\n \n
\n
\n
\n
\n \n {localize(language, 'visualization', 'tooltip description').replace('[sub category]', tooltip.name).replace('[category]', tooltip.parent)}\n \n
\n
\n
\n {localize(language, 'visualization', 'total cost')}\n
\n
\n {tooltip.value}\n
\n
\n
\n
\n {localize(language, 'visualization', 'cost per student')}\n
\n
\n {tooltip.perstudent}\n
\n
\n
\n
\n {localize(language, 'visualization', 'students served')}\n
\n
\n {tooltip.students}\n
\n
\n
\n \n {\n tooltip.type === 'open'\n ? localize(language, 'visualization', 'tooltip click instruction')\n : localize(language, 'visualization', 'tooltip click instruction 2')\n }\n \n
\n
\n \n ) : null\n }\n \n {hint}\n {\n const { pageX, pageY, target } = e;\n const { dataset } = target;\n if (Object.keys(dataset).length) {\n const { type } = dataset;\n if (type === 'hoverhighlight') {\n const { hoverhighlight } = dataset;\n setHoverHighlight(hoverhighlight);\n setSubselect(null);\n setTooltip(null);\n setInstruction(null);\n } else if (type === 'subselect') {\n const { subselect } = dataset;\n setSubselect(subselect);\n setInstruction(null);\n setTooltip(null);\n setHoverHighlight(null);\n } else if (type === 'none') {\n // setSubselect(null);\n setInstruction(null);\n setTooltip(null);\n setHoverHighlight(null);\n } else if (type === 'hidden') {\n setSubselect(null);\n setTooltip(null);\n setHoverHighlight(null);\n setInstruction({\n x: pageX,\n y: pageY,\n ...dataset,\n });\n } else {\n // setSubselect(null);\n setInstruction(null);\n setHoverHighlight(null);\n setTooltip({\n x: pageX,\n y: pageY,\n ...dataset,\n });\n }\n } else {\n // setSubselect(null);\n setInstruction(null);\n setTooltip(null);\n setHoverHighlight(null);\n }\n // simplify this logic ^^^\n }}\n onMouseOut={() => {\n setTooltip(null);\n setInstruction(null);\n setHoverHighlight(null);\n }}\n >\n \n {chordGradients}\n \n {\n setInstruction(null);\n setHoverHighlight(null);\n setTooltip(null);\n setSelected(null);\n setSubselect(null);\n clearHint();\n }}\n fill='white'\n />\n {chordPaths}\n {columnGroups}\n \n \n \n );\n}\n","export default __webpack_public_path__ + \"static/media/arrowdown.f524f765.svg\";","export default __webpack_public_path__ + \"static/media/close.afb9fd72.svg\";","export default function exportSVG(svg) {\n\n //get svg source.\n var serializer = new XMLSerializer();\n var source = serializer.serializeToString(svg);\n\n var svgBlob = new Blob([source], {type:\"image/svg+xml;charset=utf-8\"});\n var svgUrl = URL.createObjectURL(svgBlob);\n var downloadLink = document.createElement(\"a\");\n downloadLink.href = svgUrl;\n downloadLink.download = \"graph.svg\";\n document.body.appendChild(downloadLink);\n downloadLink.click();\n document.body.removeChild(downloadLink);\n}\n","import useDimensions from 'react-use-dimensions';\n\n// import Links from '../Links';\nimport Sankey from '../Sankey';\n\nimport './styles.scss';\n\nexport default function SankeyPage(props) {\n const { data, title, description } = props;\n\n const [sankeyRef, { width }] = useDimensions();\n\n // const linkStyle = window.innerWidth <= 768 ? {\n // marginLeft: 'calc(0.5em - 1px)',\n // marginRight: '1.5em - 1px',\n // } : {\n // marginLeft: 'calc(3.5em - 1px)',\n // };\n\n return data ? (\n
\n {/* */}\n \n
\n
\n

\n {title}\n

\n {description}\n
\n {\n //
\n //
\n //
\n // \n // I want to see the budget in greater detail\n // \n //
\n //
\n // \n // You can find detailed information on the budgets via the “Download the Data” button in the top right of this page. And if you still have questions, please email rmatsumoto@ravenswoodschools.org\n // \n //
\n //
\n //
\n }\n
\n \n
\n \n ) : null;\n}\n","import './styles.scss';\nimport { useContext } from 'react'\nimport { LanguageContext, localize } from '../Localization'\n\nexport default function Intro(props) {\n const language = useContext(LanguageContext)\n return (\n
\n
\n \n {localize(language, 'footer', 'footer')}{' '}\n Pitch Interactive, Inc.\n \n
\n
\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n BrowserRouter as Router,\n Switch,\n Route,\n} from \"react-router-dom\";\nimport { csvParse } from 'd3-dsv';\nimport { group } from 'd3-array';\n\nimport Header from './Header';\nimport About from './About';\nimport Intro from './Intro';\nimport SankeyPage from './SankeyPage';\nimport { generateKey } from './Sankey';\nimport Footer from './Footer';\nimport mapToNest from './mapToNest.js';\nimport { LanguageContext, localize, isReady } from './Localization';\n\nimport './App.scss';\n\nconst schoolSites = `${process.env.PUBLIC_URL}/ravenswood-ssb.csv`;\nconst centralSupports = `${process.env.PUBLIC_URL}/ravenswood-csa.csv`;\n\nfunction formatCSV(text) {\n const textByLine = text.split('\\n');\n const headerIndex = textByLine.findIndex(d => d.includes('Total Costs'));\n const cleanedText = textByLine.slice(headerIndex).join('\\n');\n const csv = csvParse(cleanedText)\n .map(d => {\n d.selectionKeys = [\n generateKey(d['Resource / Grant']),\n generateKey(d['School Site/Department']),\n generateKey(d['Activity']),\n ].filter(d => d !== '');\n d['Total Costs'] = +(d['Total Costs'].trim().replace(/[^0-9]/g, ''));\n return d;\n }).filter(d => d.selectionKeys.length);\n return csv;\n}\n\nexport default function App() {\n const [schoolData, setSchoolData] = useState([]);\n const [centralData, setCentralData] = useState([]);\n const [summaryData, setSummaryData] = useState([]);\n const [totalValue, setTotalValue] = useState(0);\n const [language, setLanguage] = useState('english')\n\n useEffect(() => {\n window.fetch(schoolSites)\n .then(value => value.text())\n .then(text => {\n const csv = formatCSV(text);\n setSchoolData(csv);\n });\n\n window.fetch(centralSupports)\n .then(value => value.text())\n .then(text => {\n const csv = formatCSV(text);\n setCentralData(csv);\n });\n }, []);\n\n useEffect(() => {\n if (schoolData.length && centralData.length) {\n const combinedData = schoolData.concat(centralData);\n const summaryData = mapToNest(group(combinedData, d => d['Central / SSBC / Schools / Out of District']))\n .map(d => {\n d.value = d.values.map(v => v['Total Costs']).reduce((a, v) => a + v, 0);\n return d;\n });\n setSummaryData(summaryData);\n\n const totalValue = summaryData.map(d => d.value).reduce((a, v) => a + v, 0);\n setTotalValue(totalValue);\n }\n }, [schoolData, centralData]);\n\n return !isReady() ? null : (\n \n
\n {\n // <>\n //
\n //
\n // \n }\n \n
\n \n \n \n \n \n \n

\n {localize(language, 'school site budgets', 'description')}\n

\n

\n {localize(language, 'school site budgets', 'funding title')}\n

\n

\n {localize(language, 'school site budgets', 'funding description')}\n

\n
\n )}\n />\n \n \n \n

\n {localize(language, 'central supports and admin', 'description')}\n

\n
\n )}\n />\n \n \n \n \n \n
\n \n
\n
\n );\n}\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}