langgraph-controller.ts.html 513 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>Code coverage report for modules/book-generator/langgraph-controller.ts</title>
  5. <meta charset="utf-8" />
  6. <link rel="stylesheet" href="../../prettify.css" />
  7. <link rel="stylesheet" href="../../base.css" />
  8. <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
  9. <meta name="viewport" content="width=device-width, initial-scale=1" />
  10. <style type='text/css'>
  11. .coverage-summary .sorter {
  12. background-image: url(../../sort-arrow-sprite.png);
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div class='wrapper'>
  18. <div class='pad1'>
  19. <h1><a href="../../index.html">All files</a> / <a href="index.html">modules/book-generator</a> langgraph-controller.ts</h1>
  20. <div class='clearfix'>
  21. <div class='fl pad1y space-right2'>
  22. <span class="strong">0% </span>
  23. <span class="quiet">Statements</span>
  24. <span class='fraction'>0/2220</span>
  25. </div>
  26. <div class='fl pad1y space-right2'>
  27. <span class="strong">0% </span>
  28. <span class="quiet">Branches</span>
  29. <span class='fraction'>0/1</span>
  30. </div>
  31. <div class='fl pad1y space-right2'>
  32. <span class="strong">0% </span>
  33. <span class="quiet">Functions</span>
  34. <span class='fraction'>0/1</span>
  35. </div>
  36. <div class='fl pad1y space-right2'>
  37. <span class="strong">0% </span>
  38. <span class="quiet">Lines</span>
  39. <span class='fraction'>0/2220</span>
  40. </div>
  41. </div>
  42. <p class="quiet">
  43. Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
  44. </p>
  45. <template id="filterTemplate">
  46. <div class="quiet">
  47. Filter:
  48. <input type="search" id="fileSearch">
  49. </div>
  50. </template>
  51. </div>
  52. <div class='status-line low'></div>
  53. <pre><table class="coverage">
  54. <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
  55. <a name='L2'></a><a href='#L2'>2</a>
  56. <a name='L3'></a><a href='#L3'>3</a>
  57. <a name='L4'></a><a href='#L4'>4</a>
  58. <a name='L5'></a><a href='#L5'>5</a>
  59. <a name='L6'></a><a href='#L6'>6</a>
  60. <a name='L7'></a><a href='#L7'>7</a>
  61. <a name='L8'></a><a href='#L8'>8</a>
  62. <a name='L9'></a><a href='#L9'>9</a>
  63. <a name='L10'></a><a href='#L10'>10</a>
  64. <a name='L11'></a><a href='#L11'>11</a>
  65. <a name='L12'></a><a href='#L12'>12</a>
  66. <a name='L13'></a><a href='#L13'>13</a>
  67. <a name='L14'></a><a href='#L14'>14</a>
  68. <a name='L15'></a><a href='#L15'>15</a>
  69. <a name='L16'></a><a href='#L16'>16</a>
  70. <a name='L17'></a><a href='#L17'>17</a>
  71. <a name='L18'></a><a href='#L18'>18</a>
  72. <a name='L19'></a><a href='#L19'>19</a>
  73. <a name='L20'></a><a href='#L20'>20</a>
  74. <a name='L21'></a><a href='#L21'>21</a>
  75. <a name='L22'></a><a href='#L22'>22</a>
  76. <a name='L23'></a><a href='#L23'>23</a>
  77. <a name='L24'></a><a href='#L24'>24</a>
  78. <a name='L25'></a><a href='#L25'>25</a>
  79. <a name='L26'></a><a href='#L26'>26</a>
  80. <a name='L27'></a><a href='#L27'>27</a>
  81. <a name='L28'></a><a href='#L28'>28</a>
  82. <a name='L29'></a><a href='#L29'>29</a>
  83. <a name='L30'></a><a href='#L30'>30</a>
  84. <a name='L31'></a><a href='#L31'>31</a>
  85. <a name='L32'></a><a href='#L32'>32</a>
  86. <a name='L33'></a><a href='#L33'>33</a>
  87. <a name='L34'></a><a href='#L34'>34</a>
  88. <a name='L35'></a><a href='#L35'>35</a>
  89. <a name='L36'></a><a href='#L36'>36</a>
  90. <a name='L37'></a><a href='#L37'>37</a>
  91. <a name='L38'></a><a href='#L38'>38</a>
  92. <a name='L39'></a><a href='#L39'>39</a>
  93. <a name='L40'></a><a href='#L40'>40</a>
  94. <a name='L41'></a><a href='#L41'>41</a>
  95. <a name='L42'></a><a href='#L42'>42</a>
  96. <a name='L43'></a><a href='#L43'>43</a>
  97. <a name='L44'></a><a href='#L44'>44</a>
  98. <a name='L45'></a><a href='#L45'>45</a>
  99. <a name='L46'></a><a href='#L46'>46</a>
  100. <a name='L47'></a><a href='#L47'>47</a>
  101. <a name='L48'></a><a href='#L48'>48</a>
  102. <a name='L49'></a><a href='#L49'>49</a>
  103. <a name='L50'></a><a href='#L50'>50</a>
  104. <a name='L51'></a><a href='#L51'>51</a>
  105. <a name='L52'></a><a href='#L52'>52</a>
  106. <a name='L53'></a><a href='#L53'>53</a>
  107. <a name='L54'></a><a href='#L54'>54</a>
  108. <a name='L55'></a><a href='#L55'>55</a>
  109. <a name='L56'></a><a href='#L56'>56</a>
  110. <a name='L57'></a><a href='#L57'>57</a>
  111. <a name='L58'></a><a href='#L58'>58</a>
  112. <a name='L59'></a><a href='#L59'>59</a>
  113. <a name='L60'></a><a href='#L60'>60</a>
  114. <a name='L61'></a><a href='#L61'>61</a>
  115. <a name='L62'></a><a href='#L62'>62</a>
  116. <a name='L63'></a><a href='#L63'>63</a>
  117. <a name='L64'></a><a href='#L64'>64</a>
  118. <a name='L65'></a><a href='#L65'>65</a>
  119. <a name='L66'></a><a href='#L66'>66</a>
  120. <a name='L67'></a><a href='#L67'>67</a>
  121. <a name='L68'></a><a href='#L68'>68</a>
  122. <a name='L69'></a><a href='#L69'>69</a>
  123. <a name='L70'></a><a href='#L70'>70</a>
  124. <a name='L71'></a><a href='#L71'>71</a>
  125. <a name='L72'></a><a href='#L72'>72</a>
  126. <a name='L73'></a><a href='#L73'>73</a>
  127. <a name='L74'></a><a href='#L74'>74</a>
  128. <a name='L75'></a><a href='#L75'>75</a>
  129. <a name='L76'></a><a href='#L76'>76</a>
  130. <a name='L77'></a><a href='#L77'>77</a>
  131. <a name='L78'></a><a href='#L78'>78</a>
  132. <a name='L79'></a><a href='#L79'>79</a>
  133. <a name='L80'></a><a href='#L80'>80</a>
  134. <a name='L81'></a><a href='#L81'>81</a>
  135. <a name='L82'></a><a href='#L82'>82</a>
  136. <a name='L83'></a><a href='#L83'>83</a>
  137. <a name='L84'></a><a href='#L84'>84</a>
  138. <a name='L85'></a><a href='#L85'>85</a>
  139. <a name='L86'></a><a href='#L86'>86</a>
  140. <a name='L87'></a><a href='#L87'>87</a>
  141. <a name='L88'></a><a href='#L88'>88</a>
  142. <a name='L89'></a><a href='#L89'>89</a>
  143. <a name='L90'></a><a href='#L90'>90</a>
  144. <a name='L91'></a><a href='#L91'>91</a>
  145. <a name='L92'></a><a href='#L92'>92</a>
  146. <a name='L93'></a><a href='#L93'>93</a>
  147. <a name='L94'></a><a href='#L94'>94</a>
  148. <a name='L95'></a><a href='#L95'>95</a>
  149. <a name='L96'></a><a href='#L96'>96</a>
  150. <a name='L97'></a><a href='#L97'>97</a>
  151. <a name='L98'></a><a href='#L98'>98</a>
  152. <a name='L99'></a><a href='#L99'>99</a>
  153. <a name='L100'></a><a href='#L100'>100</a>
  154. <a name='L101'></a><a href='#L101'>101</a>
  155. <a name='L102'></a><a href='#L102'>102</a>
  156. <a name='L103'></a><a href='#L103'>103</a>
  157. <a name='L104'></a><a href='#L104'>104</a>
  158. <a name='L105'></a><a href='#L105'>105</a>
  159. <a name='L106'></a><a href='#L106'>106</a>
  160. <a name='L107'></a><a href='#L107'>107</a>
  161. <a name='L108'></a><a href='#L108'>108</a>
  162. <a name='L109'></a><a href='#L109'>109</a>
  163. <a name='L110'></a><a href='#L110'>110</a>
  164. <a name='L111'></a><a href='#L111'>111</a>
  165. <a name='L112'></a><a href='#L112'>112</a>
  166. <a name='L113'></a><a href='#L113'>113</a>
  167. <a name='L114'></a><a href='#L114'>114</a>
  168. <a name='L115'></a><a href='#L115'>115</a>
  169. <a name='L116'></a><a href='#L116'>116</a>
  170. <a name='L117'></a><a href='#L117'>117</a>
  171. <a name='L118'></a><a href='#L118'>118</a>
  172. <a name='L119'></a><a href='#L119'>119</a>
  173. <a name='L120'></a><a href='#L120'>120</a>
  174. <a name='L121'></a><a href='#L121'>121</a>
  175. <a name='L122'></a><a href='#L122'>122</a>
  176. <a name='L123'></a><a href='#L123'>123</a>
  177. <a name='L124'></a><a href='#L124'>124</a>
  178. <a name='L125'></a><a href='#L125'>125</a>
  179. <a name='L126'></a><a href='#L126'>126</a>
  180. <a name='L127'></a><a href='#L127'>127</a>
  181. <a name='L128'></a><a href='#L128'>128</a>
  182. <a name='L129'></a><a href='#L129'>129</a>
  183. <a name='L130'></a><a href='#L130'>130</a>
  184. <a name='L131'></a><a href='#L131'>131</a>
  185. <a name='L132'></a><a href='#L132'>132</a>
  186. <a name='L133'></a><a href='#L133'>133</a>
  187. <a name='L134'></a><a href='#L134'>134</a>
  188. <a name='L135'></a><a href='#L135'>135</a>
  189. <a name='L136'></a><a href='#L136'>136</a>
  190. <a name='L137'></a><a href='#L137'>137</a>
  191. <a name='L138'></a><a href='#L138'>138</a>
  192. <a name='L139'></a><a href='#L139'>139</a>
  193. <a name='L140'></a><a href='#L140'>140</a>
  194. <a name='L141'></a><a href='#L141'>141</a>
  195. <a name='L142'></a><a href='#L142'>142</a>
  196. <a name='L143'></a><a href='#L143'>143</a>
  197. <a name='L144'></a><a href='#L144'>144</a>
  198. <a name='L145'></a><a href='#L145'>145</a>
  199. <a name='L146'></a><a href='#L146'>146</a>
  200. <a name='L147'></a><a href='#L147'>147</a>
  201. <a name='L148'></a><a href='#L148'>148</a>
  202. <a name='L149'></a><a href='#L149'>149</a>
  203. <a name='L150'></a><a href='#L150'>150</a>
  204. <a name='L151'></a><a href='#L151'>151</a>
  205. <a name='L152'></a><a href='#L152'>152</a>
  206. <a name='L153'></a><a href='#L153'>153</a>
  207. <a name='L154'></a><a href='#L154'>154</a>
  208. <a name='L155'></a><a href='#L155'>155</a>
  209. <a name='L156'></a><a href='#L156'>156</a>
  210. <a name='L157'></a><a href='#L157'>157</a>
  211. <a name='L158'></a><a href='#L158'>158</a>
  212. <a name='L159'></a><a href='#L159'>159</a>
  213. <a name='L160'></a><a href='#L160'>160</a>
  214. <a name='L161'></a><a href='#L161'>161</a>
  215. <a name='L162'></a><a href='#L162'>162</a>
  216. <a name='L163'></a><a href='#L163'>163</a>
  217. <a name='L164'></a><a href='#L164'>164</a>
  218. <a name='L165'></a><a href='#L165'>165</a>
  219. <a name='L166'></a><a href='#L166'>166</a>
  220. <a name='L167'></a><a href='#L167'>167</a>
  221. <a name='L168'></a><a href='#L168'>168</a>
  222. <a name='L169'></a><a href='#L169'>169</a>
  223. <a name='L170'></a><a href='#L170'>170</a>
  224. <a name='L171'></a><a href='#L171'>171</a>
  225. <a name='L172'></a><a href='#L172'>172</a>
  226. <a name='L173'></a><a href='#L173'>173</a>
  227. <a name='L174'></a><a href='#L174'>174</a>
  228. <a name='L175'></a><a href='#L175'>175</a>
  229. <a name='L176'></a><a href='#L176'>176</a>
  230. <a name='L177'></a><a href='#L177'>177</a>
  231. <a name='L178'></a><a href='#L178'>178</a>
  232. <a name='L179'></a><a href='#L179'>179</a>
  233. <a name='L180'></a><a href='#L180'>180</a>
  234. <a name='L181'></a><a href='#L181'>181</a>
  235. <a name='L182'></a><a href='#L182'>182</a>
  236. <a name='L183'></a><a href='#L183'>183</a>
  237. <a name='L184'></a><a href='#L184'>184</a>
  238. <a name='L185'></a><a href='#L185'>185</a>
  239. <a name='L186'></a><a href='#L186'>186</a>
  240. <a name='L187'></a><a href='#L187'>187</a>
  241. <a name='L188'></a><a href='#L188'>188</a>
  242. <a name='L189'></a><a href='#L189'>189</a>
  243. <a name='L190'></a><a href='#L190'>190</a>
  244. <a name='L191'></a><a href='#L191'>191</a>
  245. <a name='L192'></a><a href='#L192'>192</a>
  246. <a name='L193'></a><a href='#L193'>193</a>
  247. <a name='L194'></a><a href='#L194'>194</a>
  248. <a name='L195'></a><a href='#L195'>195</a>
  249. <a name='L196'></a><a href='#L196'>196</a>
  250. <a name='L197'></a><a href='#L197'>197</a>
  251. <a name='L198'></a><a href='#L198'>198</a>
  252. <a name='L199'></a><a href='#L199'>199</a>
  253. <a name='L200'></a><a href='#L200'>200</a>
  254. <a name='L201'></a><a href='#L201'>201</a>
  255. <a name='L202'></a><a href='#L202'>202</a>
  256. <a name='L203'></a><a href='#L203'>203</a>
  257. <a name='L204'></a><a href='#L204'>204</a>
  258. <a name='L205'></a><a href='#L205'>205</a>
  259. <a name='L206'></a><a href='#L206'>206</a>
  260. <a name='L207'></a><a href='#L207'>207</a>
  261. <a name='L208'></a><a href='#L208'>208</a>
  262. <a name='L209'></a><a href='#L209'>209</a>
  263. <a name='L210'></a><a href='#L210'>210</a>
  264. <a name='L211'></a><a href='#L211'>211</a>
  265. <a name='L212'></a><a href='#L212'>212</a>
  266. <a name='L213'></a><a href='#L213'>213</a>
  267. <a name='L214'></a><a href='#L214'>214</a>
  268. <a name='L215'></a><a href='#L215'>215</a>
  269. <a name='L216'></a><a href='#L216'>216</a>
  270. <a name='L217'></a><a href='#L217'>217</a>
  271. <a name='L218'></a><a href='#L218'>218</a>
  272. <a name='L219'></a><a href='#L219'>219</a>
  273. <a name='L220'></a><a href='#L220'>220</a>
  274. <a name='L221'></a><a href='#L221'>221</a>
  275. <a name='L222'></a><a href='#L222'>222</a>
  276. <a name='L223'></a><a href='#L223'>223</a>
  277. <a name='L224'></a><a href='#L224'>224</a>
  278. <a name='L225'></a><a href='#L225'>225</a>
  279. <a name='L226'></a><a href='#L226'>226</a>
  280. <a name='L227'></a><a href='#L227'>227</a>
  281. <a name='L228'></a><a href='#L228'>228</a>
  282. <a name='L229'></a><a href='#L229'>229</a>
  283. <a name='L230'></a><a href='#L230'>230</a>
  284. <a name='L231'></a><a href='#L231'>231</a>
  285. <a name='L232'></a><a href='#L232'>232</a>
  286. <a name='L233'></a><a href='#L233'>233</a>
  287. <a name='L234'></a><a href='#L234'>234</a>
  288. <a name='L235'></a><a href='#L235'>235</a>
  289. <a name='L236'></a><a href='#L236'>236</a>
  290. <a name='L237'></a><a href='#L237'>237</a>
  291. <a name='L238'></a><a href='#L238'>238</a>
  292. <a name='L239'></a><a href='#L239'>239</a>
  293. <a name='L240'></a><a href='#L240'>240</a>
  294. <a name='L241'></a><a href='#L241'>241</a>
  295. <a name='L242'></a><a href='#L242'>242</a>
  296. <a name='L243'></a><a href='#L243'>243</a>
  297. <a name='L244'></a><a href='#L244'>244</a>
  298. <a name='L245'></a><a href='#L245'>245</a>
  299. <a name='L246'></a><a href='#L246'>246</a>
  300. <a name='L247'></a><a href='#L247'>247</a>
  301. <a name='L248'></a><a href='#L248'>248</a>
  302. <a name='L249'></a><a href='#L249'>249</a>
  303. <a name='L250'></a><a href='#L250'>250</a>
  304. <a name='L251'></a><a href='#L251'>251</a>
  305. <a name='L252'></a><a href='#L252'>252</a>
  306. <a name='L253'></a><a href='#L253'>253</a>
  307. <a name='L254'></a><a href='#L254'>254</a>
  308. <a name='L255'></a><a href='#L255'>255</a>
  309. <a name='L256'></a><a href='#L256'>256</a>
  310. <a name='L257'></a><a href='#L257'>257</a>
  311. <a name='L258'></a><a href='#L258'>258</a>
  312. <a name='L259'></a><a href='#L259'>259</a>
  313. <a name='L260'></a><a href='#L260'>260</a>
  314. <a name='L261'></a><a href='#L261'>261</a>
  315. <a name='L262'></a><a href='#L262'>262</a>
  316. <a name='L263'></a><a href='#L263'>263</a>
  317. <a name='L264'></a><a href='#L264'>264</a>
  318. <a name='L265'></a><a href='#L265'>265</a>
  319. <a name='L266'></a><a href='#L266'>266</a>
  320. <a name='L267'></a><a href='#L267'>267</a>
  321. <a name='L268'></a><a href='#L268'>268</a>
  322. <a name='L269'></a><a href='#L269'>269</a>
  323. <a name='L270'></a><a href='#L270'>270</a>
  324. <a name='L271'></a><a href='#L271'>271</a>
  325. <a name='L272'></a><a href='#L272'>272</a>
  326. <a name='L273'></a><a href='#L273'>273</a>
  327. <a name='L274'></a><a href='#L274'>274</a>
  328. <a name='L275'></a><a href='#L275'>275</a>
  329. <a name='L276'></a><a href='#L276'>276</a>
  330. <a name='L277'></a><a href='#L277'>277</a>
  331. <a name='L278'></a><a href='#L278'>278</a>
  332. <a name='L279'></a><a href='#L279'>279</a>
  333. <a name='L280'></a><a href='#L280'>280</a>
  334. <a name='L281'></a><a href='#L281'>281</a>
  335. <a name='L282'></a><a href='#L282'>282</a>
  336. <a name='L283'></a><a href='#L283'>283</a>
  337. <a name='L284'></a><a href='#L284'>284</a>
  338. <a name='L285'></a><a href='#L285'>285</a>
  339. <a name='L286'></a><a href='#L286'>286</a>
  340. <a name='L287'></a><a href='#L287'>287</a>
  341. <a name='L288'></a><a href='#L288'>288</a>
  342. <a name='L289'></a><a href='#L289'>289</a>
  343. <a name='L290'></a><a href='#L290'>290</a>
  344. <a name='L291'></a><a href='#L291'>291</a>
  345. <a name='L292'></a><a href='#L292'>292</a>
  346. <a name='L293'></a><a href='#L293'>293</a>
  347. <a name='L294'></a><a href='#L294'>294</a>
  348. <a name='L295'></a><a href='#L295'>295</a>
  349. <a name='L296'></a><a href='#L296'>296</a>
  350. <a name='L297'></a><a href='#L297'>297</a>
  351. <a name='L298'></a><a href='#L298'>298</a>
  352. <a name='L299'></a><a href='#L299'>299</a>
  353. <a name='L300'></a><a href='#L300'>300</a>
  354. <a name='L301'></a><a href='#L301'>301</a>
  355. <a name='L302'></a><a href='#L302'>302</a>
  356. <a name='L303'></a><a href='#L303'>303</a>
  357. <a name='L304'></a><a href='#L304'>304</a>
  358. <a name='L305'></a><a href='#L305'>305</a>
  359. <a name='L306'></a><a href='#L306'>306</a>
  360. <a name='L307'></a><a href='#L307'>307</a>
  361. <a name='L308'></a><a href='#L308'>308</a>
  362. <a name='L309'></a><a href='#L309'>309</a>
  363. <a name='L310'></a><a href='#L310'>310</a>
  364. <a name='L311'></a><a href='#L311'>311</a>
  365. <a name='L312'></a><a href='#L312'>312</a>
  366. <a name='L313'></a><a href='#L313'>313</a>
  367. <a name='L314'></a><a href='#L314'>314</a>
  368. <a name='L315'></a><a href='#L315'>315</a>
  369. <a name='L316'></a><a href='#L316'>316</a>
  370. <a name='L317'></a><a href='#L317'>317</a>
  371. <a name='L318'></a><a href='#L318'>318</a>
  372. <a name='L319'></a><a href='#L319'>319</a>
  373. <a name='L320'></a><a href='#L320'>320</a>
  374. <a name='L321'></a><a href='#L321'>321</a>
  375. <a name='L322'></a><a href='#L322'>322</a>
  376. <a name='L323'></a><a href='#L323'>323</a>
  377. <a name='L324'></a><a href='#L324'>324</a>
  378. <a name='L325'></a><a href='#L325'>325</a>
  379. <a name='L326'></a><a href='#L326'>326</a>
  380. <a name='L327'></a><a href='#L327'>327</a>
  381. <a name='L328'></a><a href='#L328'>328</a>
  382. <a name='L329'></a><a href='#L329'>329</a>
  383. <a name='L330'></a><a href='#L330'>330</a>
  384. <a name='L331'></a><a href='#L331'>331</a>
  385. <a name='L332'></a><a href='#L332'>332</a>
  386. <a name='L333'></a><a href='#L333'>333</a>
  387. <a name='L334'></a><a href='#L334'>334</a>
  388. <a name='L335'></a><a href='#L335'>335</a>
  389. <a name='L336'></a><a href='#L336'>336</a>
  390. <a name='L337'></a><a href='#L337'>337</a>
  391. <a name='L338'></a><a href='#L338'>338</a>
  392. <a name='L339'></a><a href='#L339'>339</a>
  393. <a name='L340'></a><a href='#L340'>340</a>
  394. <a name='L341'></a><a href='#L341'>341</a>
  395. <a name='L342'></a><a href='#L342'>342</a>
  396. <a name='L343'></a><a href='#L343'>343</a>
  397. <a name='L344'></a><a href='#L344'>344</a>
  398. <a name='L345'></a><a href='#L345'>345</a>
  399. <a name='L346'></a><a href='#L346'>346</a>
  400. <a name='L347'></a><a href='#L347'>347</a>
  401. <a name='L348'></a><a href='#L348'>348</a>
  402. <a name='L349'></a><a href='#L349'>349</a>
  403. <a name='L350'></a><a href='#L350'>350</a>
  404. <a name='L351'></a><a href='#L351'>351</a>
  405. <a name='L352'></a><a href='#L352'>352</a>
  406. <a name='L353'></a><a href='#L353'>353</a>
  407. <a name='L354'></a><a href='#L354'>354</a>
  408. <a name='L355'></a><a href='#L355'>355</a>
  409. <a name='L356'></a><a href='#L356'>356</a>
  410. <a name='L357'></a><a href='#L357'>357</a>
  411. <a name='L358'></a><a href='#L358'>358</a>
  412. <a name='L359'></a><a href='#L359'>359</a>
  413. <a name='L360'></a><a href='#L360'>360</a>
  414. <a name='L361'></a><a href='#L361'>361</a>
  415. <a name='L362'></a><a href='#L362'>362</a>
  416. <a name='L363'></a><a href='#L363'>363</a>
  417. <a name='L364'></a><a href='#L364'>364</a>
  418. <a name='L365'></a><a href='#L365'>365</a>
  419. <a name='L366'></a><a href='#L366'>366</a>
  420. <a name='L367'></a><a href='#L367'>367</a>
  421. <a name='L368'></a><a href='#L368'>368</a>
  422. <a name='L369'></a><a href='#L369'>369</a>
  423. <a name='L370'></a><a href='#L370'>370</a>
  424. <a name='L371'></a><a href='#L371'>371</a>
  425. <a name='L372'></a><a href='#L372'>372</a>
  426. <a name='L373'></a><a href='#L373'>373</a>
  427. <a name='L374'></a><a href='#L374'>374</a>
  428. <a name='L375'></a><a href='#L375'>375</a>
  429. <a name='L376'></a><a href='#L376'>376</a>
  430. <a name='L377'></a><a href='#L377'>377</a>
  431. <a name='L378'></a><a href='#L378'>378</a>
  432. <a name='L379'></a><a href='#L379'>379</a>
  433. <a name='L380'></a><a href='#L380'>380</a>
  434. <a name='L381'></a><a href='#L381'>381</a>
  435. <a name='L382'></a><a href='#L382'>382</a>
  436. <a name='L383'></a><a href='#L383'>383</a>
  437. <a name='L384'></a><a href='#L384'>384</a>
  438. <a name='L385'></a><a href='#L385'>385</a>
  439. <a name='L386'></a><a href='#L386'>386</a>
  440. <a name='L387'></a><a href='#L387'>387</a>
  441. <a name='L388'></a><a href='#L388'>388</a>
  442. <a name='L389'></a><a href='#L389'>389</a>
  443. <a name='L390'></a><a href='#L390'>390</a>
  444. <a name='L391'></a><a href='#L391'>391</a>
  445. <a name='L392'></a><a href='#L392'>392</a>
  446. <a name='L393'></a><a href='#L393'>393</a>
  447. <a name='L394'></a><a href='#L394'>394</a>
  448. <a name='L395'></a><a href='#L395'>395</a>
  449. <a name='L396'></a><a href='#L396'>396</a>
  450. <a name='L397'></a><a href='#L397'>397</a>
  451. <a name='L398'></a><a href='#L398'>398</a>
  452. <a name='L399'></a><a href='#L399'>399</a>
  453. <a name='L400'></a><a href='#L400'>400</a>
  454. <a name='L401'></a><a href='#L401'>401</a>
  455. <a name='L402'></a><a href='#L402'>402</a>
  456. <a name='L403'></a><a href='#L403'>403</a>
  457. <a name='L404'></a><a href='#L404'>404</a>
  458. <a name='L405'></a><a href='#L405'>405</a>
  459. <a name='L406'></a><a href='#L406'>406</a>
  460. <a name='L407'></a><a href='#L407'>407</a>
  461. <a name='L408'></a><a href='#L408'>408</a>
  462. <a name='L409'></a><a href='#L409'>409</a>
  463. <a name='L410'></a><a href='#L410'>410</a>
  464. <a name='L411'></a><a href='#L411'>411</a>
  465. <a name='L412'></a><a href='#L412'>412</a>
  466. <a name='L413'></a><a href='#L413'>413</a>
  467. <a name='L414'></a><a href='#L414'>414</a>
  468. <a name='L415'></a><a href='#L415'>415</a>
  469. <a name='L416'></a><a href='#L416'>416</a>
  470. <a name='L417'></a><a href='#L417'>417</a>
  471. <a name='L418'></a><a href='#L418'>418</a>
  472. <a name='L419'></a><a href='#L419'>419</a>
  473. <a name='L420'></a><a href='#L420'>420</a>
  474. <a name='L421'></a><a href='#L421'>421</a>
  475. <a name='L422'></a><a href='#L422'>422</a>
  476. <a name='L423'></a><a href='#L423'>423</a>
  477. <a name='L424'></a><a href='#L424'>424</a>
  478. <a name='L425'></a><a href='#L425'>425</a>
  479. <a name='L426'></a><a href='#L426'>426</a>
  480. <a name='L427'></a><a href='#L427'>427</a>
  481. <a name='L428'></a><a href='#L428'>428</a>
  482. <a name='L429'></a><a href='#L429'>429</a>
  483. <a name='L430'></a><a href='#L430'>430</a>
  484. <a name='L431'></a><a href='#L431'>431</a>
  485. <a name='L432'></a><a href='#L432'>432</a>
  486. <a name='L433'></a><a href='#L433'>433</a>
  487. <a name='L434'></a><a href='#L434'>434</a>
  488. <a name='L435'></a><a href='#L435'>435</a>
  489. <a name='L436'></a><a href='#L436'>436</a>
  490. <a name='L437'></a><a href='#L437'>437</a>
  491. <a name='L438'></a><a href='#L438'>438</a>
  492. <a name='L439'></a><a href='#L439'>439</a>
  493. <a name='L440'></a><a href='#L440'>440</a>
  494. <a name='L441'></a><a href='#L441'>441</a>
  495. <a name='L442'></a><a href='#L442'>442</a>
  496. <a name='L443'></a><a href='#L443'>443</a>
  497. <a name='L444'></a><a href='#L444'>444</a>
  498. <a name='L445'></a><a href='#L445'>445</a>
  499. <a name='L446'></a><a href='#L446'>446</a>
  500. <a name='L447'></a><a href='#L447'>447</a>
  501. <a name='L448'></a><a href='#L448'>448</a>
  502. <a name='L449'></a><a href='#L449'>449</a>
  503. <a name='L450'></a><a href='#L450'>450</a>
  504. <a name='L451'></a><a href='#L451'>451</a>
  505. <a name='L452'></a><a href='#L452'>452</a>
  506. <a name='L453'></a><a href='#L453'>453</a>
  507. <a name='L454'></a><a href='#L454'>454</a>
  508. <a name='L455'></a><a href='#L455'>455</a>
  509. <a name='L456'></a><a href='#L456'>456</a>
  510. <a name='L457'></a><a href='#L457'>457</a>
  511. <a name='L458'></a><a href='#L458'>458</a>
  512. <a name='L459'></a><a href='#L459'>459</a>
  513. <a name='L460'></a><a href='#L460'>460</a>
  514. <a name='L461'></a><a href='#L461'>461</a>
  515. <a name='L462'></a><a href='#L462'>462</a>
  516. <a name='L463'></a><a href='#L463'>463</a>
  517. <a name='L464'></a><a href='#L464'>464</a>
  518. <a name='L465'></a><a href='#L465'>465</a>
  519. <a name='L466'></a><a href='#L466'>466</a>
  520. <a name='L467'></a><a href='#L467'>467</a>
  521. <a name='L468'></a><a href='#L468'>468</a>
  522. <a name='L469'></a><a href='#L469'>469</a>
  523. <a name='L470'></a><a href='#L470'>470</a>
  524. <a name='L471'></a><a href='#L471'>471</a>
  525. <a name='L472'></a><a href='#L472'>472</a>
  526. <a name='L473'></a><a href='#L473'>473</a>
  527. <a name='L474'></a><a href='#L474'>474</a>
  528. <a name='L475'></a><a href='#L475'>475</a>
  529. <a name='L476'></a><a href='#L476'>476</a>
  530. <a name='L477'></a><a href='#L477'>477</a>
  531. <a name='L478'></a><a href='#L478'>478</a>
  532. <a name='L479'></a><a href='#L479'>479</a>
  533. <a name='L480'></a><a href='#L480'>480</a>
  534. <a name='L481'></a><a href='#L481'>481</a>
  535. <a name='L482'></a><a href='#L482'>482</a>
  536. <a name='L483'></a><a href='#L483'>483</a>
  537. <a name='L484'></a><a href='#L484'>484</a>
  538. <a name='L485'></a><a href='#L485'>485</a>
  539. <a name='L486'></a><a href='#L486'>486</a>
  540. <a name='L487'></a><a href='#L487'>487</a>
  541. <a name='L488'></a><a href='#L488'>488</a>
  542. <a name='L489'></a><a href='#L489'>489</a>
  543. <a name='L490'></a><a href='#L490'>490</a>
  544. <a name='L491'></a><a href='#L491'>491</a>
  545. <a name='L492'></a><a href='#L492'>492</a>
  546. <a name='L493'></a><a href='#L493'>493</a>
  547. <a name='L494'></a><a href='#L494'>494</a>
  548. <a name='L495'></a><a href='#L495'>495</a>
  549. <a name='L496'></a><a href='#L496'>496</a>
  550. <a name='L497'></a><a href='#L497'>497</a>
  551. <a name='L498'></a><a href='#L498'>498</a>
  552. <a name='L499'></a><a href='#L499'>499</a>
  553. <a name='L500'></a><a href='#L500'>500</a>
  554. <a name='L501'></a><a href='#L501'>501</a>
  555. <a name='L502'></a><a href='#L502'>502</a>
  556. <a name='L503'></a><a href='#L503'>503</a>
  557. <a name='L504'></a><a href='#L504'>504</a>
  558. <a name='L505'></a><a href='#L505'>505</a>
  559. <a name='L506'></a><a href='#L506'>506</a>
  560. <a name='L507'></a><a href='#L507'>507</a>
  561. <a name='L508'></a><a href='#L508'>508</a>
  562. <a name='L509'></a><a href='#L509'>509</a>
  563. <a name='L510'></a><a href='#L510'>510</a>
  564. <a name='L511'></a><a href='#L511'>511</a>
  565. <a name='L512'></a><a href='#L512'>512</a>
  566. <a name='L513'></a><a href='#L513'>513</a>
  567. <a name='L514'></a><a href='#L514'>514</a>
  568. <a name='L515'></a><a href='#L515'>515</a>
  569. <a name='L516'></a><a href='#L516'>516</a>
  570. <a name='L517'></a><a href='#L517'>517</a>
  571. <a name='L518'></a><a href='#L518'>518</a>
  572. <a name='L519'></a><a href='#L519'>519</a>
  573. <a name='L520'></a><a href='#L520'>520</a>
  574. <a name='L521'></a><a href='#L521'>521</a>
  575. <a name='L522'></a><a href='#L522'>522</a>
  576. <a name='L523'></a><a href='#L523'>523</a>
  577. <a name='L524'></a><a href='#L524'>524</a>
  578. <a name='L525'></a><a href='#L525'>525</a>
  579. <a name='L526'></a><a href='#L526'>526</a>
  580. <a name='L527'></a><a href='#L527'>527</a>
  581. <a name='L528'></a><a href='#L528'>528</a>
  582. <a name='L529'></a><a href='#L529'>529</a>
  583. <a name='L530'></a><a href='#L530'>530</a>
  584. <a name='L531'></a><a href='#L531'>531</a>
  585. <a name='L532'></a><a href='#L532'>532</a>
  586. <a name='L533'></a><a href='#L533'>533</a>
  587. <a name='L534'></a><a href='#L534'>534</a>
  588. <a name='L535'></a><a href='#L535'>535</a>
  589. <a name='L536'></a><a href='#L536'>536</a>
  590. <a name='L537'></a><a href='#L537'>537</a>
  591. <a name='L538'></a><a href='#L538'>538</a>
  592. <a name='L539'></a><a href='#L539'>539</a>
  593. <a name='L540'></a><a href='#L540'>540</a>
  594. <a name='L541'></a><a href='#L541'>541</a>
  595. <a name='L542'></a><a href='#L542'>542</a>
  596. <a name='L543'></a><a href='#L543'>543</a>
  597. <a name='L544'></a><a href='#L544'>544</a>
  598. <a name='L545'></a><a href='#L545'>545</a>
  599. <a name='L546'></a><a href='#L546'>546</a>
  600. <a name='L547'></a><a href='#L547'>547</a>
  601. <a name='L548'></a><a href='#L548'>548</a>
  602. <a name='L549'></a><a href='#L549'>549</a>
  603. <a name='L550'></a><a href='#L550'>550</a>
  604. <a name='L551'></a><a href='#L551'>551</a>
  605. <a name='L552'></a><a href='#L552'>552</a>
  606. <a name='L553'></a><a href='#L553'>553</a>
  607. <a name='L554'></a><a href='#L554'>554</a>
  608. <a name='L555'></a><a href='#L555'>555</a>
  609. <a name='L556'></a><a href='#L556'>556</a>
  610. <a name='L557'></a><a href='#L557'>557</a>
  611. <a name='L558'></a><a href='#L558'>558</a>
  612. <a name='L559'></a><a href='#L559'>559</a>
  613. <a name='L560'></a><a href='#L560'>560</a>
  614. <a name='L561'></a><a href='#L561'>561</a>
  615. <a name='L562'></a><a href='#L562'>562</a>
  616. <a name='L563'></a><a href='#L563'>563</a>
  617. <a name='L564'></a><a href='#L564'>564</a>
  618. <a name='L565'></a><a href='#L565'>565</a>
  619. <a name='L566'></a><a href='#L566'>566</a>
  620. <a name='L567'></a><a href='#L567'>567</a>
  621. <a name='L568'></a><a href='#L568'>568</a>
  622. <a name='L569'></a><a href='#L569'>569</a>
  623. <a name='L570'></a><a href='#L570'>570</a>
  624. <a name='L571'></a><a href='#L571'>571</a>
  625. <a name='L572'></a><a href='#L572'>572</a>
  626. <a name='L573'></a><a href='#L573'>573</a>
  627. <a name='L574'></a><a href='#L574'>574</a>
  628. <a name='L575'></a><a href='#L575'>575</a>
  629. <a name='L576'></a><a href='#L576'>576</a>
  630. <a name='L577'></a><a href='#L577'>577</a>
  631. <a name='L578'></a><a href='#L578'>578</a>
  632. <a name='L579'></a><a href='#L579'>579</a>
  633. <a name='L580'></a><a href='#L580'>580</a>
  634. <a name='L581'></a><a href='#L581'>581</a>
  635. <a name='L582'></a><a href='#L582'>582</a>
  636. <a name='L583'></a><a href='#L583'>583</a>
  637. <a name='L584'></a><a href='#L584'>584</a>
  638. <a name='L585'></a><a href='#L585'>585</a>
  639. <a name='L586'></a><a href='#L586'>586</a>
  640. <a name='L587'></a><a href='#L587'>587</a>
  641. <a name='L588'></a><a href='#L588'>588</a>
  642. <a name='L589'></a><a href='#L589'>589</a>
  643. <a name='L590'></a><a href='#L590'>590</a>
  644. <a name='L591'></a><a href='#L591'>591</a>
  645. <a name='L592'></a><a href='#L592'>592</a>
  646. <a name='L593'></a><a href='#L593'>593</a>
  647. <a name='L594'></a><a href='#L594'>594</a>
  648. <a name='L595'></a><a href='#L595'>595</a>
  649. <a name='L596'></a><a href='#L596'>596</a>
  650. <a name='L597'></a><a href='#L597'>597</a>
  651. <a name='L598'></a><a href='#L598'>598</a>
  652. <a name='L599'></a><a href='#L599'>599</a>
  653. <a name='L600'></a><a href='#L600'>600</a>
  654. <a name='L601'></a><a href='#L601'>601</a>
  655. <a name='L602'></a><a href='#L602'>602</a>
  656. <a name='L603'></a><a href='#L603'>603</a>
  657. <a name='L604'></a><a href='#L604'>604</a>
  658. <a name='L605'></a><a href='#L605'>605</a>
  659. <a name='L606'></a><a href='#L606'>606</a>
  660. <a name='L607'></a><a href='#L607'>607</a>
  661. <a name='L608'></a><a href='#L608'>608</a>
  662. <a name='L609'></a><a href='#L609'>609</a>
  663. <a name='L610'></a><a href='#L610'>610</a>
  664. <a name='L611'></a><a href='#L611'>611</a>
  665. <a name='L612'></a><a href='#L612'>612</a>
  666. <a name='L613'></a><a href='#L613'>613</a>
  667. <a name='L614'></a><a href='#L614'>614</a>
  668. <a name='L615'></a><a href='#L615'>615</a>
  669. <a name='L616'></a><a href='#L616'>616</a>
  670. <a name='L617'></a><a href='#L617'>617</a>
  671. <a name='L618'></a><a href='#L618'>618</a>
  672. <a name='L619'></a><a href='#L619'>619</a>
  673. <a name='L620'></a><a href='#L620'>620</a>
  674. <a name='L621'></a><a href='#L621'>621</a>
  675. <a name='L622'></a><a href='#L622'>622</a>
  676. <a name='L623'></a><a href='#L623'>623</a>
  677. <a name='L624'></a><a href='#L624'>624</a>
  678. <a name='L625'></a><a href='#L625'>625</a>
  679. <a name='L626'></a><a href='#L626'>626</a>
  680. <a name='L627'></a><a href='#L627'>627</a>
  681. <a name='L628'></a><a href='#L628'>628</a>
  682. <a name='L629'></a><a href='#L629'>629</a>
  683. <a name='L630'></a><a href='#L630'>630</a>
  684. <a name='L631'></a><a href='#L631'>631</a>
  685. <a name='L632'></a><a href='#L632'>632</a>
  686. <a name='L633'></a><a href='#L633'>633</a>
  687. <a name='L634'></a><a href='#L634'>634</a>
  688. <a name='L635'></a><a href='#L635'>635</a>
  689. <a name='L636'></a><a href='#L636'>636</a>
  690. <a name='L637'></a><a href='#L637'>637</a>
  691. <a name='L638'></a><a href='#L638'>638</a>
  692. <a name='L639'></a><a href='#L639'>639</a>
  693. <a name='L640'></a><a href='#L640'>640</a>
  694. <a name='L641'></a><a href='#L641'>641</a>
  695. <a name='L642'></a><a href='#L642'>642</a>
  696. <a name='L643'></a><a href='#L643'>643</a>
  697. <a name='L644'></a><a href='#L644'>644</a>
  698. <a name='L645'></a><a href='#L645'>645</a>
  699. <a name='L646'></a><a href='#L646'>646</a>
  700. <a name='L647'></a><a href='#L647'>647</a>
  701. <a name='L648'></a><a href='#L648'>648</a>
  702. <a name='L649'></a><a href='#L649'>649</a>
  703. <a name='L650'></a><a href='#L650'>650</a>
  704. <a name='L651'></a><a href='#L651'>651</a>
  705. <a name='L652'></a><a href='#L652'>652</a>
  706. <a name='L653'></a><a href='#L653'>653</a>
  707. <a name='L654'></a><a href='#L654'>654</a>
  708. <a name='L655'></a><a href='#L655'>655</a>
  709. <a name='L656'></a><a href='#L656'>656</a>
  710. <a name='L657'></a><a href='#L657'>657</a>
  711. <a name='L658'></a><a href='#L658'>658</a>
  712. <a name='L659'></a><a href='#L659'>659</a>
  713. <a name='L660'></a><a href='#L660'>660</a>
  714. <a name='L661'></a><a href='#L661'>661</a>
  715. <a name='L662'></a><a href='#L662'>662</a>
  716. <a name='L663'></a><a href='#L663'>663</a>
  717. <a name='L664'></a><a href='#L664'>664</a>
  718. <a name='L665'></a><a href='#L665'>665</a>
  719. <a name='L666'></a><a href='#L666'>666</a>
  720. <a name='L667'></a><a href='#L667'>667</a>
  721. <a name='L668'></a><a href='#L668'>668</a>
  722. <a name='L669'></a><a href='#L669'>669</a>
  723. <a name='L670'></a><a href='#L670'>670</a>
  724. <a name='L671'></a><a href='#L671'>671</a>
  725. <a name='L672'></a><a href='#L672'>672</a>
  726. <a name='L673'></a><a href='#L673'>673</a>
  727. <a name='L674'></a><a href='#L674'>674</a>
  728. <a name='L675'></a><a href='#L675'>675</a>
  729. <a name='L676'></a><a href='#L676'>676</a>
  730. <a name='L677'></a><a href='#L677'>677</a>
  731. <a name='L678'></a><a href='#L678'>678</a>
  732. <a name='L679'></a><a href='#L679'>679</a>
  733. <a name='L680'></a><a href='#L680'>680</a>
  734. <a name='L681'></a><a href='#L681'>681</a>
  735. <a name='L682'></a><a href='#L682'>682</a>
  736. <a name='L683'></a><a href='#L683'>683</a>
  737. <a name='L684'></a><a href='#L684'>684</a>
  738. <a name='L685'></a><a href='#L685'>685</a>
  739. <a name='L686'></a><a href='#L686'>686</a>
  740. <a name='L687'></a><a href='#L687'>687</a>
  741. <a name='L688'></a><a href='#L688'>688</a>
  742. <a name='L689'></a><a href='#L689'>689</a>
  743. <a name='L690'></a><a href='#L690'>690</a>
  744. <a name='L691'></a><a href='#L691'>691</a>
  745. <a name='L692'></a><a href='#L692'>692</a>
  746. <a name='L693'></a><a href='#L693'>693</a>
  747. <a name='L694'></a><a href='#L694'>694</a>
  748. <a name='L695'></a><a href='#L695'>695</a>
  749. <a name='L696'></a><a href='#L696'>696</a>
  750. <a name='L697'></a><a href='#L697'>697</a>
  751. <a name='L698'></a><a href='#L698'>698</a>
  752. <a name='L699'></a><a href='#L699'>699</a>
  753. <a name='L700'></a><a href='#L700'>700</a>
  754. <a name='L701'></a><a href='#L701'>701</a>
  755. <a name='L702'></a><a href='#L702'>702</a>
  756. <a name='L703'></a><a href='#L703'>703</a>
  757. <a name='L704'></a><a href='#L704'>704</a>
  758. <a name='L705'></a><a href='#L705'>705</a>
  759. <a name='L706'></a><a href='#L706'>706</a>
  760. <a name='L707'></a><a href='#L707'>707</a>
  761. <a name='L708'></a><a href='#L708'>708</a>
  762. <a name='L709'></a><a href='#L709'>709</a>
  763. <a name='L710'></a><a href='#L710'>710</a>
  764. <a name='L711'></a><a href='#L711'>711</a>
  765. <a name='L712'></a><a href='#L712'>712</a>
  766. <a name='L713'></a><a href='#L713'>713</a>
  767. <a name='L714'></a><a href='#L714'>714</a>
  768. <a name='L715'></a><a href='#L715'>715</a>
  769. <a name='L716'></a><a href='#L716'>716</a>
  770. <a name='L717'></a><a href='#L717'>717</a>
  771. <a name='L718'></a><a href='#L718'>718</a>
  772. <a name='L719'></a><a href='#L719'>719</a>
  773. <a name='L720'></a><a href='#L720'>720</a>
  774. <a name='L721'></a><a href='#L721'>721</a>
  775. <a name='L722'></a><a href='#L722'>722</a>
  776. <a name='L723'></a><a href='#L723'>723</a>
  777. <a name='L724'></a><a href='#L724'>724</a>
  778. <a name='L725'></a><a href='#L725'>725</a>
  779. <a name='L726'></a><a href='#L726'>726</a>
  780. <a name='L727'></a><a href='#L727'>727</a>
  781. <a name='L728'></a><a href='#L728'>728</a>
  782. <a name='L729'></a><a href='#L729'>729</a>
  783. <a name='L730'></a><a href='#L730'>730</a>
  784. <a name='L731'></a><a href='#L731'>731</a>
  785. <a name='L732'></a><a href='#L732'>732</a>
  786. <a name='L733'></a><a href='#L733'>733</a>
  787. <a name='L734'></a><a href='#L734'>734</a>
  788. <a name='L735'></a><a href='#L735'>735</a>
  789. <a name='L736'></a><a href='#L736'>736</a>
  790. <a name='L737'></a><a href='#L737'>737</a>
  791. <a name='L738'></a><a href='#L738'>738</a>
  792. <a name='L739'></a><a href='#L739'>739</a>
  793. <a name='L740'></a><a href='#L740'>740</a>
  794. <a name='L741'></a><a href='#L741'>741</a>
  795. <a name='L742'></a><a href='#L742'>742</a>
  796. <a name='L743'></a><a href='#L743'>743</a>
  797. <a name='L744'></a><a href='#L744'>744</a>
  798. <a name='L745'></a><a href='#L745'>745</a>
  799. <a name='L746'></a><a href='#L746'>746</a>
  800. <a name='L747'></a><a href='#L747'>747</a>
  801. <a name='L748'></a><a href='#L748'>748</a>
  802. <a name='L749'></a><a href='#L749'>749</a>
  803. <a name='L750'></a><a href='#L750'>750</a>
  804. <a name='L751'></a><a href='#L751'>751</a>
  805. <a name='L752'></a><a href='#L752'>752</a>
  806. <a name='L753'></a><a href='#L753'>753</a>
  807. <a name='L754'></a><a href='#L754'>754</a>
  808. <a name='L755'></a><a href='#L755'>755</a>
  809. <a name='L756'></a><a href='#L756'>756</a>
  810. <a name='L757'></a><a href='#L757'>757</a>
  811. <a name='L758'></a><a href='#L758'>758</a>
  812. <a name='L759'></a><a href='#L759'>759</a>
  813. <a name='L760'></a><a href='#L760'>760</a>
  814. <a name='L761'></a><a href='#L761'>761</a>
  815. <a name='L762'></a><a href='#L762'>762</a>
  816. <a name='L763'></a><a href='#L763'>763</a>
  817. <a name='L764'></a><a href='#L764'>764</a>
  818. <a name='L765'></a><a href='#L765'>765</a>
  819. <a name='L766'></a><a href='#L766'>766</a>
  820. <a name='L767'></a><a href='#L767'>767</a>
  821. <a name='L768'></a><a href='#L768'>768</a>
  822. <a name='L769'></a><a href='#L769'>769</a>
  823. <a name='L770'></a><a href='#L770'>770</a>
  824. <a name='L771'></a><a href='#L771'>771</a>
  825. <a name='L772'></a><a href='#L772'>772</a>
  826. <a name='L773'></a><a href='#L773'>773</a>
  827. <a name='L774'></a><a href='#L774'>774</a>
  828. <a name='L775'></a><a href='#L775'>775</a>
  829. <a name='L776'></a><a href='#L776'>776</a>
  830. <a name='L777'></a><a href='#L777'>777</a>
  831. <a name='L778'></a><a href='#L778'>778</a>
  832. <a name='L779'></a><a href='#L779'>779</a>
  833. <a name='L780'></a><a href='#L780'>780</a>
  834. <a name='L781'></a><a href='#L781'>781</a>
  835. <a name='L782'></a><a href='#L782'>782</a>
  836. <a name='L783'></a><a href='#L783'>783</a>
  837. <a name='L784'></a><a href='#L784'>784</a>
  838. <a name='L785'></a><a href='#L785'>785</a>
  839. <a name='L786'></a><a href='#L786'>786</a>
  840. <a name='L787'></a><a href='#L787'>787</a>
  841. <a name='L788'></a><a href='#L788'>788</a>
  842. <a name='L789'></a><a href='#L789'>789</a>
  843. <a name='L790'></a><a href='#L790'>790</a>
  844. <a name='L791'></a><a href='#L791'>791</a>
  845. <a name='L792'></a><a href='#L792'>792</a>
  846. <a name='L793'></a><a href='#L793'>793</a>
  847. <a name='L794'></a><a href='#L794'>794</a>
  848. <a name='L795'></a><a href='#L795'>795</a>
  849. <a name='L796'></a><a href='#L796'>796</a>
  850. <a name='L797'></a><a href='#L797'>797</a>
  851. <a name='L798'></a><a href='#L798'>798</a>
  852. <a name='L799'></a><a href='#L799'>799</a>
  853. <a name='L800'></a><a href='#L800'>800</a>
  854. <a name='L801'></a><a href='#L801'>801</a>
  855. <a name='L802'></a><a href='#L802'>802</a>
  856. <a name='L803'></a><a href='#L803'>803</a>
  857. <a name='L804'></a><a href='#L804'>804</a>
  858. <a name='L805'></a><a href='#L805'>805</a>
  859. <a name='L806'></a><a href='#L806'>806</a>
  860. <a name='L807'></a><a href='#L807'>807</a>
  861. <a name='L808'></a><a href='#L808'>808</a>
  862. <a name='L809'></a><a href='#L809'>809</a>
  863. <a name='L810'></a><a href='#L810'>810</a>
  864. <a name='L811'></a><a href='#L811'>811</a>
  865. <a name='L812'></a><a href='#L812'>812</a>
  866. <a name='L813'></a><a href='#L813'>813</a>
  867. <a name='L814'></a><a href='#L814'>814</a>
  868. <a name='L815'></a><a href='#L815'>815</a>
  869. <a name='L816'></a><a href='#L816'>816</a>
  870. <a name='L817'></a><a href='#L817'>817</a>
  871. <a name='L818'></a><a href='#L818'>818</a>
  872. <a name='L819'></a><a href='#L819'>819</a>
  873. <a name='L820'></a><a href='#L820'>820</a>
  874. <a name='L821'></a><a href='#L821'>821</a>
  875. <a name='L822'></a><a href='#L822'>822</a>
  876. <a name='L823'></a><a href='#L823'>823</a>
  877. <a name='L824'></a><a href='#L824'>824</a>
  878. <a name='L825'></a><a href='#L825'>825</a>
  879. <a name='L826'></a><a href='#L826'>826</a>
  880. <a name='L827'></a><a href='#L827'>827</a>
  881. <a name='L828'></a><a href='#L828'>828</a>
  882. <a name='L829'></a><a href='#L829'>829</a>
  883. <a name='L830'></a><a href='#L830'>830</a>
  884. <a name='L831'></a><a href='#L831'>831</a>
  885. <a name='L832'></a><a href='#L832'>832</a>
  886. <a name='L833'></a><a href='#L833'>833</a>
  887. <a name='L834'></a><a href='#L834'>834</a>
  888. <a name='L835'></a><a href='#L835'>835</a>
  889. <a name='L836'></a><a href='#L836'>836</a>
  890. <a name='L837'></a><a href='#L837'>837</a>
  891. <a name='L838'></a><a href='#L838'>838</a>
  892. <a name='L839'></a><a href='#L839'>839</a>
  893. <a name='L840'></a><a href='#L840'>840</a>
  894. <a name='L841'></a><a href='#L841'>841</a>
  895. <a name='L842'></a><a href='#L842'>842</a>
  896. <a name='L843'></a><a href='#L843'>843</a>
  897. <a name='L844'></a><a href='#L844'>844</a>
  898. <a name='L845'></a><a href='#L845'>845</a>
  899. <a name='L846'></a><a href='#L846'>846</a>
  900. <a name='L847'></a><a href='#L847'>847</a>
  901. <a name='L848'></a><a href='#L848'>848</a>
  902. <a name='L849'></a><a href='#L849'>849</a>
  903. <a name='L850'></a><a href='#L850'>850</a>
  904. <a name='L851'></a><a href='#L851'>851</a>
  905. <a name='L852'></a><a href='#L852'>852</a>
  906. <a name='L853'></a><a href='#L853'>853</a>
  907. <a name='L854'></a><a href='#L854'>854</a>
  908. <a name='L855'></a><a href='#L855'>855</a>
  909. <a name='L856'></a><a href='#L856'>856</a>
  910. <a name='L857'></a><a href='#L857'>857</a>
  911. <a name='L858'></a><a href='#L858'>858</a>
  912. <a name='L859'></a><a href='#L859'>859</a>
  913. <a name='L860'></a><a href='#L860'>860</a>
  914. <a name='L861'></a><a href='#L861'>861</a>
  915. <a name='L862'></a><a href='#L862'>862</a>
  916. <a name='L863'></a><a href='#L863'>863</a>
  917. <a name='L864'></a><a href='#L864'>864</a>
  918. <a name='L865'></a><a href='#L865'>865</a>
  919. <a name='L866'></a><a href='#L866'>866</a>
  920. <a name='L867'></a><a href='#L867'>867</a>
  921. <a name='L868'></a><a href='#L868'>868</a>
  922. <a name='L869'></a><a href='#L869'>869</a>
  923. <a name='L870'></a><a href='#L870'>870</a>
  924. <a name='L871'></a><a href='#L871'>871</a>
  925. <a name='L872'></a><a href='#L872'>872</a>
  926. <a name='L873'></a><a href='#L873'>873</a>
  927. <a name='L874'></a><a href='#L874'>874</a>
  928. <a name='L875'></a><a href='#L875'>875</a>
  929. <a name='L876'></a><a href='#L876'>876</a>
  930. <a name='L877'></a><a href='#L877'>877</a>
  931. <a name='L878'></a><a href='#L878'>878</a>
  932. <a name='L879'></a><a href='#L879'>879</a>
  933. <a name='L880'></a><a href='#L880'>880</a>
  934. <a name='L881'></a><a href='#L881'>881</a>
  935. <a name='L882'></a><a href='#L882'>882</a>
  936. <a name='L883'></a><a href='#L883'>883</a>
  937. <a name='L884'></a><a href='#L884'>884</a>
  938. <a name='L885'></a><a href='#L885'>885</a>
  939. <a name='L886'></a><a href='#L886'>886</a>
  940. <a name='L887'></a><a href='#L887'>887</a>
  941. <a name='L888'></a><a href='#L888'>888</a>
  942. <a name='L889'></a><a href='#L889'>889</a>
  943. <a name='L890'></a><a href='#L890'>890</a>
  944. <a name='L891'></a><a href='#L891'>891</a>
  945. <a name='L892'></a><a href='#L892'>892</a>
  946. <a name='L893'></a><a href='#L893'>893</a>
  947. <a name='L894'></a><a href='#L894'>894</a>
  948. <a name='L895'></a><a href='#L895'>895</a>
  949. <a name='L896'></a><a href='#L896'>896</a>
  950. <a name='L897'></a><a href='#L897'>897</a>
  951. <a name='L898'></a><a href='#L898'>898</a>
  952. <a name='L899'></a><a href='#L899'>899</a>
  953. <a name='L900'></a><a href='#L900'>900</a>
  954. <a name='L901'></a><a href='#L901'>901</a>
  955. <a name='L902'></a><a href='#L902'>902</a>
  956. <a name='L903'></a><a href='#L903'>903</a>
  957. <a name='L904'></a><a href='#L904'>904</a>
  958. <a name='L905'></a><a href='#L905'>905</a>
  959. <a name='L906'></a><a href='#L906'>906</a>
  960. <a name='L907'></a><a href='#L907'>907</a>
  961. <a name='L908'></a><a href='#L908'>908</a>
  962. <a name='L909'></a><a href='#L909'>909</a>
  963. <a name='L910'></a><a href='#L910'>910</a>
  964. <a name='L911'></a><a href='#L911'>911</a>
  965. <a name='L912'></a><a href='#L912'>912</a>
  966. <a name='L913'></a><a href='#L913'>913</a>
  967. <a name='L914'></a><a href='#L914'>914</a>
  968. <a name='L915'></a><a href='#L915'>915</a>
  969. <a name='L916'></a><a href='#L916'>916</a>
  970. <a name='L917'></a><a href='#L917'>917</a>
  971. <a name='L918'></a><a href='#L918'>918</a>
  972. <a name='L919'></a><a href='#L919'>919</a>
  973. <a name='L920'></a><a href='#L920'>920</a>
  974. <a name='L921'></a><a href='#L921'>921</a>
  975. <a name='L922'></a><a href='#L922'>922</a>
  976. <a name='L923'></a><a href='#L923'>923</a>
  977. <a name='L924'></a><a href='#L924'>924</a>
  978. <a name='L925'></a><a href='#L925'>925</a>
  979. <a name='L926'></a><a href='#L926'>926</a>
  980. <a name='L927'></a><a href='#L927'>927</a>
  981. <a name='L928'></a><a href='#L928'>928</a>
  982. <a name='L929'></a><a href='#L929'>929</a>
  983. <a name='L930'></a><a href='#L930'>930</a>
  984. <a name='L931'></a><a href='#L931'>931</a>
  985. <a name='L932'></a><a href='#L932'>932</a>
  986. <a name='L933'></a><a href='#L933'>933</a>
  987. <a name='L934'></a><a href='#L934'>934</a>
  988. <a name='L935'></a><a href='#L935'>935</a>
  989. <a name='L936'></a><a href='#L936'>936</a>
  990. <a name='L937'></a><a href='#L937'>937</a>
  991. <a name='L938'></a><a href='#L938'>938</a>
  992. <a name='L939'></a><a href='#L939'>939</a>
  993. <a name='L940'></a><a href='#L940'>940</a>
  994. <a name='L941'></a><a href='#L941'>941</a>
  995. <a name='L942'></a><a href='#L942'>942</a>
  996. <a name='L943'></a><a href='#L943'>943</a>
  997. <a name='L944'></a><a href='#L944'>944</a>
  998. <a name='L945'></a><a href='#L945'>945</a>
  999. <a name='L946'></a><a href='#L946'>946</a>
  1000. <a name='L947'></a><a href='#L947'>947</a>
  1001. <a name='L948'></a><a href='#L948'>948</a>
  1002. <a name='L949'></a><a href='#L949'>949</a>
  1003. <a name='L950'></a><a href='#L950'>950</a>
  1004. <a name='L951'></a><a href='#L951'>951</a>
  1005. <a name='L952'></a><a href='#L952'>952</a>
  1006. <a name='L953'></a><a href='#L953'>953</a>
  1007. <a name='L954'></a><a href='#L954'>954</a>
  1008. <a name='L955'></a><a href='#L955'>955</a>
  1009. <a name='L956'></a><a href='#L956'>956</a>
  1010. <a name='L957'></a><a href='#L957'>957</a>
  1011. <a name='L958'></a><a href='#L958'>958</a>
  1012. <a name='L959'></a><a href='#L959'>959</a>
  1013. <a name='L960'></a><a href='#L960'>960</a>
  1014. <a name='L961'></a><a href='#L961'>961</a>
  1015. <a name='L962'></a><a href='#L962'>962</a>
  1016. <a name='L963'></a><a href='#L963'>963</a>
  1017. <a name='L964'></a><a href='#L964'>964</a>
  1018. <a name='L965'></a><a href='#L965'>965</a>
  1019. <a name='L966'></a><a href='#L966'>966</a>
  1020. <a name='L967'></a><a href='#L967'>967</a>
  1021. <a name='L968'></a><a href='#L968'>968</a>
  1022. <a name='L969'></a><a href='#L969'>969</a>
  1023. <a name='L970'></a><a href='#L970'>970</a>
  1024. <a name='L971'></a><a href='#L971'>971</a>
  1025. <a name='L972'></a><a href='#L972'>972</a>
  1026. <a name='L973'></a><a href='#L973'>973</a>
  1027. <a name='L974'></a><a href='#L974'>974</a>
  1028. <a name='L975'></a><a href='#L975'>975</a>
  1029. <a name='L976'></a><a href='#L976'>976</a>
  1030. <a name='L977'></a><a href='#L977'>977</a>
  1031. <a name='L978'></a><a href='#L978'>978</a>
  1032. <a name='L979'></a><a href='#L979'>979</a>
  1033. <a name='L980'></a><a href='#L980'>980</a>
  1034. <a name='L981'></a><a href='#L981'>981</a>
  1035. <a name='L982'></a><a href='#L982'>982</a>
  1036. <a name='L983'></a><a href='#L983'>983</a>
  1037. <a name='L984'></a><a href='#L984'>984</a>
  1038. <a name='L985'></a><a href='#L985'>985</a>
  1039. <a name='L986'></a><a href='#L986'>986</a>
  1040. <a name='L987'></a><a href='#L987'>987</a>
  1041. <a name='L988'></a><a href='#L988'>988</a>
  1042. <a name='L989'></a><a href='#L989'>989</a>
  1043. <a name='L990'></a><a href='#L990'>990</a>
  1044. <a name='L991'></a><a href='#L991'>991</a>
  1045. <a name='L992'></a><a href='#L992'>992</a>
  1046. <a name='L993'></a><a href='#L993'>993</a>
  1047. <a name='L994'></a><a href='#L994'>994</a>
  1048. <a name='L995'></a><a href='#L995'>995</a>
  1049. <a name='L996'></a><a href='#L996'>996</a>
  1050. <a name='L997'></a><a href='#L997'>997</a>
  1051. <a name='L998'></a><a href='#L998'>998</a>
  1052. <a name='L999'></a><a href='#L999'>999</a>
  1053. <a name='L1000'></a><a href='#L1000'>1000</a>
  1054. <a name='L1001'></a><a href='#L1001'>1001</a>
  1055. <a name='L1002'></a><a href='#L1002'>1002</a>
  1056. <a name='L1003'></a><a href='#L1003'>1003</a>
  1057. <a name='L1004'></a><a href='#L1004'>1004</a>
  1058. <a name='L1005'></a><a href='#L1005'>1005</a>
  1059. <a name='L1006'></a><a href='#L1006'>1006</a>
  1060. <a name='L1007'></a><a href='#L1007'>1007</a>
  1061. <a name='L1008'></a><a href='#L1008'>1008</a>
  1062. <a name='L1009'></a><a href='#L1009'>1009</a>
  1063. <a name='L1010'></a><a href='#L1010'>1010</a>
  1064. <a name='L1011'></a><a href='#L1011'>1011</a>
  1065. <a name='L1012'></a><a href='#L1012'>1012</a>
  1066. <a name='L1013'></a><a href='#L1013'>1013</a>
  1067. <a name='L1014'></a><a href='#L1014'>1014</a>
  1068. <a name='L1015'></a><a href='#L1015'>1015</a>
  1069. <a name='L1016'></a><a href='#L1016'>1016</a>
  1070. <a name='L1017'></a><a href='#L1017'>1017</a>
  1071. <a name='L1018'></a><a href='#L1018'>1018</a>
  1072. <a name='L1019'></a><a href='#L1019'>1019</a>
  1073. <a name='L1020'></a><a href='#L1020'>1020</a>
  1074. <a name='L1021'></a><a href='#L1021'>1021</a>
  1075. <a name='L1022'></a><a href='#L1022'>1022</a>
  1076. <a name='L1023'></a><a href='#L1023'>1023</a>
  1077. <a name='L1024'></a><a href='#L1024'>1024</a>
  1078. <a name='L1025'></a><a href='#L1025'>1025</a>
  1079. <a name='L1026'></a><a href='#L1026'>1026</a>
  1080. <a name='L1027'></a><a href='#L1027'>1027</a>
  1081. <a name='L1028'></a><a href='#L1028'>1028</a>
  1082. <a name='L1029'></a><a href='#L1029'>1029</a>
  1083. <a name='L1030'></a><a href='#L1030'>1030</a>
  1084. <a name='L1031'></a><a href='#L1031'>1031</a>
  1085. <a name='L1032'></a><a href='#L1032'>1032</a>
  1086. <a name='L1033'></a><a href='#L1033'>1033</a>
  1087. <a name='L1034'></a><a href='#L1034'>1034</a>
  1088. <a name='L1035'></a><a href='#L1035'>1035</a>
  1089. <a name='L1036'></a><a href='#L1036'>1036</a>
  1090. <a name='L1037'></a><a href='#L1037'>1037</a>
  1091. <a name='L1038'></a><a href='#L1038'>1038</a>
  1092. <a name='L1039'></a><a href='#L1039'>1039</a>
  1093. <a name='L1040'></a><a href='#L1040'>1040</a>
  1094. <a name='L1041'></a><a href='#L1041'>1041</a>
  1095. <a name='L1042'></a><a href='#L1042'>1042</a>
  1096. <a name='L1043'></a><a href='#L1043'>1043</a>
  1097. <a name='L1044'></a><a href='#L1044'>1044</a>
  1098. <a name='L1045'></a><a href='#L1045'>1045</a>
  1099. <a name='L1046'></a><a href='#L1046'>1046</a>
  1100. <a name='L1047'></a><a href='#L1047'>1047</a>
  1101. <a name='L1048'></a><a href='#L1048'>1048</a>
  1102. <a name='L1049'></a><a href='#L1049'>1049</a>
  1103. <a name='L1050'></a><a href='#L1050'>1050</a>
  1104. <a name='L1051'></a><a href='#L1051'>1051</a>
  1105. <a name='L1052'></a><a href='#L1052'>1052</a>
  1106. <a name='L1053'></a><a href='#L1053'>1053</a>
  1107. <a name='L1054'></a><a href='#L1054'>1054</a>
  1108. <a name='L1055'></a><a href='#L1055'>1055</a>
  1109. <a name='L1056'></a><a href='#L1056'>1056</a>
  1110. <a name='L1057'></a><a href='#L1057'>1057</a>
  1111. <a name='L1058'></a><a href='#L1058'>1058</a>
  1112. <a name='L1059'></a><a href='#L1059'>1059</a>
  1113. <a name='L1060'></a><a href='#L1060'>1060</a>
  1114. <a name='L1061'></a><a href='#L1061'>1061</a>
  1115. <a name='L1062'></a><a href='#L1062'>1062</a>
  1116. <a name='L1063'></a><a href='#L1063'>1063</a>
  1117. <a name='L1064'></a><a href='#L1064'>1064</a>
  1118. <a name='L1065'></a><a href='#L1065'>1065</a>
  1119. <a name='L1066'></a><a href='#L1066'>1066</a>
  1120. <a name='L1067'></a><a href='#L1067'>1067</a>
  1121. <a name='L1068'></a><a href='#L1068'>1068</a>
  1122. <a name='L1069'></a><a href='#L1069'>1069</a>
  1123. <a name='L1070'></a><a href='#L1070'>1070</a>
  1124. <a name='L1071'></a><a href='#L1071'>1071</a>
  1125. <a name='L1072'></a><a href='#L1072'>1072</a>
  1126. <a name='L1073'></a><a href='#L1073'>1073</a>
  1127. <a name='L1074'></a><a href='#L1074'>1074</a>
  1128. <a name='L1075'></a><a href='#L1075'>1075</a>
  1129. <a name='L1076'></a><a href='#L1076'>1076</a>
  1130. <a name='L1077'></a><a href='#L1077'>1077</a>
  1131. <a name='L1078'></a><a href='#L1078'>1078</a>
  1132. <a name='L1079'></a><a href='#L1079'>1079</a>
  1133. <a name='L1080'></a><a href='#L1080'>1080</a>
  1134. <a name='L1081'></a><a href='#L1081'>1081</a>
  1135. <a name='L1082'></a><a href='#L1082'>1082</a>
  1136. <a name='L1083'></a><a href='#L1083'>1083</a>
  1137. <a name='L1084'></a><a href='#L1084'>1084</a>
  1138. <a name='L1085'></a><a href='#L1085'>1085</a>
  1139. <a name='L1086'></a><a href='#L1086'>1086</a>
  1140. <a name='L1087'></a><a href='#L1087'>1087</a>
  1141. <a name='L1088'></a><a href='#L1088'>1088</a>
  1142. <a name='L1089'></a><a href='#L1089'>1089</a>
  1143. <a name='L1090'></a><a href='#L1090'>1090</a>
  1144. <a name='L1091'></a><a href='#L1091'>1091</a>
  1145. <a name='L1092'></a><a href='#L1092'>1092</a>
  1146. <a name='L1093'></a><a href='#L1093'>1093</a>
  1147. <a name='L1094'></a><a href='#L1094'>1094</a>
  1148. <a name='L1095'></a><a href='#L1095'>1095</a>
  1149. <a name='L1096'></a><a href='#L1096'>1096</a>
  1150. <a name='L1097'></a><a href='#L1097'>1097</a>
  1151. <a name='L1098'></a><a href='#L1098'>1098</a>
  1152. <a name='L1099'></a><a href='#L1099'>1099</a>
  1153. <a name='L1100'></a><a href='#L1100'>1100</a>
  1154. <a name='L1101'></a><a href='#L1101'>1101</a>
  1155. <a name='L1102'></a><a href='#L1102'>1102</a>
  1156. <a name='L1103'></a><a href='#L1103'>1103</a>
  1157. <a name='L1104'></a><a href='#L1104'>1104</a>
  1158. <a name='L1105'></a><a href='#L1105'>1105</a>
  1159. <a name='L1106'></a><a href='#L1106'>1106</a>
  1160. <a name='L1107'></a><a href='#L1107'>1107</a>
  1161. <a name='L1108'></a><a href='#L1108'>1108</a>
  1162. <a name='L1109'></a><a href='#L1109'>1109</a>
  1163. <a name='L1110'></a><a href='#L1110'>1110</a>
  1164. <a name='L1111'></a><a href='#L1111'>1111</a>
  1165. <a name='L1112'></a><a href='#L1112'>1112</a>
  1166. <a name='L1113'></a><a href='#L1113'>1113</a>
  1167. <a name='L1114'></a><a href='#L1114'>1114</a>
  1168. <a name='L1115'></a><a href='#L1115'>1115</a>
  1169. <a name='L1116'></a><a href='#L1116'>1116</a>
  1170. <a name='L1117'></a><a href='#L1117'>1117</a>
  1171. <a name='L1118'></a><a href='#L1118'>1118</a>
  1172. <a name='L1119'></a><a href='#L1119'>1119</a>
  1173. <a name='L1120'></a><a href='#L1120'>1120</a>
  1174. <a name='L1121'></a><a href='#L1121'>1121</a>
  1175. <a name='L1122'></a><a href='#L1122'>1122</a>
  1176. <a name='L1123'></a><a href='#L1123'>1123</a>
  1177. <a name='L1124'></a><a href='#L1124'>1124</a>
  1178. <a name='L1125'></a><a href='#L1125'>1125</a>
  1179. <a name='L1126'></a><a href='#L1126'>1126</a>
  1180. <a name='L1127'></a><a href='#L1127'>1127</a>
  1181. <a name='L1128'></a><a href='#L1128'>1128</a>
  1182. <a name='L1129'></a><a href='#L1129'>1129</a>
  1183. <a name='L1130'></a><a href='#L1130'>1130</a>
  1184. <a name='L1131'></a><a href='#L1131'>1131</a>
  1185. <a name='L1132'></a><a href='#L1132'>1132</a>
  1186. <a name='L1133'></a><a href='#L1133'>1133</a>
  1187. <a name='L1134'></a><a href='#L1134'>1134</a>
  1188. <a name='L1135'></a><a href='#L1135'>1135</a>
  1189. <a name='L1136'></a><a href='#L1136'>1136</a>
  1190. <a name='L1137'></a><a href='#L1137'>1137</a>
  1191. <a name='L1138'></a><a href='#L1138'>1138</a>
  1192. <a name='L1139'></a><a href='#L1139'>1139</a>
  1193. <a name='L1140'></a><a href='#L1140'>1140</a>
  1194. <a name='L1141'></a><a href='#L1141'>1141</a>
  1195. <a name='L1142'></a><a href='#L1142'>1142</a>
  1196. <a name='L1143'></a><a href='#L1143'>1143</a>
  1197. <a name='L1144'></a><a href='#L1144'>1144</a>
  1198. <a name='L1145'></a><a href='#L1145'>1145</a>
  1199. <a name='L1146'></a><a href='#L1146'>1146</a>
  1200. <a name='L1147'></a><a href='#L1147'>1147</a>
  1201. <a name='L1148'></a><a href='#L1148'>1148</a>
  1202. <a name='L1149'></a><a href='#L1149'>1149</a>
  1203. <a name='L1150'></a><a href='#L1150'>1150</a>
  1204. <a name='L1151'></a><a href='#L1151'>1151</a>
  1205. <a name='L1152'></a><a href='#L1152'>1152</a>
  1206. <a name='L1153'></a><a href='#L1153'>1153</a>
  1207. <a name='L1154'></a><a href='#L1154'>1154</a>
  1208. <a name='L1155'></a><a href='#L1155'>1155</a>
  1209. <a name='L1156'></a><a href='#L1156'>1156</a>
  1210. <a name='L1157'></a><a href='#L1157'>1157</a>
  1211. <a name='L1158'></a><a href='#L1158'>1158</a>
  1212. <a name='L1159'></a><a href='#L1159'>1159</a>
  1213. <a name='L1160'></a><a href='#L1160'>1160</a>
  1214. <a name='L1161'></a><a href='#L1161'>1161</a>
  1215. <a name='L1162'></a><a href='#L1162'>1162</a>
  1216. <a name='L1163'></a><a href='#L1163'>1163</a>
  1217. <a name='L1164'></a><a href='#L1164'>1164</a>
  1218. <a name='L1165'></a><a href='#L1165'>1165</a>
  1219. <a name='L1166'></a><a href='#L1166'>1166</a>
  1220. <a name='L1167'></a><a href='#L1167'>1167</a>
  1221. <a name='L1168'></a><a href='#L1168'>1168</a>
  1222. <a name='L1169'></a><a href='#L1169'>1169</a>
  1223. <a name='L1170'></a><a href='#L1170'>1170</a>
  1224. <a name='L1171'></a><a href='#L1171'>1171</a>
  1225. <a name='L1172'></a><a href='#L1172'>1172</a>
  1226. <a name='L1173'></a><a href='#L1173'>1173</a>
  1227. <a name='L1174'></a><a href='#L1174'>1174</a>
  1228. <a name='L1175'></a><a href='#L1175'>1175</a>
  1229. <a name='L1176'></a><a href='#L1176'>1176</a>
  1230. <a name='L1177'></a><a href='#L1177'>1177</a>
  1231. <a name='L1178'></a><a href='#L1178'>1178</a>
  1232. <a name='L1179'></a><a href='#L1179'>1179</a>
  1233. <a name='L1180'></a><a href='#L1180'>1180</a>
  1234. <a name='L1181'></a><a href='#L1181'>1181</a>
  1235. <a name='L1182'></a><a href='#L1182'>1182</a>
  1236. <a name='L1183'></a><a href='#L1183'>1183</a>
  1237. <a name='L1184'></a><a href='#L1184'>1184</a>
  1238. <a name='L1185'></a><a href='#L1185'>1185</a>
  1239. <a name='L1186'></a><a href='#L1186'>1186</a>
  1240. <a name='L1187'></a><a href='#L1187'>1187</a>
  1241. <a name='L1188'></a><a href='#L1188'>1188</a>
  1242. <a name='L1189'></a><a href='#L1189'>1189</a>
  1243. <a name='L1190'></a><a href='#L1190'>1190</a>
  1244. <a name='L1191'></a><a href='#L1191'>1191</a>
  1245. <a name='L1192'></a><a href='#L1192'>1192</a>
  1246. <a name='L1193'></a><a href='#L1193'>1193</a>
  1247. <a name='L1194'></a><a href='#L1194'>1194</a>
  1248. <a name='L1195'></a><a href='#L1195'>1195</a>
  1249. <a name='L1196'></a><a href='#L1196'>1196</a>
  1250. <a name='L1197'></a><a href='#L1197'>1197</a>
  1251. <a name='L1198'></a><a href='#L1198'>1198</a>
  1252. <a name='L1199'></a><a href='#L1199'>1199</a>
  1253. <a name='L1200'></a><a href='#L1200'>1200</a>
  1254. <a name='L1201'></a><a href='#L1201'>1201</a>
  1255. <a name='L1202'></a><a href='#L1202'>1202</a>
  1256. <a name='L1203'></a><a href='#L1203'>1203</a>
  1257. <a name='L1204'></a><a href='#L1204'>1204</a>
  1258. <a name='L1205'></a><a href='#L1205'>1205</a>
  1259. <a name='L1206'></a><a href='#L1206'>1206</a>
  1260. <a name='L1207'></a><a href='#L1207'>1207</a>
  1261. <a name='L1208'></a><a href='#L1208'>1208</a>
  1262. <a name='L1209'></a><a href='#L1209'>1209</a>
  1263. <a name='L1210'></a><a href='#L1210'>1210</a>
  1264. <a name='L1211'></a><a href='#L1211'>1211</a>
  1265. <a name='L1212'></a><a href='#L1212'>1212</a>
  1266. <a name='L1213'></a><a href='#L1213'>1213</a>
  1267. <a name='L1214'></a><a href='#L1214'>1214</a>
  1268. <a name='L1215'></a><a href='#L1215'>1215</a>
  1269. <a name='L1216'></a><a href='#L1216'>1216</a>
  1270. <a name='L1217'></a><a href='#L1217'>1217</a>
  1271. <a name='L1218'></a><a href='#L1218'>1218</a>
  1272. <a name='L1219'></a><a href='#L1219'>1219</a>
  1273. <a name='L1220'></a><a href='#L1220'>1220</a>
  1274. <a name='L1221'></a><a href='#L1221'>1221</a>
  1275. <a name='L1222'></a><a href='#L1222'>1222</a>
  1276. <a name='L1223'></a><a href='#L1223'>1223</a>
  1277. <a name='L1224'></a><a href='#L1224'>1224</a>
  1278. <a name='L1225'></a><a href='#L1225'>1225</a>
  1279. <a name='L1226'></a><a href='#L1226'>1226</a>
  1280. <a name='L1227'></a><a href='#L1227'>1227</a>
  1281. <a name='L1228'></a><a href='#L1228'>1228</a>
  1282. <a name='L1229'></a><a href='#L1229'>1229</a>
  1283. <a name='L1230'></a><a href='#L1230'>1230</a>
  1284. <a name='L1231'></a><a href='#L1231'>1231</a>
  1285. <a name='L1232'></a><a href='#L1232'>1232</a>
  1286. <a name='L1233'></a><a href='#L1233'>1233</a>
  1287. <a name='L1234'></a><a href='#L1234'>1234</a>
  1288. <a name='L1235'></a><a href='#L1235'>1235</a>
  1289. <a name='L1236'></a><a href='#L1236'>1236</a>
  1290. <a name='L1237'></a><a href='#L1237'>1237</a>
  1291. <a name='L1238'></a><a href='#L1238'>1238</a>
  1292. <a name='L1239'></a><a href='#L1239'>1239</a>
  1293. <a name='L1240'></a><a href='#L1240'>1240</a>
  1294. <a name='L1241'></a><a href='#L1241'>1241</a>
  1295. <a name='L1242'></a><a href='#L1242'>1242</a>
  1296. <a name='L1243'></a><a href='#L1243'>1243</a>
  1297. <a name='L1244'></a><a href='#L1244'>1244</a>
  1298. <a name='L1245'></a><a href='#L1245'>1245</a>
  1299. <a name='L1246'></a><a href='#L1246'>1246</a>
  1300. <a name='L1247'></a><a href='#L1247'>1247</a>
  1301. <a name='L1248'></a><a href='#L1248'>1248</a>
  1302. <a name='L1249'></a><a href='#L1249'>1249</a>
  1303. <a name='L1250'></a><a href='#L1250'>1250</a>
  1304. <a name='L1251'></a><a href='#L1251'>1251</a>
  1305. <a name='L1252'></a><a href='#L1252'>1252</a>
  1306. <a name='L1253'></a><a href='#L1253'>1253</a>
  1307. <a name='L1254'></a><a href='#L1254'>1254</a>
  1308. <a name='L1255'></a><a href='#L1255'>1255</a>
  1309. <a name='L1256'></a><a href='#L1256'>1256</a>
  1310. <a name='L1257'></a><a href='#L1257'>1257</a>
  1311. <a name='L1258'></a><a href='#L1258'>1258</a>
  1312. <a name='L1259'></a><a href='#L1259'>1259</a>
  1313. <a name='L1260'></a><a href='#L1260'>1260</a>
  1314. <a name='L1261'></a><a href='#L1261'>1261</a>
  1315. <a name='L1262'></a><a href='#L1262'>1262</a>
  1316. <a name='L1263'></a><a href='#L1263'>1263</a>
  1317. <a name='L1264'></a><a href='#L1264'>1264</a>
  1318. <a name='L1265'></a><a href='#L1265'>1265</a>
  1319. <a name='L1266'></a><a href='#L1266'>1266</a>
  1320. <a name='L1267'></a><a href='#L1267'>1267</a>
  1321. <a name='L1268'></a><a href='#L1268'>1268</a>
  1322. <a name='L1269'></a><a href='#L1269'>1269</a>
  1323. <a name='L1270'></a><a href='#L1270'>1270</a>
  1324. <a name='L1271'></a><a href='#L1271'>1271</a>
  1325. <a name='L1272'></a><a href='#L1272'>1272</a>
  1326. <a name='L1273'></a><a href='#L1273'>1273</a>
  1327. <a name='L1274'></a><a href='#L1274'>1274</a>
  1328. <a name='L1275'></a><a href='#L1275'>1275</a>
  1329. <a name='L1276'></a><a href='#L1276'>1276</a>
  1330. <a name='L1277'></a><a href='#L1277'>1277</a>
  1331. <a name='L1278'></a><a href='#L1278'>1278</a>
  1332. <a name='L1279'></a><a href='#L1279'>1279</a>
  1333. <a name='L1280'></a><a href='#L1280'>1280</a>
  1334. <a name='L1281'></a><a href='#L1281'>1281</a>
  1335. <a name='L1282'></a><a href='#L1282'>1282</a>
  1336. <a name='L1283'></a><a href='#L1283'>1283</a>
  1337. <a name='L1284'></a><a href='#L1284'>1284</a>
  1338. <a name='L1285'></a><a href='#L1285'>1285</a>
  1339. <a name='L1286'></a><a href='#L1286'>1286</a>
  1340. <a name='L1287'></a><a href='#L1287'>1287</a>
  1341. <a name='L1288'></a><a href='#L1288'>1288</a>
  1342. <a name='L1289'></a><a href='#L1289'>1289</a>
  1343. <a name='L1290'></a><a href='#L1290'>1290</a>
  1344. <a name='L1291'></a><a href='#L1291'>1291</a>
  1345. <a name='L1292'></a><a href='#L1292'>1292</a>
  1346. <a name='L1293'></a><a href='#L1293'>1293</a>
  1347. <a name='L1294'></a><a href='#L1294'>1294</a>
  1348. <a name='L1295'></a><a href='#L1295'>1295</a>
  1349. <a name='L1296'></a><a href='#L1296'>1296</a>
  1350. <a name='L1297'></a><a href='#L1297'>1297</a>
  1351. <a name='L1298'></a><a href='#L1298'>1298</a>
  1352. <a name='L1299'></a><a href='#L1299'>1299</a>
  1353. <a name='L1300'></a><a href='#L1300'>1300</a>
  1354. <a name='L1301'></a><a href='#L1301'>1301</a>
  1355. <a name='L1302'></a><a href='#L1302'>1302</a>
  1356. <a name='L1303'></a><a href='#L1303'>1303</a>
  1357. <a name='L1304'></a><a href='#L1304'>1304</a>
  1358. <a name='L1305'></a><a href='#L1305'>1305</a>
  1359. <a name='L1306'></a><a href='#L1306'>1306</a>
  1360. <a name='L1307'></a><a href='#L1307'>1307</a>
  1361. <a name='L1308'></a><a href='#L1308'>1308</a>
  1362. <a name='L1309'></a><a href='#L1309'>1309</a>
  1363. <a name='L1310'></a><a href='#L1310'>1310</a>
  1364. <a name='L1311'></a><a href='#L1311'>1311</a>
  1365. <a name='L1312'></a><a href='#L1312'>1312</a>
  1366. <a name='L1313'></a><a href='#L1313'>1313</a>
  1367. <a name='L1314'></a><a href='#L1314'>1314</a>
  1368. <a name='L1315'></a><a href='#L1315'>1315</a>
  1369. <a name='L1316'></a><a href='#L1316'>1316</a>
  1370. <a name='L1317'></a><a href='#L1317'>1317</a>
  1371. <a name='L1318'></a><a href='#L1318'>1318</a>
  1372. <a name='L1319'></a><a href='#L1319'>1319</a>
  1373. <a name='L1320'></a><a href='#L1320'>1320</a>
  1374. <a name='L1321'></a><a href='#L1321'>1321</a>
  1375. <a name='L1322'></a><a href='#L1322'>1322</a>
  1376. <a name='L1323'></a><a href='#L1323'>1323</a>
  1377. <a name='L1324'></a><a href='#L1324'>1324</a>
  1378. <a name='L1325'></a><a href='#L1325'>1325</a>
  1379. <a name='L1326'></a><a href='#L1326'>1326</a>
  1380. <a name='L1327'></a><a href='#L1327'>1327</a>
  1381. <a name='L1328'></a><a href='#L1328'>1328</a>
  1382. <a name='L1329'></a><a href='#L1329'>1329</a>
  1383. <a name='L1330'></a><a href='#L1330'>1330</a>
  1384. <a name='L1331'></a><a href='#L1331'>1331</a>
  1385. <a name='L1332'></a><a href='#L1332'>1332</a>
  1386. <a name='L1333'></a><a href='#L1333'>1333</a>
  1387. <a name='L1334'></a><a href='#L1334'>1334</a>
  1388. <a name='L1335'></a><a href='#L1335'>1335</a>
  1389. <a name='L1336'></a><a href='#L1336'>1336</a>
  1390. <a name='L1337'></a><a href='#L1337'>1337</a>
  1391. <a name='L1338'></a><a href='#L1338'>1338</a>
  1392. <a name='L1339'></a><a href='#L1339'>1339</a>
  1393. <a name='L1340'></a><a href='#L1340'>1340</a>
  1394. <a name='L1341'></a><a href='#L1341'>1341</a>
  1395. <a name='L1342'></a><a href='#L1342'>1342</a>
  1396. <a name='L1343'></a><a href='#L1343'>1343</a>
  1397. <a name='L1344'></a><a href='#L1344'>1344</a>
  1398. <a name='L1345'></a><a href='#L1345'>1345</a>
  1399. <a name='L1346'></a><a href='#L1346'>1346</a>
  1400. <a name='L1347'></a><a href='#L1347'>1347</a>
  1401. <a name='L1348'></a><a href='#L1348'>1348</a>
  1402. <a name='L1349'></a><a href='#L1349'>1349</a>
  1403. <a name='L1350'></a><a href='#L1350'>1350</a>
  1404. <a name='L1351'></a><a href='#L1351'>1351</a>
  1405. <a name='L1352'></a><a href='#L1352'>1352</a>
  1406. <a name='L1353'></a><a href='#L1353'>1353</a>
  1407. <a name='L1354'></a><a href='#L1354'>1354</a>
  1408. <a name='L1355'></a><a href='#L1355'>1355</a>
  1409. <a name='L1356'></a><a href='#L1356'>1356</a>
  1410. <a name='L1357'></a><a href='#L1357'>1357</a>
  1411. <a name='L1358'></a><a href='#L1358'>1358</a>
  1412. <a name='L1359'></a><a href='#L1359'>1359</a>
  1413. <a name='L1360'></a><a href='#L1360'>1360</a>
  1414. <a name='L1361'></a><a href='#L1361'>1361</a>
  1415. <a name='L1362'></a><a href='#L1362'>1362</a>
  1416. <a name='L1363'></a><a href='#L1363'>1363</a>
  1417. <a name='L1364'></a><a href='#L1364'>1364</a>
  1418. <a name='L1365'></a><a href='#L1365'>1365</a>
  1419. <a name='L1366'></a><a href='#L1366'>1366</a>
  1420. <a name='L1367'></a><a href='#L1367'>1367</a>
  1421. <a name='L1368'></a><a href='#L1368'>1368</a>
  1422. <a name='L1369'></a><a href='#L1369'>1369</a>
  1423. <a name='L1370'></a><a href='#L1370'>1370</a>
  1424. <a name='L1371'></a><a href='#L1371'>1371</a>
  1425. <a name='L1372'></a><a href='#L1372'>1372</a>
  1426. <a name='L1373'></a><a href='#L1373'>1373</a>
  1427. <a name='L1374'></a><a href='#L1374'>1374</a>
  1428. <a name='L1375'></a><a href='#L1375'>1375</a>
  1429. <a name='L1376'></a><a href='#L1376'>1376</a>
  1430. <a name='L1377'></a><a href='#L1377'>1377</a>
  1431. <a name='L1378'></a><a href='#L1378'>1378</a>
  1432. <a name='L1379'></a><a href='#L1379'>1379</a>
  1433. <a name='L1380'></a><a href='#L1380'>1380</a>
  1434. <a name='L1381'></a><a href='#L1381'>1381</a>
  1435. <a name='L1382'></a><a href='#L1382'>1382</a>
  1436. <a name='L1383'></a><a href='#L1383'>1383</a>
  1437. <a name='L1384'></a><a href='#L1384'>1384</a>
  1438. <a name='L1385'></a><a href='#L1385'>1385</a>
  1439. <a name='L1386'></a><a href='#L1386'>1386</a>
  1440. <a name='L1387'></a><a href='#L1387'>1387</a>
  1441. <a name='L1388'></a><a href='#L1388'>1388</a>
  1442. <a name='L1389'></a><a href='#L1389'>1389</a>
  1443. <a name='L1390'></a><a href='#L1390'>1390</a>
  1444. <a name='L1391'></a><a href='#L1391'>1391</a>
  1445. <a name='L1392'></a><a href='#L1392'>1392</a>
  1446. <a name='L1393'></a><a href='#L1393'>1393</a>
  1447. <a name='L1394'></a><a href='#L1394'>1394</a>
  1448. <a name='L1395'></a><a href='#L1395'>1395</a>
  1449. <a name='L1396'></a><a href='#L1396'>1396</a>
  1450. <a name='L1397'></a><a href='#L1397'>1397</a>
  1451. <a name='L1398'></a><a href='#L1398'>1398</a>
  1452. <a name='L1399'></a><a href='#L1399'>1399</a>
  1453. <a name='L1400'></a><a href='#L1400'>1400</a>
  1454. <a name='L1401'></a><a href='#L1401'>1401</a>
  1455. <a name='L1402'></a><a href='#L1402'>1402</a>
  1456. <a name='L1403'></a><a href='#L1403'>1403</a>
  1457. <a name='L1404'></a><a href='#L1404'>1404</a>
  1458. <a name='L1405'></a><a href='#L1405'>1405</a>
  1459. <a name='L1406'></a><a href='#L1406'>1406</a>
  1460. <a name='L1407'></a><a href='#L1407'>1407</a>
  1461. <a name='L1408'></a><a href='#L1408'>1408</a>
  1462. <a name='L1409'></a><a href='#L1409'>1409</a>
  1463. <a name='L1410'></a><a href='#L1410'>1410</a>
  1464. <a name='L1411'></a><a href='#L1411'>1411</a>
  1465. <a name='L1412'></a><a href='#L1412'>1412</a>
  1466. <a name='L1413'></a><a href='#L1413'>1413</a>
  1467. <a name='L1414'></a><a href='#L1414'>1414</a>
  1468. <a name='L1415'></a><a href='#L1415'>1415</a>
  1469. <a name='L1416'></a><a href='#L1416'>1416</a>
  1470. <a name='L1417'></a><a href='#L1417'>1417</a>
  1471. <a name='L1418'></a><a href='#L1418'>1418</a>
  1472. <a name='L1419'></a><a href='#L1419'>1419</a>
  1473. <a name='L1420'></a><a href='#L1420'>1420</a>
  1474. <a name='L1421'></a><a href='#L1421'>1421</a>
  1475. <a name='L1422'></a><a href='#L1422'>1422</a>
  1476. <a name='L1423'></a><a href='#L1423'>1423</a>
  1477. <a name='L1424'></a><a href='#L1424'>1424</a>
  1478. <a name='L1425'></a><a href='#L1425'>1425</a>
  1479. <a name='L1426'></a><a href='#L1426'>1426</a>
  1480. <a name='L1427'></a><a href='#L1427'>1427</a>
  1481. <a name='L1428'></a><a href='#L1428'>1428</a>
  1482. <a name='L1429'></a><a href='#L1429'>1429</a>
  1483. <a name='L1430'></a><a href='#L1430'>1430</a>
  1484. <a name='L1431'></a><a href='#L1431'>1431</a>
  1485. <a name='L1432'></a><a href='#L1432'>1432</a>
  1486. <a name='L1433'></a><a href='#L1433'>1433</a>
  1487. <a name='L1434'></a><a href='#L1434'>1434</a>
  1488. <a name='L1435'></a><a href='#L1435'>1435</a>
  1489. <a name='L1436'></a><a href='#L1436'>1436</a>
  1490. <a name='L1437'></a><a href='#L1437'>1437</a>
  1491. <a name='L1438'></a><a href='#L1438'>1438</a>
  1492. <a name='L1439'></a><a href='#L1439'>1439</a>
  1493. <a name='L1440'></a><a href='#L1440'>1440</a>
  1494. <a name='L1441'></a><a href='#L1441'>1441</a>
  1495. <a name='L1442'></a><a href='#L1442'>1442</a>
  1496. <a name='L1443'></a><a href='#L1443'>1443</a>
  1497. <a name='L1444'></a><a href='#L1444'>1444</a>
  1498. <a name='L1445'></a><a href='#L1445'>1445</a>
  1499. <a name='L1446'></a><a href='#L1446'>1446</a>
  1500. <a name='L1447'></a><a href='#L1447'>1447</a>
  1501. <a name='L1448'></a><a href='#L1448'>1448</a>
  1502. <a name='L1449'></a><a href='#L1449'>1449</a>
  1503. <a name='L1450'></a><a href='#L1450'>1450</a>
  1504. <a name='L1451'></a><a href='#L1451'>1451</a>
  1505. <a name='L1452'></a><a href='#L1452'>1452</a>
  1506. <a name='L1453'></a><a href='#L1453'>1453</a>
  1507. <a name='L1454'></a><a href='#L1454'>1454</a>
  1508. <a name='L1455'></a><a href='#L1455'>1455</a>
  1509. <a name='L1456'></a><a href='#L1456'>1456</a>
  1510. <a name='L1457'></a><a href='#L1457'>1457</a>
  1511. <a name='L1458'></a><a href='#L1458'>1458</a>
  1512. <a name='L1459'></a><a href='#L1459'>1459</a>
  1513. <a name='L1460'></a><a href='#L1460'>1460</a>
  1514. <a name='L1461'></a><a href='#L1461'>1461</a>
  1515. <a name='L1462'></a><a href='#L1462'>1462</a>
  1516. <a name='L1463'></a><a href='#L1463'>1463</a>
  1517. <a name='L1464'></a><a href='#L1464'>1464</a>
  1518. <a name='L1465'></a><a href='#L1465'>1465</a>
  1519. <a name='L1466'></a><a href='#L1466'>1466</a>
  1520. <a name='L1467'></a><a href='#L1467'>1467</a>
  1521. <a name='L1468'></a><a href='#L1468'>1468</a>
  1522. <a name='L1469'></a><a href='#L1469'>1469</a>
  1523. <a name='L1470'></a><a href='#L1470'>1470</a>
  1524. <a name='L1471'></a><a href='#L1471'>1471</a>
  1525. <a name='L1472'></a><a href='#L1472'>1472</a>
  1526. <a name='L1473'></a><a href='#L1473'>1473</a>
  1527. <a name='L1474'></a><a href='#L1474'>1474</a>
  1528. <a name='L1475'></a><a href='#L1475'>1475</a>
  1529. <a name='L1476'></a><a href='#L1476'>1476</a>
  1530. <a name='L1477'></a><a href='#L1477'>1477</a>
  1531. <a name='L1478'></a><a href='#L1478'>1478</a>
  1532. <a name='L1479'></a><a href='#L1479'>1479</a>
  1533. <a name='L1480'></a><a href='#L1480'>1480</a>
  1534. <a name='L1481'></a><a href='#L1481'>1481</a>
  1535. <a name='L1482'></a><a href='#L1482'>1482</a>
  1536. <a name='L1483'></a><a href='#L1483'>1483</a>
  1537. <a name='L1484'></a><a href='#L1484'>1484</a>
  1538. <a name='L1485'></a><a href='#L1485'>1485</a>
  1539. <a name='L1486'></a><a href='#L1486'>1486</a>
  1540. <a name='L1487'></a><a href='#L1487'>1487</a>
  1541. <a name='L1488'></a><a href='#L1488'>1488</a>
  1542. <a name='L1489'></a><a href='#L1489'>1489</a>
  1543. <a name='L1490'></a><a href='#L1490'>1490</a>
  1544. <a name='L1491'></a><a href='#L1491'>1491</a>
  1545. <a name='L1492'></a><a href='#L1492'>1492</a>
  1546. <a name='L1493'></a><a href='#L1493'>1493</a>
  1547. <a name='L1494'></a><a href='#L1494'>1494</a>
  1548. <a name='L1495'></a><a href='#L1495'>1495</a>
  1549. <a name='L1496'></a><a href='#L1496'>1496</a>
  1550. <a name='L1497'></a><a href='#L1497'>1497</a>
  1551. <a name='L1498'></a><a href='#L1498'>1498</a>
  1552. <a name='L1499'></a><a href='#L1499'>1499</a>
  1553. <a name='L1500'></a><a href='#L1500'>1500</a>
  1554. <a name='L1501'></a><a href='#L1501'>1501</a>
  1555. <a name='L1502'></a><a href='#L1502'>1502</a>
  1556. <a name='L1503'></a><a href='#L1503'>1503</a>
  1557. <a name='L1504'></a><a href='#L1504'>1504</a>
  1558. <a name='L1505'></a><a href='#L1505'>1505</a>
  1559. <a name='L1506'></a><a href='#L1506'>1506</a>
  1560. <a name='L1507'></a><a href='#L1507'>1507</a>
  1561. <a name='L1508'></a><a href='#L1508'>1508</a>
  1562. <a name='L1509'></a><a href='#L1509'>1509</a>
  1563. <a name='L1510'></a><a href='#L1510'>1510</a>
  1564. <a name='L1511'></a><a href='#L1511'>1511</a>
  1565. <a name='L1512'></a><a href='#L1512'>1512</a>
  1566. <a name='L1513'></a><a href='#L1513'>1513</a>
  1567. <a name='L1514'></a><a href='#L1514'>1514</a>
  1568. <a name='L1515'></a><a href='#L1515'>1515</a>
  1569. <a name='L1516'></a><a href='#L1516'>1516</a>
  1570. <a name='L1517'></a><a href='#L1517'>1517</a>
  1571. <a name='L1518'></a><a href='#L1518'>1518</a>
  1572. <a name='L1519'></a><a href='#L1519'>1519</a>
  1573. <a name='L1520'></a><a href='#L1520'>1520</a>
  1574. <a name='L1521'></a><a href='#L1521'>1521</a>
  1575. <a name='L1522'></a><a href='#L1522'>1522</a>
  1576. <a name='L1523'></a><a href='#L1523'>1523</a>
  1577. <a name='L1524'></a><a href='#L1524'>1524</a>
  1578. <a name='L1525'></a><a href='#L1525'>1525</a>
  1579. <a name='L1526'></a><a href='#L1526'>1526</a>
  1580. <a name='L1527'></a><a href='#L1527'>1527</a>
  1581. <a name='L1528'></a><a href='#L1528'>1528</a>
  1582. <a name='L1529'></a><a href='#L1529'>1529</a>
  1583. <a name='L1530'></a><a href='#L1530'>1530</a>
  1584. <a name='L1531'></a><a href='#L1531'>1531</a>
  1585. <a name='L1532'></a><a href='#L1532'>1532</a>
  1586. <a name='L1533'></a><a href='#L1533'>1533</a>
  1587. <a name='L1534'></a><a href='#L1534'>1534</a>
  1588. <a name='L1535'></a><a href='#L1535'>1535</a>
  1589. <a name='L1536'></a><a href='#L1536'>1536</a>
  1590. <a name='L1537'></a><a href='#L1537'>1537</a>
  1591. <a name='L1538'></a><a href='#L1538'>1538</a>
  1592. <a name='L1539'></a><a href='#L1539'>1539</a>
  1593. <a name='L1540'></a><a href='#L1540'>1540</a>
  1594. <a name='L1541'></a><a href='#L1541'>1541</a>
  1595. <a name='L1542'></a><a href='#L1542'>1542</a>
  1596. <a name='L1543'></a><a href='#L1543'>1543</a>
  1597. <a name='L1544'></a><a href='#L1544'>1544</a>
  1598. <a name='L1545'></a><a href='#L1545'>1545</a>
  1599. <a name='L1546'></a><a href='#L1546'>1546</a>
  1600. <a name='L1547'></a><a href='#L1547'>1547</a>
  1601. <a name='L1548'></a><a href='#L1548'>1548</a>
  1602. <a name='L1549'></a><a href='#L1549'>1549</a>
  1603. <a name='L1550'></a><a href='#L1550'>1550</a>
  1604. <a name='L1551'></a><a href='#L1551'>1551</a>
  1605. <a name='L1552'></a><a href='#L1552'>1552</a>
  1606. <a name='L1553'></a><a href='#L1553'>1553</a>
  1607. <a name='L1554'></a><a href='#L1554'>1554</a>
  1608. <a name='L1555'></a><a href='#L1555'>1555</a>
  1609. <a name='L1556'></a><a href='#L1556'>1556</a>
  1610. <a name='L1557'></a><a href='#L1557'>1557</a>
  1611. <a name='L1558'></a><a href='#L1558'>1558</a>
  1612. <a name='L1559'></a><a href='#L1559'>1559</a>
  1613. <a name='L1560'></a><a href='#L1560'>1560</a>
  1614. <a name='L1561'></a><a href='#L1561'>1561</a>
  1615. <a name='L1562'></a><a href='#L1562'>1562</a>
  1616. <a name='L1563'></a><a href='#L1563'>1563</a>
  1617. <a name='L1564'></a><a href='#L1564'>1564</a>
  1618. <a name='L1565'></a><a href='#L1565'>1565</a>
  1619. <a name='L1566'></a><a href='#L1566'>1566</a>
  1620. <a name='L1567'></a><a href='#L1567'>1567</a>
  1621. <a name='L1568'></a><a href='#L1568'>1568</a>
  1622. <a name='L1569'></a><a href='#L1569'>1569</a>
  1623. <a name='L1570'></a><a href='#L1570'>1570</a>
  1624. <a name='L1571'></a><a href='#L1571'>1571</a>
  1625. <a name='L1572'></a><a href='#L1572'>1572</a>
  1626. <a name='L1573'></a><a href='#L1573'>1573</a>
  1627. <a name='L1574'></a><a href='#L1574'>1574</a>
  1628. <a name='L1575'></a><a href='#L1575'>1575</a>
  1629. <a name='L1576'></a><a href='#L1576'>1576</a>
  1630. <a name='L1577'></a><a href='#L1577'>1577</a>
  1631. <a name='L1578'></a><a href='#L1578'>1578</a>
  1632. <a name='L1579'></a><a href='#L1579'>1579</a>
  1633. <a name='L1580'></a><a href='#L1580'>1580</a>
  1634. <a name='L1581'></a><a href='#L1581'>1581</a>
  1635. <a name='L1582'></a><a href='#L1582'>1582</a>
  1636. <a name='L1583'></a><a href='#L1583'>1583</a>
  1637. <a name='L1584'></a><a href='#L1584'>1584</a>
  1638. <a name='L1585'></a><a href='#L1585'>1585</a>
  1639. <a name='L1586'></a><a href='#L1586'>1586</a>
  1640. <a name='L1587'></a><a href='#L1587'>1587</a>
  1641. <a name='L1588'></a><a href='#L1588'>1588</a>
  1642. <a name='L1589'></a><a href='#L1589'>1589</a>
  1643. <a name='L1590'></a><a href='#L1590'>1590</a>
  1644. <a name='L1591'></a><a href='#L1591'>1591</a>
  1645. <a name='L1592'></a><a href='#L1592'>1592</a>
  1646. <a name='L1593'></a><a href='#L1593'>1593</a>
  1647. <a name='L1594'></a><a href='#L1594'>1594</a>
  1648. <a name='L1595'></a><a href='#L1595'>1595</a>
  1649. <a name='L1596'></a><a href='#L1596'>1596</a>
  1650. <a name='L1597'></a><a href='#L1597'>1597</a>
  1651. <a name='L1598'></a><a href='#L1598'>1598</a>
  1652. <a name='L1599'></a><a href='#L1599'>1599</a>
  1653. <a name='L1600'></a><a href='#L1600'>1600</a>
  1654. <a name='L1601'></a><a href='#L1601'>1601</a>
  1655. <a name='L1602'></a><a href='#L1602'>1602</a>
  1656. <a name='L1603'></a><a href='#L1603'>1603</a>
  1657. <a name='L1604'></a><a href='#L1604'>1604</a>
  1658. <a name='L1605'></a><a href='#L1605'>1605</a>
  1659. <a name='L1606'></a><a href='#L1606'>1606</a>
  1660. <a name='L1607'></a><a href='#L1607'>1607</a>
  1661. <a name='L1608'></a><a href='#L1608'>1608</a>
  1662. <a name='L1609'></a><a href='#L1609'>1609</a>
  1663. <a name='L1610'></a><a href='#L1610'>1610</a>
  1664. <a name='L1611'></a><a href='#L1611'>1611</a>
  1665. <a name='L1612'></a><a href='#L1612'>1612</a>
  1666. <a name='L1613'></a><a href='#L1613'>1613</a>
  1667. <a name='L1614'></a><a href='#L1614'>1614</a>
  1668. <a name='L1615'></a><a href='#L1615'>1615</a>
  1669. <a name='L1616'></a><a href='#L1616'>1616</a>
  1670. <a name='L1617'></a><a href='#L1617'>1617</a>
  1671. <a name='L1618'></a><a href='#L1618'>1618</a>
  1672. <a name='L1619'></a><a href='#L1619'>1619</a>
  1673. <a name='L1620'></a><a href='#L1620'>1620</a>
  1674. <a name='L1621'></a><a href='#L1621'>1621</a>
  1675. <a name='L1622'></a><a href='#L1622'>1622</a>
  1676. <a name='L1623'></a><a href='#L1623'>1623</a>
  1677. <a name='L1624'></a><a href='#L1624'>1624</a>
  1678. <a name='L1625'></a><a href='#L1625'>1625</a>
  1679. <a name='L1626'></a><a href='#L1626'>1626</a>
  1680. <a name='L1627'></a><a href='#L1627'>1627</a>
  1681. <a name='L1628'></a><a href='#L1628'>1628</a>
  1682. <a name='L1629'></a><a href='#L1629'>1629</a>
  1683. <a name='L1630'></a><a href='#L1630'>1630</a>
  1684. <a name='L1631'></a><a href='#L1631'>1631</a>
  1685. <a name='L1632'></a><a href='#L1632'>1632</a>
  1686. <a name='L1633'></a><a href='#L1633'>1633</a>
  1687. <a name='L1634'></a><a href='#L1634'>1634</a>
  1688. <a name='L1635'></a><a href='#L1635'>1635</a>
  1689. <a name='L1636'></a><a href='#L1636'>1636</a>
  1690. <a name='L1637'></a><a href='#L1637'>1637</a>
  1691. <a name='L1638'></a><a href='#L1638'>1638</a>
  1692. <a name='L1639'></a><a href='#L1639'>1639</a>
  1693. <a name='L1640'></a><a href='#L1640'>1640</a>
  1694. <a name='L1641'></a><a href='#L1641'>1641</a>
  1695. <a name='L1642'></a><a href='#L1642'>1642</a>
  1696. <a name='L1643'></a><a href='#L1643'>1643</a>
  1697. <a name='L1644'></a><a href='#L1644'>1644</a>
  1698. <a name='L1645'></a><a href='#L1645'>1645</a>
  1699. <a name='L1646'></a><a href='#L1646'>1646</a>
  1700. <a name='L1647'></a><a href='#L1647'>1647</a>
  1701. <a name='L1648'></a><a href='#L1648'>1648</a>
  1702. <a name='L1649'></a><a href='#L1649'>1649</a>
  1703. <a name='L1650'></a><a href='#L1650'>1650</a>
  1704. <a name='L1651'></a><a href='#L1651'>1651</a>
  1705. <a name='L1652'></a><a href='#L1652'>1652</a>
  1706. <a name='L1653'></a><a href='#L1653'>1653</a>
  1707. <a name='L1654'></a><a href='#L1654'>1654</a>
  1708. <a name='L1655'></a><a href='#L1655'>1655</a>
  1709. <a name='L1656'></a><a href='#L1656'>1656</a>
  1710. <a name='L1657'></a><a href='#L1657'>1657</a>
  1711. <a name='L1658'></a><a href='#L1658'>1658</a>
  1712. <a name='L1659'></a><a href='#L1659'>1659</a>
  1713. <a name='L1660'></a><a href='#L1660'>1660</a>
  1714. <a name='L1661'></a><a href='#L1661'>1661</a>
  1715. <a name='L1662'></a><a href='#L1662'>1662</a>
  1716. <a name='L1663'></a><a href='#L1663'>1663</a>
  1717. <a name='L1664'></a><a href='#L1664'>1664</a>
  1718. <a name='L1665'></a><a href='#L1665'>1665</a>
  1719. <a name='L1666'></a><a href='#L1666'>1666</a>
  1720. <a name='L1667'></a><a href='#L1667'>1667</a>
  1721. <a name='L1668'></a><a href='#L1668'>1668</a>
  1722. <a name='L1669'></a><a href='#L1669'>1669</a>
  1723. <a name='L1670'></a><a href='#L1670'>1670</a>
  1724. <a name='L1671'></a><a href='#L1671'>1671</a>
  1725. <a name='L1672'></a><a href='#L1672'>1672</a>
  1726. <a name='L1673'></a><a href='#L1673'>1673</a>
  1727. <a name='L1674'></a><a href='#L1674'>1674</a>
  1728. <a name='L1675'></a><a href='#L1675'>1675</a>
  1729. <a name='L1676'></a><a href='#L1676'>1676</a>
  1730. <a name='L1677'></a><a href='#L1677'>1677</a>
  1731. <a name='L1678'></a><a href='#L1678'>1678</a>
  1732. <a name='L1679'></a><a href='#L1679'>1679</a>
  1733. <a name='L1680'></a><a href='#L1680'>1680</a>
  1734. <a name='L1681'></a><a href='#L1681'>1681</a>
  1735. <a name='L1682'></a><a href='#L1682'>1682</a>
  1736. <a name='L1683'></a><a href='#L1683'>1683</a>
  1737. <a name='L1684'></a><a href='#L1684'>1684</a>
  1738. <a name='L1685'></a><a href='#L1685'>1685</a>
  1739. <a name='L1686'></a><a href='#L1686'>1686</a>
  1740. <a name='L1687'></a><a href='#L1687'>1687</a>
  1741. <a name='L1688'></a><a href='#L1688'>1688</a>
  1742. <a name='L1689'></a><a href='#L1689'>1689</a>
  1743. <a name='L1690'></a><a href='#L1690'>1690</a>
  1744. <a name='L1691'></a><a href='#L1691'>1691</a>
  1745. <a name='L1692'></a><a href='#L1692'>1692</a>
  1746. <a name='L1693'></a><a href='#L1693'>1693</a>
  1747. <a name='L1694'></a><a href='#L1694'>1694</a>
  1748. <a name='L1695'></a><a href='#L1695'>1695</a>
  1749. <a name='L1696'></a><a href='#L1696'>1696</a>
  1750. <a name='L1697'></a><a href='#L1697'>1697</a>
  1751. <a name='L1698'></a><a href='#L1698'>1698</a>
  1752. <a name='L1699'></a><a href='#L1699'>1699</a>
  1753. <a name='L1700'></a><a href='#L1700'>1700</a>
  1754. <a name='L1701'></a><a href='#L1701'>1701</a>
  1755. <a name='L1702'></a><a href='#L1702'>1702</a>
  1756. <a name='L1703'></a><a href='#L1703'>1703</a>
  1757. <a name='L1704'></a><a href='#L1704'>1704</a>
  1758. <a name='L1705'></a><a href='#L1705'>1705</a>
  1759. <a name='L1706'></a><a href='#L1706'>1706</a>
  1760. <a name='L1707'></a><a href='#L1707'>1707</a>
  1761. <a name='L1708'></a><a href='#L1708'>1708</a>
  1762. <a name='L1709'></a><a href='#L1709'>1709</a>
  1763. <a name='L1710'></a><a href='#L1710'>1710</a>
  1764. <a name='L1711'></a><a href='#L1711'>1711</a>
  1765. <a name='L1712'></a><a href='#L1712'>1712</a>
  1766. <a name='L1713'></a><a href='#L1713'>1713</a>
  1767. <a name='L1714'></a><a href='#L1714'>1714</a>
  1768. <a name='L1715'></a><a href='#L1715'>1715</a>
  1769. <a name='L1716'></a><a href='#L1716'>1716</a>
  1770. <a name='L1717'></a><a href='#L1717'>1717</a>
  1771. <a name='L1718'></a><a href='#L1718'>1718</a>
  1772. <a name='L1719'></a><a href='#L1719'>1719</a>
  1773. <a name='L1720'></a><a href='#L1720'>1720</a>
  1774. <a name='L1721'></a><a href='#L1721'>1721</a>
  1775. <a name='L1722'></a><a href='#L1722'>1722</a>
  1776. <a name='L1723'></a><a href='#L1723'>1723</a>
  1777. <a name='L1724'></a><a href='#L1724'>1724</a>
  1778. <a name='L1725'></a><a href='#L1725'>1725</a>
  1779. <a name='L1726'></a><a href='#L1726'>1726</a>
  1780. <a name='L1727'></a><a href='#L1727'>1727</a>
  1781. <a name='L1728'></a><a href='#L1728'>1728</a>
  1782. <a name='L1729'></a><a href='#L1729'>1729</a>
  1783. <a name='L1730'></a><a href='#L1730'>1730</a>
  1784. <a name='L1731'></a><a href='#L1731'>1731</a>
  1785. <a name='L1732'></a><a href='#L1732'>1732</a>
  1786. <a name='L1733'></a><a href='#L1733'>1733</a>
  1787. <a name='L1734'></a><a href='#L1734'>1734</a>
  1788. <a name='L1735'></a><a href='#L1735'>1735</a>
  1789. <a name='L1736'></a><a href='#L1736'>1736</a>
  1790. <a name='L1737'></a><a href='#L1737'>1737</a>
  1791. <a name='L1738'></a><a href='#L1738'>1738</a>
  1792. <a name='L1739'></a><a href='#L1739'>1739</a>
  1793. <a name='L1740'></a><a href='#L1740'>1740</a>
  1794. <a name='L1741'></a><a href='#L1741'>1741</a>
  1795. <a name='L1742'></a><a href='#L1742'>1742</a>
  1796. <a name='L1743'></a><a href='#L1743'>1743</a>
  1797. <a name='L1744'></a><a href='#L1744'>1744</a>
  1798. <a name='L1745'></a><a href='#L1745'>1745</a>
  1799. <a name='L1746'></a><a href='#L1746'>1746</a>
  1800. <a name='L1747'></a><a href='#L1747'>1747</a>
  1801. <a name='L1748'></a><a href='#L1748'>1748</a>
  1802. <a name='L1749'></a><a href='#L1749'>1749</a>
  1803. <a name='L1750'></a><a href='#L1750'>1750</a>
  1804. <a name='L1751'></a><a href='#L1751'>1751</a>
  1805. <a name='L1752'></a><a href='#L1752'>1752</a>
  1806. <a name='L1753'></a><a href='#L1753'>1753</a>
  1807. <a name='L1754'></a><a href='#L1754'>1754</a>
  1808. <a name='L1755'></a><a href='#L1755'>1755</a>
  1809. <a name='L1756'></a><a href='#L1756'>1756</a>
  1810. <a name='L1757'></a><a href='#L1757'>1757</a>
  1811. <a name='L1758'></a><a href='#L1758'>1758</a>
  1812. <a name='L1759'></a><a href='#L1759'>1759</a>
  1813. <a name='L1760'></a><a href='#L1760'>1760</a>
  1814. <a name='L1761'></a><a href='#L1761'>1761</a>
  1815. <a name='L1762'></a><a href='#L1762'>1762</a>
  1816. <a name='L1763'></a><a href='#L1763'>1763</a>
  1817. <a name='L1764'></a><a href='#L1764'>1764</a>
  1818. <a name='L1765'></a><a href='#L1765'>1765</a>
  1819. <a name='L1766'></a><a href='#L1766'>1766</a>
  1820. <a name='L1767'></a><a href='#L1767'>1767</a>
  1821. <a name='L1768'></a><a href='#L1768'>1768</a>
  1822. <a name='L1769'></a><a href='#L1769'>1769</a>
  1823. <a name='L1770'></a><a href='#L1770'>1770</a>
  1824. <a name='L1771'></a><a href='#L1771'>1771</a>
  1825. <a name='L1772'></a><a href='#L1772'>1772</a>
  1826. <a name='L1773'></a><a href='#L1773'>1773</a>
  1827. <a name='L1774'></a><a href='#L1774'>1774</a>
  1828. <a name='L1775'></a><a href='#L1775'>1775</a>
  1829. <a name='L1776'></a><a href='#L1776'>1776</a>
  1830. <a name='L1777'></a><a href='#L1777'>1777</a>
  1831. <a name='L1778'></a><a href='#L1778'>1778</a>
  1832. <a name='L1779'></a><a href='#L1779'>1779</a>
  1833. <a name='L1780'></a><a href='#L1780'>1780</a>
  1834. <a name='L1781'></a><a href='#L1781'>1781</a>
  1835. <a name='L1782'></a><a href='#L1782'>1782</a>
  1836. <a name='L1783'></a><a href='#L1783'>1783</a>
  1837. <a name='L1784'></a><a href='#L1784'>1784</a>
  1838. <a name='L1785'></a><a href='#L1785'>1785</a>
  1839. <a name='L1786'></a><a href='#L1786'>1786</a>
  1840. <a name='L1787'></a><a href='#L1787'>1787</a>
  1841. <a name='L1788'></a><a href='#L1788'>1788</a>
  1842. <a name='L1789'></a><a href='#L1789'>1789</a>
  1843. <a name='L1790'></a><a href='#L1790'>1790</a>
  1844. <a name='L1791'></a><a href='#L1791'>1791</a>
  1845. <a name='L1792'></a><a href='#L1792'>1792</a>
  1846. <a name='L1793'></a><a href='#L1793'>1793</a>
  1847. <a name='L1794'></a><a href='#L1794'>1794</a>
  1848. <a name='L1795'></a><a href='#L1795'>1795</a>
  1849. <a name='L1796'></a><a href='#L1796'>1796</a>
  1850. <a name='L1797'></a><a href='#L1797'>1797</a>
  1851. <a name='L1798'></a><a href='#L1798'>1798</a>
  1852. <a name='L1799'></a><a href='#L1799'>1799</a>
  1853. <a name='L1800'></a><a href='#L1800'>1800</a>
  1854. <a name='L1801'></a><a href='#L1801'>1801</a>
  1855. <a name='L1802'></a><a href='#L1802'>1802</a>
  1856. <a name='L1803'></a><a href='#L1803'>1803</a>
  1857. <a name='L1804'></a><a href='#L1804'>1804</a>
  1858. <a name='L1805'></a><a href='#L1805'>1805</a>
  1859. <a name='L1806'></a><a href='#L1806'>1806</a>
  1860. <a name='L1807'></a><a href='#L1807'>1807</a>
  1861. <a name='L1808'></a><a href='#L1808'>1808</a>
  1862. <a name='L1809'></a><a href='#L1809'>1809</a>
  1863. <a name='L1810'></a><a href='#L1810'>1810</a>
  1864. <a name='L1811'></a><a href='#L1811'>1811</a>
  1865. <a name='L1812'></a><a href='#L1812'>1812</a>
  1866. <a name='L1813'></a><a href='#L1813'>1813</a>
  1867. <a name='L1814'></a><a href='#L1814'>1814</a>
  1868. <a name='L1815'></a><a href='#L1815'>1815</a>
  1869. <a name='L1816'></a><a href='#L1816'>1816</a>
  1870. <a name='L1817'></a><a href='#L1817'>1817</a>
  1871. <a name='L1818'></a><a href='#L1818'>1818</a>
  1872. <a name='L1819'></a><a href='#L1819'>1819</a>
  1873. <a name='L1820'></a><a href='#L1820'>1820</a>
  1874. <a name='L1821'></a><a href='#L1821'>1821</a>
  1875. <a name='L1822'></a><a href='#L1822'>1822</a>
  1876. <a name='L1823'></a><a href='#L1823'>1823</a>
  1877. <a name='L1824'></a><a href='#L1824'>1824</a>
  1878. <a name='L1825'></a><a href='#L1825'>1825</a>
  1879. <a name='L1826'></a><a href='#L1826'>1826</a>
  1880. <a name='L1827'></a><a href='#L1827'>1827</a>
  1881. <a name='L1828'></a><a href='#L1828'>1828</a>
  1882. <a name='L1829'></a><a href='#L1829'>1829</a>
  1883. <a name='L1830'></a><a href='#L1830'>1830</a>
  1884. <a name='L1831'></a><a href='#L1831'>1831</a>
  1885. <a name='L1832'></a><a href='#L1832'>1832</a>
  1886. <a name='L1833'></a><a href='#L1833'>1833</a>
  1887. <a name='L1834'></a><a href='#L1834'>1834</a>
  1888. <a name='L1835'></a><a href='#L1835'>1835</a>
  1889. <a name='L1836'></a><a href='#L1836'>1836</a>
  1890. <a name='L1837'></a><a href='#L1837'>1837</a>
  1891. <a name='L1838'></a><a href='#L1838'>1838</a>
  1892. <a name='L1839'></a><a href='#L1839'>1839</a>
  1893. <a name='L1840'></a><a href='#L1840'>1840</a>
  1894. <a name='L1841'></a><a href='#L1841'>1841</a>
  1895. <a name='L1842'></a><a href='#L1842'>1842</a>
  1896. <a name='L1843'></a><a href='#L1843'>1843</a>
  1897. <a name='L1844'></a><a href='#L1844'>1844</a>
  1898. <a name='L1845'></a><a href='#L1845'>1845</a>
  1899. <a name='L1846'></a><a href='#L1846'>1846</a>
  1900. <a name='L1847'></a><a href='#L1847'>1847</a>
  1901. <a name='L1848'></a><a href='#L1848'>1848</a>
  1902. <a name='L1849'></a><a href='#L1849'>1849</a>
  1903. <a name='L1850'></a><a href='#L1850'>1850</a>
  1904. <a name='L1851'></a><a href='#L1851'>1851</a>
  1905. <a name='L1852'></a><a href='#L1852'>1852</a>
  1906. <a name='L1853'></a><a href='#L1853'>1853</a>
  1907. <a name='L1854'></a><a href='#L1854'>1854</a>
  1908. <a name='L1855'></a><a href='#L1855'>1855</a>
  1909. <a name='L1856'></a><a href='#L1856'>1856</a>
  1910. <a name='L1857'></a><a href='#L1857'>1857</a>
  1911. <a name='L1858'></a><a href='#L1858'>1858</a>
  1912. <a name='L1859'></a><a href='#L1859'>1859</a>
  1913. <a name='L1860'></a><a href='#L1860'>1860</a>
  1914. <a name='L1861'></a><a href='#L1861'>1861</a>
  1915. <a name='L1862'></a><a href='#L1862'>1862</a>
  1916. <a name='L1863'></a><a href='#L1863'>1863</a>
  1917. <a name='L1864'></a><a href='#L1864'>1864</a>
  1918. <a name='L1865'></a><a href='#L1865'>1865</a>
  1919. <a name='L1866'></a><a href='#L1866'>1866</a>
  1920. <a name='L1867'></a><a href='#L1867'>1867</a>
  1921. <a name='L1868'></a><a href='#L1868'>1868</a>
  1922. <a name='L1869'></a><a href='#L1869'>1869</a>
  1923. <a name='L1870'></a><a href='#L1870'>1870</a>
  1924. <a name='L1871'></a><a href='#L1871'>1871</a>
  1925. <a name='L1872'></a><a href='#L1872'>1872</a>
  1926. <a name='L1873'></a><a href='#L1873'>1873</a>
  1927. <a name='L1874'></a><a href='#L1874'>1874</a>
  1928. <a name='L1875'></a><a href='#L1875'>1875</a>
  1929. <a name='L1876'></a><a href='#L1876'>1876</a>
  1930. <a name='L1877'></a><a href='#L1877'>1877</a>
  1931. <a name='L1878'></a><a href='#L1878'>1878</a>
  1932. <a name='L1879'></a><a href='#L1879'>1879</a>
  1933. <a name='L1880'></a><a href='#L1880'>1880</a>
  1934. <a name='L1881'></a><a href='#L1881'>1881</a>
  1935. <a name='L1882'></a><a href='#L1882'>1882</a>
  1936. <a name='L1883'></a><a href='#L1883'>1883</a>
  1937. <a name='L1884'></a><a href='#L1884'>1884</a>
  1938. <a name='L1885'></a><a href='#L1885'>1885</a>
  1939. <a name='L1886'></a><a href='#L1886'>1886</a>
  1940. <a name='L1887'></a><a href='#L1887'>1887</a>
  1941. <a name='L1888'></a><a href='#L1888'>1888</a>
  1942. <a name='L1889'></a><a href='#L1889'>1889</a>
  1943. <a name='L1890'></a><a href='#L1890'>1890</a>
  1944. <a name='L1891'></a><a href='#L1891'>1891</a>
  1945. <a name='L1892'></a><a href='#L1892'>1892</a>
  1946. <a name='L1893'></a><a href='#L1893'>1893</a>
  1947. <a name='L1894'></a><a href='#L1894'>1894</a>
  1948. <a name='L1895'></a><a href='#L1895'>1895</a>
  1949. <a name='L1896'></a><a href='#L1896'>1896</a>
  1950. <a name='L1897'></a><a href='#L1897'>1897</a>
  1951. <a name='L1898'></a><a href='#L1898'>1898</a>
  1952. <a name='L1899'></a><a href='#L1899'>1899</a>
  1953. <a name='L1900'></a><a href='#L1900'>1900</a>
  1954. <a name='L1901'></a><a href='#L1901'>1901</a>
  1955. <a name='L1902'></a><a href='#L1902'>1902</a>
  1956. <a name='L1903'></a><a href='#L1903'>1903</a>
  1957. <a name='L1904'></a><a href='#L1904'>1904</a>
  1958. <a name='L1905'></a><a href='#L1905'>1905</a>
  1959. <a name='L1906'></a><a href='#L1906'>1906</a>
  1960. <a name='L1907'></a><a href='#L1907'>1907</a>
  1961. <a name='L1908'></a><a href='#L1908'>1908</a>
  1962. <a name='L1909'></a><a href='#L1909'>1909</a>
  1963. <a name='L1910'></a><a href='#L1910'>1910</a>
  1964. <a name='L1911'></a><a href='#L1911'>1911</a>
  1965. <a name='L1912'></a><a href='#L1912'>1912</a>
  1966. <a name='L1913'></a><a href='#L1913'>1913</a>
  1967. <a name='L1914'></a><a href='#L1914'>1914</a>
  1968. <a name='L1915'></a><a href='#L1915'>1915</a>
  1969. <a name='L1916'></a><a href='#L1916'>1916</a>
  1970. <a name='L1917'></a><a href='#L1917'>1917</a>
  1971. <a name='L1918'></a><a href='#L1918'>1918</a>
  1972. <a name='L1919'></a><a href='#L1919'>1919</a>
  1973. <a name='L1920'></a><a href='#L1920'>1920</a>
  1974. <a name='L1921'></a><a href='#L1921'>1921</a>
  1975. <a name='L1922'></a><a href='#L1922'>1922</a>
  1976. <a name='L1923'></a><a href='#L1923'>1923</a>
  1977. <a name='L1924'></a><a href='#L1924'>1924</a>
  1978. <a name='L1925'></a><a href='#L1925'>1925</a>
  1979. <a name='L1926'></a><a href='#L1926'>1926</a>
  1980. <a name='L1927'></a><a href='#L1927'>1927</a>
  1981. <a name='L1928'></a><a href='#L1928'>1928</a>
  1982. <a name='L1929'></a><a href='#L1929'>1929</a>
  1983. <a name='L1930'></a><a href='#L1930'>1930</a>
  1984. <a name='L1931'></a><a href='#L1931'>1931</a>
  1985. <a name='L1932'></a><a href='#L1932'>1932</a>
  1986. <a name='L1933'></a><a href='#L1933'>1933</a>
  1987. <a name='L1934'></a><a href='#L1934'>1934</a>
  1988. <a name='L1935'></a><a href='#L1935'>1935</a>
  1989. <a name='L1936'></a><a href='#L1936'>1936</a>
  1990. <a name='L1937'></a><a href='#L1937'>1937</a>
  1991. <a name='L1938'></a><a href='#L1938'>1938</a>
  1992. <a name='L1939'></a><a href='#L1939'>1939</a>
  1993. <a name='L1940'></a><a href='#L1940'>1940</a>
  1994. <a name='L1941'></a><a href='#L1941'>1941</a>
  1995. <a name='L1942'></a><a href='#L1942'>1942</a>
  1996. <a name='L1943'></a><a href='#L1943'>1943</a>
  1997. <a name='L1944'></a><a href='#L1944'>1944</a>
  1998. <a name='L1945'></a><a href='#L1945'>1945</a>
  1999. <a name='L1946'></a><a href='#L1946'>1946</a>
  2000. <a name='L1947'></a><a href='#L1947'>1947</a>
  2001. <a name='L1948'></a><a href='#L1948'>1948</a>
  2002. <a name='L1949'></a><a href='#L1949'>1949</a>
  2003. <a name='L1950'></a><a href='#L1950'>1950</a>
  2004. <a name='L1951'></a><a href='#L1951'>1951</a>
  2005. <a name='L1952'></a><a href='#L1952'>1952</a>
  2006. <a name='L1953'></a><a href='#L1953'>1953</a>
  2007. <a name='L1954'></a><a href='#L1954'>1954</a>
  2008. <a name='L1955'></a><a href='#L1955'>1955</a>
  2009. <a name='L1956'></a><a href='#L1956'>1956</a>
  2010. <a name='L1957'></a><a href='#L1957'>1957</a>
  2011. <a name='L1958'></a><a href='#L1958'>1958</a>
  2012. <a name='L1959'></a><a href='#L1959'>1959</a>
  2013. <a name='L1960'></a><a href='#L1960'>1960</a>
  2014. <a name='L1961'></a><a href='#L1961'>1961</a>
  2015. <a name='L1962'></a><a href='#L1962'>1962</a>
  2016. <a name='L1963'></a><a href='#L1963'>1963</a>
  2017. <a name='L1964'></a><a href='#L1964'>1964</a>
  2018. <a name='L1965'></a><a href='#L1965'>1965</a>
  2019. <a name='L1966'></a><a href='#L1966'>1966</a>
  2020. <a name='L1967'></a><a href='#L1967'>1967</a>
  2021. <a name='L1968'></a><a href='#L1968'>1968</a>
  2022. <a name='L1969'></a><a href='#L1969'>1969</a>
  2023. <a name='L1970'></a><a href='#L1970'>1970</a>
  2024. <a name='L1971'></a><a href='#L1971'>1971</a>
  2025. <a name='L1972'></a><a href='#L1972'>1972</a>
  2026. <a name='L1973'></a><a href='#L1973'>1973</a>
  2027. <a name='L1974'></a><a href='#L1974'>1974</a>
  2028. <a name='L1975'></a><a href='#L1975'>1975</a>
  2029. <a name='L1976'></a><a href='#L1976'>1976</a>
  2030. <a name='L1977'></a><a href='#L1977'>1977</a>
  2031. <a name='L1978'></a><a href='#L1978'>1978</a>
  2032. <a name='L1979'></a><a href='#L1979'>1979</a>
  2033. <a name='L1980'></a><a href='#L1980'>1980</a>
  2034. <a name='L1981'></a><a href='#L1981'>1981</a>
  2035. <a name='L1982'></a><a href='#L1982'>1982</a>
  2036. <a name='L1983'></a><a href='#L1983'>1983</a>
  2037. <a name='L1984'></a><a href='#L1984'>1984</a>
  2038. <a name='L1985'></a><a href='#L1985'>1985</a>
  2039. <a name='L1986'></a><a href='#L1986'>1986</a>
  2040. <a name='L1987'></a><a href='#L1987'>1987</a>
  2041. <a name='L1988'></a><a href='#L1988'>1988</a>
  2042. <a name='L1989'></a><a href='#L1989'>1989</a>
  2043. <a name='L1990'></a><a href='#L1990'>1990</a>
  2044. <a name='L1991'></a><a href='#L1991'>1991</a>
  2045. <a name='L1992'></a><a href='#L1992'>1992</a>
  2046. <a name='L1993'></a><a href='#L1993'>1993</a>
  2047. <a name='L1994'></a><a href='#L1994'>1994</a>
  2048. <a name='L1995'></a><a href='#L1995'>1995</a>
  2049. <a name='L1996'></a><a href='#L1996'>1996</a>
  2050. <a name='L1997'></a><a href='#L1997'>1997</a>
  2051. <a name='L1998'></a><a href='#L1998'>1998</a>
  2052. <a name='L1999'></a><a href='#L1999'>1999</a>
  2053. <a name='L2000'></a><a href='#L2000'>2000</a>
  2054. <a name='L2001'></a><a href='#L2001'>2001</a>
  2055. <a name='L2002'></a><a href='#L2002'>2002</a>
  2056. <a name='L2003'></a><a href='#L2003'>2003</a>
  2057. <a name='L2004'></a><a href='#L2004'>2004</a>
  2058. <a name='L2005'></a><a href='#L2005'>2005</a>
  2059. <a name='L2006'></a><a href='#L2006'>2006</a>
  2060. <a name='L2007'></a><a href='#L2007'>2007</a>
  2061. <a name='L2008'></a><a href='#L2008'>2008</a>
  2062. <a name='L2009'></a><a href='#L2009'>2009</a>
  2063. <a name='L2010'></a><a href='#L2010'>2010</a>
  2064. <a name='L2011'></a><a href='#L2011'>2011</a>
  2065. <a name='L2012'></a><a href='#L2012'>2012</a>
  2066. <a name='L2013'></a><a href='#L2013'>2013</a>
  2067. <a name='L2014'></a><a href='#L2014'>2014</a>
  2068. <a name='L2015'></a><a href='#L2015'>2015</a>
  2069. <a name='L2016'></a><a href='#L2016'>2016</a>
  2070. <a name='L2017'></a><a href='#L2017'>2017</a>
  2071. <a name='L2018'></a><a href='#L2018'>2018</a>
  2072. <a name='L2019'></a><a href='#L2019'>2019</a>
  2073. <a name='L2020'></a><a href='#L2020'>2020</a>
  2074. <a name='L2021'></a><a href='#L2021'>2021</a>
  2075. <a name='L2022'></a><a href='#L2022'>2022</a>
  2076. <a name='L2023'></a><a href='#L2023'>2023</a>
  2077. <a name='L2024'></a><a href='#L2024'>2024</a>
  2078. <a name='L2025'></a><a href='#L2025'>2025</a>
  2079. <a name='L2026'></a><a href='#L2026'>2026</a>
  2080. <a name='L2027'></a><a href='#L2027'>2027</a>
  2081. <a name='L2028'></a><a href='#L2028'>2028</a>
  2082. <a name='L2029'></a><a href='#L2029'>2029</a>
  2083. <a name='L2030'></a><a href='#L2030'>2030</a>
  2084. <a name='L2031'></a><a href='#L2031'>2031</a>
  2085. <a name='L2032'></a><a href='#L2032'>2032</a>
  2086. <a name='L2033'></a><a href='#L2033'>2033</a>
  2087. <a name='L2034'></a><a href='#L2034'>2034</a>
  2088. <a name='L2035'></a><a href='#L2035'>2035</a>
  2089. <a name='L2036'></a><a href='#L2036'>2036</a>
  2090. <a name='L2037'></a><a href='#L2037'>2037</a>
  2091. <a name='L2038'></a><a href='#L2038'>2038</a>
  2092. <a name='L2039'></a><a href='#L2039'>2039</a>
  2093. <a name='L2040'></a><a href='#L2040'>2040</a>
  2094. <a name='L2041'></a><a href='#L2041'>2041</a>
  2095. <a name='L2042'></a><a href='#L2042'>2042</a>
  2096. <a name='L2043'></a><a href='#L2043'>2043</a>
  2097. <a name='L2044'></a><a href='#L2044'>2044</a>
  2098. <a name='L2045'></a><a href='#L2045'>2045</a>
  2099. <a name='L2046'></a><a href='#L2046'>2046</a>
  2100. <a name='L2047'></a><a href='#L2047'>2047</a>
  2101. <a name='L2048'></a><a href='#L2048'>2048</a>
  2102. <a name='L2049'></a><a href='#L2049'>2049</a>
  2103. <a name='L2050'></a><a href='#L2050'>2050</a>
  2104. <a name='L2051'></a><a href='#L2051'>2051</a>
  2105. <a name='L2052'></a><a href='#L2052'>2052</a>
  2106. <a name='L2053'></a><a href='#L2053'>2053</a>
  2107. <a name='L2054'></a><a href='#L2054'>2054</a>
  2108. <a name='L2055'></a><a href='#L2055'>2055</a>
  2109. <a name='L2056'></a><a href='#L2056'>2056</a>
  2110. <a name='L2057'></a><a href='#L2057'>2057</a>
  2111. <a name='L2058'></a><a href='#L2058'>2058</a>
  2112. <a name='L2059'></a><a href='#L2059'>2059</a>
  2113. <a name='L2060'></a><a href='#L2060'>2060</a>
  2114. <a name='L2061'></a><a href='#L2061'>2061</a>
  2115. <a name='L2062'></a><a href='#L2062'>2062</a>
  2116. <a name='L2063'></a><a href='#L2063'>2063</a>
  2117. <a name='L2064'></a><a href='#L2064'>2064</a>
  2118. <a name='L2065'></a><a href='#L2065'>2065</a>
  2119. <a name='L2066'></a><a href='#L2066'>2066</a>
  2120. <a name='L2067'></a><a href='#L2067'>2067</a>
  2121. <a name='L2068'></a><a href='#L2068'>2068</a>
  2122. <a name='L2069'></a><a href='#L2069'>2069</a>
  2123. <a name='L2070'></a><a href='#L2070'>2070</a>
  2124. <a name='L2071'></a><a href='#L2071'>2071</a>
  2125. <a name='L2072'></a><a href='#L2072'>2072</a>
  2126. <a name='L2073'></a><a href='#L2073'>2073</a>
  2127. <a name='L2074'></a><a href='#L2074'>2074</a>
  2128. <a name='L2075'></a><a href='#L2075'>2075</a>
  2129. <a name='L2076'></a><a href='#L2076'>2076</a>
  2130. <a name='L2077'></a><a href='#L2077'>2077</a>
  2131. <a name='L2078'></a><a href='#L2078'>2078</a>
  2132. <a name='L2079'></a><a href='#L2079'>2079</a>
  2133. <a name='L2080'></a><a href='#L2080'>2080</a>
  2134. <a name='L2081'></a><a href='#L2081'>2081</a>
  2135. <a name='L2082'></a><a href='#L2082'>2082</a>
  2136. <a name='L2083'></a><a href='#L2083'>2083</a>
  2137. <a name='L2084'></a><a href='#L2084'>2084</a>
  2138. <a name='L2085'></a><a href='#L2085'>2085</a>
  2139. <a name='L2086'></a><a href='#L2086'>2086</a>
  2140. <a name='L2087'></a><a href='#L2087'>2087</a>
  2141. <a name='L2088'></a><a href='#L2088'>2088</a>
  2142. <a name='L2089'></a><a href='#L2089'>2089</a>
  2143. <a name='L2090'></a><a href='#L2090'>2090</a>
  2144. <a name='L2091'></a><a href='#L2091'>2091</a>
  2145. <a name='L2092'></a><a href='#L2092'>2092</a>
  2146. <a name='L2093'></a><a href='#L2093'>2093</a>
  2147. <a name='L2094'></a><a href='#L2094'>2094</a>
  2148. <a name='L2095'></a><a href='#L2095'>2095</a>
  2149. <a name='L2096'></a><a href='#L2096'>2096</a>
  2150. <a name='L2097'></a><a href='#L2097'>2097</a>
  2151. <a name='L2098'></a><a href='#L2098'>2098</a>
  2152. <a name='L2099'></a><a href='#L2099'>2099</a>
  2153. <a name='L2100'></a><a href='#L2100'>2100</a>
  2154. <a name='L2101'></a><a href='#L2101'>2101</a>
  2155. <a name='L2102'></a><a href='#L2102'>2102</a>
  2156. <a name='L2103'></a><a href='#L2103'>2103</a>
  2157. <a name='L2104'></a><a href='#L2104'>2104</a>
  2158. <a name='L2105'></a><a href='#L2105'>2105</a>
  2159. <a name='L2106'></a><a href='#L2106'>2106</a>
  2160. <a name='L2107'></a><a href='#L2107'>2107</a>
  2161. <a name='L2108'></a><a href='#L2108'>2108</a>
  2162. <a name='L2109'></a><a href='#L2109'>2109</a>
  2163. <a name='L2110'></a><a href='#L2110'>2110</a>
  2164. <a name='L2111'></a><a href='#L2111'>2111</a>
  2165. <a name='L2112'></a><a href='#L2112'>2112</a>
  2166. <a name='L2113'></a><a href='#L2113'>2113</a>
  2167. <a name='L2114'></a><a href='#L2114'>2114</a>
  2168. <a name='L2115'></a><a href='#L2115'>2115</a>
  2169. <a name='L2116'></a><a href='#L2116'>2116</a>
  2170. <a name='L2117'></a><a href='#L2117'>2117</a>
  2171. <a name='L2118'></a><a href='#L2118'>2118</a>
  2172. <a name='L2119'></a><a href='#L2119'>2119</a>
  2173. <a name='L2120'></a><a href='#L2120'>2120</a>
  2174. <a name='L2121'></a><a href='#L2121'>2121</a>
  2175. <a name='L2122'></a><a href='#L2122'>2122</a>
  2176. <a name='L2123'></a><a href='#L2123'>2123</a>
  2177. <a name='L2124'></a><a href='#L2124'>2124</a>
  2178. <a name='L2125'></a><a href='#L2125'>2125</a>
  2179. <a name='L2126'></a><a href='#L2126'>2126</a>
  2180. <a name='L2127'></a><a href='#L2127'>2127</a>
  2181. <a name='L2128'></a><a href='#L2128'>2128</a>
  2182. <a name='L2129'></a><a href='#L2129'>2129</a>
  2183. <a name='L2130'></a><a href='#L2130'>2130</a>
  2184. <a name='L2131'></a><a href='#L2131'>2131</a>
  2185. <a name='L2132'></a><a href='#L2132'>2132</a>
  2186. <a name='L2133'></a><a href='#L2133'>2133</a>
  2187. <a name='L2134'></a><a href='#L2134'>2134</a>
  2188. <a name='L2135'></a><a href='#L2135'>2135</a>
  2189. <a name='L2136'></a><a href='#L2136'>2136</a>
  2190. <a name='L2137'></a><a href='#L2137'>2137</a>
  2191. <a name='L2138'></a><a href='#L2138'>2138</a>
  2192. <a name='L2139'></a><a href='#L2139'>2139</a>
  2193. <a name='L2140'></a><a href='#L2140'>2140</a>
  2194. <a name='L2141'></a><a href='#L2141'>2141</a>
  2195. <a name='L2142'></a><a href='#L2142'>2142</a>
  2196. <a name='L2143'></a><a href='#L2143'>2143</a>
  2197. <a name='L2144'></a><a href='#L2144'>2144</a>
  2198. <a name='L2145'></a><a href='#L2145'>2145</a>
  2199. <a name='L2146'></a><a href='#L2146'>2146</a>
  2200. <a name='L2147'></a><a href='#L2147'>2147</a>
  2201. <a name='L2148'></a><a href='#L2148'>2148</a>
  2202. <a name='L2149'></a><a href='#L2149'>2149</a>
  2203. <a name='L2150'></a><a href='#L2150'>2150</a>
  2204. <a name='L2151'></a><a href='#L2151'>2151</a>
  2205. <a name='L2152'></a><a href='#L2152'>2152</a>
  2206. <a name='L2153'></a><a href='#L2153'>2153</a>
  2207. <a name='L2154'></a><a href='#L2154'>2154</a>
  2208. <a name='L2155'></a><a href='#L2155'>2155</a>
  2209. <a name='L2156'></a><a href='#L2156'>2156</a>
  2210. <a name='L2157'></a><a href='#L2157'>2157</a>
  2211. <a name='L2158'></a><a href='#L2158'>2158</a>
  2212. <a name='L2159'></a><a href='#L2159'>2159</a>
  2213. <a name='L2160'></a><a href='#L2160'>2160</a>
  2214. <a name='L2161'></a><a href='#L2161'>2161</a>
  2215. <a name='L2162'></a><a href='#L2162'>2162</a>
  2216. <a name='L2163'></a><a href='#L2163'>2163</a>
  2217. <a name='L2164'></a><a href='#L2164'>2164</a>
  2218. <a name='L2165'></a><a href='#L2165'>2165</a>
  2219. <a name='L2166'></a><a href='#L2166'>2166</a>
  2220. <a name='L2167'></a><a href='#L2167'>2167</a>
  2221. <a name='L2168'></a><a href='#L2168'>2168</a>
  2222. <a name='L2169'></a><a href='#L2169'>2169</a>
  2223. <a name='L2170'></a><a href='#L2170'>2170</a>
  2224. <a name='L2171'></a><a href='#L2171'>2171</a>
  2225. <a name='L2172'></a><a href='#L2172'>2172</a>
  2226. <a name='L2173'></a><a href='#L2173'>2173</a>
  2227. <a name='L2174'></a><a href='#L2174'>2174</a>
  2228. <a name='L2175'></a><a href='#L2175'>2175</a>
  2229. <a name='L2176'></a><a href='#L2176'>2176</a>
  2230. <a name='L2177'></a><a href='#L2177'>2177</a>
  2231. <a name='L2178'></a><a href='#L2178'>2178</a>
  2232. <a name='L2179'></a><a href='#L2179'>2179</a>
  2233. <a name='L2180'></a><a href='#L2180'>2180</a>
  2234. <a name='L2181'></a><a href='#L2181'>2181</a>
  2235. <a name='L2182'></a><a href='#L2182'>2182</a>
  2236. <a name='L2183'></a><a href='#L2183'>2183</a>
  2237. <a name='L2184'></a><a href='#L2184'>2184</a>
  2238. <a name='L2185'></a><a href='#L2185'>2185</a>
  2239. <a name='L2186'></a><a href='#L2186'>2186</a>
  2240. <a name='L2187'></a><a href='#L2187'>2187</a>
  2241. <a name='L2188'></a><a href='#L2188'>2188</a>
  2242. <a name='L2189'></a><a href='#L2189'>2189</a>
  2243. <a name='L2190'></a><a href='#L2190'>2190</a>
  2244. <a name='L2191'></a><a href='#L2191'>2191</a>
  2245. <a name='L2192'></a><a href='#L2192'>2192</a>
  2246. <a name='L2193'></a><a href='#L2193'>2193</a>
  2247. <a name='L2194'></a><a href='#L2194'>2194</a>
  2248. <a name='L2195'></a><a href='#L2195'>2195</a>
  2249. <a name='L2196'></a><a href='#L2196'>2196</a>
  2250. <a name='L2197'></a><a href='#L2197'>2197</a>
  2251. <a name='L2198'></a><a href='#L2198'>2198</a>
  2252. <a name='L2199'></a><a href='#L2199'>2199</a>
  2253. <a name='L2200'></a><a href='#L2200'>2200</a>
  2254. <a name='L2201'></a><a href='#L2201'>2201</a>
  2255. <a name='L2202'></a><a href='#L2202'>2202</a>
  2256. <a name='L2203'></a><a href='#L2203'>2203</a>
  2257. <a name='L2204'></a><a href='#L2204'>2204</a>
  2258. <a name='L2205'></a><a href='#L2205'>2205</a>
  2259. <a name='L2206'></a><a href='#L2206'>2206</a>
  2260. <a name='L2207'></a><a href='#L2207'>2207</a>
  2261. <a name='L2208'></a><a href='#L2208'>2208</a>
  2262. <a name='L2209'></a><a href='#L2209'>2209</a>
  2263. <a name='L2210'></a><a href='#L2210'>2210</a>
  2264. <a name='L2211'></a><a href='#L2211'>2211</a>
  2265. <a name='L2212'></a><a href='#L2212'>2212</a>
  2266. <a name='L2213'></a><a href='#L2213'>2213</a>
  2267. <a name='L2214'></a><a href='#L2214'>2214</a>
  2268. <a name='L2215'></a><a href='#L2215'>2215</a>
  2269. <a name='L2216'></a><a href='#L2216'>2216</a>
  2270. <a name='L2217'></a><a href='#L2217'>2217</a>
  2271. <a name='L2218'></a><a href='#L2218'>2218</a>
  2272. <a name='L2219'></a><a href='#L2219'>2219</a>
  2273. <a name='L2220'></a><a href='#L2220'>2220</a>
  2274. <a name='L2221'></a><a href='#L2221'>2221</a>
  2275. <a name='L2222'></a><a href='#L2222'>2222</a>
  2276. <a name='L2223'></a><a href='#L2223'>2223</a>
  2277. <a name='L2224'></a><a href='#L2224'>2224</a>
  2278. <a name='L2225'></a><a href='#L2225'>2225</a>
  2279. <a name='L2226'></a><a href='#L2226'>2226</a>
  2280. <a name='L2227'></a><a href='#L2227'>2227</a>
  2281. <a name='L2228'></a><a href='#L2228'>2228</a>
  2282. <a name='L2229'></a><a href='#L2229'>2229</a>
  2283. <a name='L2230'></a><a href='#L2230'>2230</a>
  2284. <a name='L2231'></a><a href='#L2231'>2231</a>
  2285. <a name='L2232'></a><a href='#L2232'>2232</a>
  2286. <a name='L2233'></a><a href='#L2233'>2233</a>
  2287. <a name='L2234'></a><a href='#L2234'>2234</a>
  2288. <a name='L2235'></a><a href='#L2235'>2235</a>
  2289. <a name='L2236'></a><a href='#L2236'>2236</a>
  2290. <a name='L2237'></a><a href='#L2237'>2237</a>
  2291. <a name='L2238'></a><a href='#L2238'>2238</a>
  2292. <a name='L2239'></a><a href='#L2239'>2239</a>
  2293. <a name='L2240'></a><a href='#L2240'>2240</a>
  2294. <a name='L2241'></a><a href='#L2241'>2241</a>
  2295. <a name='L2242'></a><a href='#L2242'>2242</a>
  2296. <a name='L2243'></a><a href='#L2243'>2243</a>
  2297. <a name='L2244'></a><a href='#L2244'>2244</a>
  2298. <a name='L2245'></a><a href='#L2245'>2245</a>
  2299. <a name='L2246'></a><a href='#L2246'>2246</a>
  2300. <a name='L2247'></a><a href='#L2247'>2247</a>
  2301. <a name='L2248'></a><a href='#L2248'>2248</a>
  2302. <a name='L2249'></a><a href='#L2249'>2249</a>
  2303. <a name='L2250'></a><a href='#L2250'>2250</a>
  2304. <a name='L2251'></a><a href='#L2251'>2251</a>
  2305. <a name='L2252'></a><a href='#L2252'>2252</a>
  2306. <a name='L2253'></a><a href='#L2253'>2253</a>
  2307. <a name='L2254'></a><a href='#L2254'>2254</a>
  2308. <a name='L2255'></a><a href='#L2255'>2255</a>
  2309. <a name='L2256'></a><a href='#L2256'>2256</a>
  2310. <a name='L2257'></a><a href='#L2257'>2257</a>
  2311. <a name='L2258'></a><a href='#L2258'>2258</a>
  2312. <a name='L2259'></a><a href='#L2259'>2259</a>
  2313. <a name='L2260'></a><a href='#L2260'>2260</a>
  2314. <a name='L2261'></a><a href='#L2261'>2261</a>
  2315. <a name='L2262'></a><a href='#L2262'>2262</a>
  2316. <a name='L2263'></a><a href='#L2263'>2263</a>
  2317. <a name='L2264'></a><a href='#L2264'>2264</a>
  2318. <a name='L2265'></a><a href='#L2265'>2265</a>
  2319. <a name='L2266'></a><a href='#L2266'>2266</a>
  2320. <a name='L2267'></a><a href='#L2267'>2267</a>
  2321. <a name='L2268'></a><a href='#L2268'>2268</a>
  2322. <a name='L2269'></a><a href='#L2269'>2269</a>
  2323. <a name='L2270'></a><a href='#L2270'>2270</a>
  2324. <a name='L2271'></a><a href='#L2271'>2271</a>
  2325. <a name='L2272'></a><a href='#L2272'>2272</a>
  2326. <a name='L2273'></a><a href='#L2273'>2273</a>
  2327. <a name='L2274'></a><a href='#L2274'>2274</a>
  2328. <a name='L2275'></a><a href='#L2275'>2275</a>
  2329. <a name='L2276'></a><a href='#L2276'>2276</a>
  2330. <a name='L2277'></a><a href='#L2277'>2277</a>
  2331. <a name='L2278'></a><a href='#L2278'>2278</a>
  2332. <a name='L2279'></a><a href='#L2279'>2279</a>
  2333. <a name='L2280'></a><a href='#L2280'>2280</a>
  2334. <a name='L2281'></a><a href='#L2281'>2281</a>
  2335. <a name='L2282'></a><a href='#L2282'>2282</a>
  2336. <a name='L2283'></a><a href='#L2283'>2283</a>
  2337. <a name='L2284'></a><a href='#L2284'>2284</a>
  2338. <a name='L2285'></a><a href='#L2285'>2285</a>
  2339. <a name='L2286'></a><a href='#L2286'>2286</a>
  2340. <a name='L2287'></a><a href='#L2287'>2287</a>
  2341. <a name='L2288'></a><a href='#L2288'>2288</a>
  2342. <a name='L2289'></a><a href='#L2289'>2289</a>
  2343. <a name='L2290'></a><a href='#L2290'>2290</a>
  2344. <a name='L2291'></a><a href='#L2291'>2291</a>
  2345. <a name='L2292'></a><a href='#L2292'>2292</a>
  2346. <a name='L2293'></a><a href='#L2293'>2293</a>
  2347. <a name='L2294'></a><a href='#L2294'>2294</a>
  2348. <a name='L2295'></a><a href='#L2295'>2295</a>
  2349. <a name='L2296'></a><a href='#L2296'>2296</a>
  2350. <a name='L2297'></a><a href='#L2297'>2297</a>
  2351. <a name='L2298'></a><a href='#L2298'>2298</a>
  2352. <a name='L2299'></a><a href='#L2299'>2299</a>
  2353. <a name='L2300'></a><a href='#L2300'>2300</a>
  2354. <a name='L2301'></a><a href='#L2301'>2301</a>
  2355. <a name='L2302'></a><a href='#L2302'>2302</a>
  2356. <a name='L2303'></a><a href='#L2303'>2303</a>
  2357. <a name='L2304'></a><a href='#L2304'>2304</a>
  2358. <a name='L2305'></a><a href='#L2305'>2305</a>
  2359. <a name='L2306'></a><a href='#L2306'>2306</a>
  2360. <a name='L2307'></a><a href='#L2307'>2307</a>
  2361. <a name='L2308'></a><a href='#L2308'>2308</a>
  2362. <a name='L2309'></a><a href='#L2309'>2309</a>
  2363. <a name='L2310'></a><a href='#L2310'>2310</a>
  2364. <a name='L2311'></a><a href='#L2311'>2311</a>
  2365. <a name='L2312'></a><a href='#L2312'>2312</a>
  2366. <a name='L2313'></a><a href='#L2313'>2313</a>
  2367. <a name='L2314'></a><a href='#L2314'>2314</a>
  2368. <a name='L2315'></a><a href='#L2315'>2315</a>
  2369. <a name='L2316'></a><a href='#L2316'>2316</a>
  2370. <a name='L2317'></a><a href='#L2317'>2317</a>
  2371. <a name='L2318'></a><a href='#L2318'>2318</a>
  2372. <a name='L2319'></a><a href='#L2319'>2319</a>
  2373. <a name='L2320'></a><a href='#L2320'>2320</a>
  2374. <a name='L2321'></a><a href='#L2321'>2321</a>
  2375. <a name='L2322'></a><a href='#L2322'>2322</a>
  2376. <a name='L2323'></a><a href='#L2323'>2323</a>
  2377. <a name='L2324'></a><a href='#L2324'>2324</a>
  2378. <a name='L2325'></a><a href='#L2325'>2325</a>
  2379. <a name='L2326'></a><a href='#L2326'>2326</a>
  2380. <a name='L2327'></a><a href='#L2327'>2327</a>
  2381. <a name='L2328'></a><a href='#L2328'>2328</a>
  2382. <a name='L2329'></a><a href='#L2329'>2329</a>
  2383. <a name='L2330'></a><a href='#L2330'>2330</a>
  2384. <a name='L2331'></a><a href='#L2331'>2331</a>
  2385. <a name='L2332'></a><a href='#L2332'>2332</a>
  2386. <a name='L2333'></a><a href='#L2333'>2333</a>
  2387. <a name='L2334'></a><a href='#L2334'>2334</a>
  2388. <a name='L2335'></a><a href='#L2335'>2335</a>
  2389. <a name='L2336'></a><a href='#L2336'>2336</a>
  2390. <a name='L2337'></a><a href='#L2337'>2337</a>
  2391. <a name='L2338'></a><a href='#L2338'>2338</a>
  2392. <a name='L2339'></a><a href='#L2339'>2339</a>
  2393. <a name='L2340'></a><a href='#L2340'>2340</a>
  2394. <a name='L2341'></a><a href='#L2341'>2341</a>
  2395. <a name='L2342'></a><a href='#L2342'>2342</a>
  2396. <a name='L2343'></a><a href='#L2343'>2343</a>
  2397. <a name='L2344'></a><a href='#L2344'>2344</a>
  2398. <a name='L2345'></a><a href='#L2345'>2345</a>
  2399. <a name='L2346'></a><a href='#L2346'>2346</a>
  2400. <a name='L2347'></a><a href='#L2347'>2347</a>
  2401. <a name='L2348'></a><a href='#L2348'>2348</a>
  2402. <a name='L2349'></a><a href='#L2349'>2349</a>
  2403. <a name='L2350'></a><a href='#L2350'>2350</a>
  2404. <a name='L2351'></a><a href='#L2351'>2351</a>
  2405. <a name='L2352'></a><a href='#L2352'>2352</a>
  2406. <a name='L2353'></a><a href='#L2353'>2353</a>
  2407. <a name='L2354'></a><a href='#L2354'>2354</a>
  2408. <a name='L2355'></a><a href='#L2355'>2355</a>
  2409. <a name='L2356'></a><a href='#L2356'>2356</a>
  2410. <a name='L2357'></a><a href='#L2357'>2357</a>
  2411. <a name='L2358'></a><a href='#L2358'>2358</a>
  2412. <a name='L2359'></a><a href='#L2359'>2359</a>
  2413. <a name='L2360'></a><a href='#L2360'>2360</a>
  2414. <a name='L2361'></a><a href='#L2361'>2361</a>
  2415. <a name='L2362'></a><a href='#L2362'>2362</a>
  2416. <a name='L2363'></a><a href='#L2363'>2363</a>
  2417. <a name='L2364'></a><a href='#L2364'>2364</a>
  2418. <a name='L2365'></a><a href='#L2365'>2365</a>
  2419. <a name='L2366'></a><a href='#L2366'>2366</a>
  2420. <a name='L2367'></a><a href='#L2367'>2367</a>
  2421. <a name='L2368'></a><a href='#L2368'>2368</a>
  2422. <a name='L2369'></a><a href='#L2369'>2369</a>
  2423. <a name='L2370'></a><a href='#L2370'>2370</a>
  2424. <a name='L2371'></a><a href='#L2371'>2371</a>
  2425. <a name='L2372'></a><a href='#L2372'>2372</a>
  2426. <a name='L2373'></a><a href='#L2373'>2373</a>
  2427. <a name='L2374'></a><a href='#L2374'>2374</a>
  2428. <a name='L2375'></a><a href='#L2375'>2375</a>
  2429. <a name='L2376'></a><a href='#L2376'>2376</a>
  2430. <a name='L2377'></a><a href='#L2377'>2377</a>
  2431. <a name='L2378'></a><a href='#L2378'>2378</a>
  2432. <a name='L2379'></a><a href='#L2379'>2379</a>
  2433. <a name='L2380'></a><a href='#L2380'>2380</a>
  2434. <a name='L2381'></a><a href='#L2381'>2381</a>
  2435. <a name='L2382'></a><a href='#L2382'>2382</a>
  2436. <a name='L2383'></a><a href='#L2383'>2383</a>
  2437. <a name='L2384'></a><a href='#L2384'>2384</a>
  2438. <a name='L2385'></a><a href='#L2385'>2385</a>
  2439. <a name='L2386'></a><a href='#L2386'>2386</a>
  2440. <a name='L2387'></a><a href='#L2387'>2387</a>
  2441. <a name='L2388'></a><a href='#L2388'>2388</a>
  2442. <a name='L2389'></a><a href='#L2389'>2389</a>
  2443. <a name='L2390'></a><a href='#L2390'>2390</a>
  2444. <a name='L2391'></a><a href='#L2391'>2391</a>
  2445. <a name='L2392'></a><a href='#L2392'>2392</a>
  2446. <a name='L2393'></a><a href='#L2393'>2393</a>
  2447. <a name='L2394'></a><a href='#L2394'>2394</a>
  2448. <a name='L2395'></a><a href='#L2395'>2395</a>
  2449. <a name='L2396'></a><a href='#L2396'>2396</a>
  2450. <a name='L2397'></a><a href='#L2397'>2397</a>
  2451. <a name='L2398'></a><a href='#L2398'>2398</a>
  2452. <a name='L2399'></a><a href='#L2399'>2399</a>
  2453. <a name='L2400'></a><a href='#L2400'>2400</a>
  2454. <a name='L2401'></a><a href='#L2401'>2401</a>
  2455. <a name='L2402'></a><a href='#L2402'>2402</a>
  2456. <a name='L2403'></a><a href='#L2403'>2403</a>
  2457. <a name='L2404'></a><a href='#L2404'>2404</a>
  2458. <a name='L2405'></a><a href='#L2405'>2405</a>
  2459. <a name='L2406'></a><a href='#L2406'>2406</a>
  2460. <a name='L2407'></a><a href='#L2407'>2407</a>
  2461. <a name='L2408'></a><a href='#L2408'>2408</a>
  2462. <a name='L2409'></a><a href='#L2409'>2409</a>
  2463. <a name='L2410'></a><a href='#L2410'>2410</a>
  2464. <a name='L2411'></a><a href='#L2411'>2411</a>
  2465. <a name='L2412'></a><a href='#L2412'>2412</a>
  2466. <a name='L2413'></a><a href='#L2413'>2413</a>
  2467. <a name='L2414'></a><a href='#L2414'>2414</a>
  2468. <a name='L2415'></a><a href='#L2415'>2415</a>
  2469. <a name='L2416'></a><a href='#L2416'>2416</a>
  2470. <a name='L2417'></a><a href='#L2417'>2417</a>
  2471. <a name='L2418'></a><a href='#L2418'>2418</a>
  2472. <a name='L2419'></a><a href='#L2419'>2419</a>
  2473. <a name='L2420'></a><a href='#L2420'>2420</a>
  2474. <a name='L2421'></a><a href='#L2421'>2421</a>
  2475. <a name='L2422'></a><a href='#L2422'>2422</a>
  2476. <a name='L2423'></a><a href='#L2423'>2423</a>
  2477. <a name='L2424'></a><a href='#L2424'>2424</a>
  2478. <a name='L2425'></a><a href='#L2425'>2425</a>
  2479. <a name='L2426'></a><a href='#L2426'>2426</a>
  2480. <a name='L2427'></a><a href='#L2427'>2427</a>
  2481. <a name='L2428'></a><a href='#L2428'>2428</a>
  2482. <a name='L2429'></a><a href='#L2429'>2429</a>
  2483. <a name='L2430'></a><a href='#L2430'>2430</a>
  2484. <a name='L2431'></a><a href='#L2431'>2431</a>
  2485. <a name='L2432'></a><a href='#L2432'>2432</a>
  2486. <a name='L2433'></a><a href='#L2433'>2433</a>
  2487. <a name='L2434'></a><a href='#L2434'>2434</a>
  2488. <a name='L2435'></a><a href='#L2435'>2435</a>
  2489. <a name='L2436'></a><a href='#L2436'>2436</a>
  2490. <a name='L2437'></a><a href='#L2437'>2437</a>
  2491. <a name='L2438'></a><a href='#L2438'>2438</a>
  2492. <a name='L2439'></a><a href='#L2439'>2439</a>
  2493. <a name='L2440'></a><a href='#L2440'>2440</a>
  2494. <a name='L2441'></a><a href='#L2441'>2441</a>
  2495. <a name='L2442'></a><a href='#L2442'>2442</a>
  2496. <a name='L2443'></a><a href='#L2443'>2443</a>
  2497. <a name='L2444'></a><a href='#L2444'>2444</a>
  2498. <a name='L2445'></a><a href='#L2445'>2445</a>
  2499. <a name='L2446'></a><a href='#L2446'>2446</a>
  2500. <a name='L2447'></a><a href='#L2447'>2447</a>
  2501. <a name='L2448'></a><a href='#L2448'>2448</a>
  2502. <a name='L2449'></a><a href='#L2449'>2449</a>
  2503. <a name='L2450'></a><a href='#L2450'>2450</a>
  2504. <a name='L2451'></a><a href='#L2451'>2451</a>
  2505. <a name='L2452'></a><a href='#L2452'>2452</a>
  2506. <a name='L2453'></a><a href='#L2453'>2453</a>
  2507. <a name='L2454'></a><a href='#L2454'>2454</a>
  2508. <a name='L2455'></a><a href='#L2455'>2455</a>
  2509. <a name='L2456'></a><a href='#L2456'>2456</a>
  2510. <a name='L2457'></a><a href='#L2457'>2457</a>
  2511. <a name='L2458'></a><a href='#L2458'>2458</a>
  2512. <a name='L2459'></a><a href='#L2459'>2459</a>
  2513. <a name='L2460'></a><a href='#L2460'>2460</a>
  2514. <a name='L2461'></a><a href='#L2461'>2461</a>
  2515. <a name='L2462'></a><a href='#L2462'>2462</a>
  2516. <a name='L2463'></a><a href='#L2463'>2463</a>
  2517. <a name='L2464'></a><a href='#L2464'>2464</a>
  2518. <a name='L2465'></a><a href='#L2465'>2465</a>
  2519. <a name='L2466'></a><a href='#L2466'>2466</a>
  2520. <a name='L2467'></a><a href='#L2467'>2467</a>
  2521. <a name='L2468'></a><a href='#L2468'>2468</a>
  2522. <a name='L2469'></a><a href='#L2469'>2469</a>
  2523. <a name='L2470'></a><a href='#L2470'>2470</a>
  2524. <a name='L2471'></a><a href='#L2471'>2471</a>
  2525. <a name='L2472'></a><a href='#L2472'>2472</a>
  2526. <a name='L2473'></a><a href='#L2473'>2473</a>
  2527. <a name='L2474'></a><a href='#L2474'>2474</a>
  2528. <a name='L2475'></a><a href='#L2475'>2475</a>
  2529. <a name='L2476'></a><a href='#L2476'>2476</a>
  2530. <a name='L2477'></a><a href='#L2477'>2477</a>
  2531. <a name='L2478'></a><a href='#L2478'>2478</a>
  2532. <a name='L2479'></a><a href='#L2479'>2479</a>
  2533. <a name='L2480'></a><a href='#L2480'>2480</a>
  2534. <a name='L2481'></a><a href='#L2481'>2481</a>
  2535. <a name='L2482'></a><a href='#L2482'>2482</a>
  2536. <a name='L2483'></a><a href='#L2483'>2483</a>
  2537. <a name='L2484'></a><a href='#L2484'>2484</a>
  2538. <a name='L2485'></a><a href='#L2485'>2485</a>
  2539. <a name='L2486'></a><a href='#L2486'>2486</a>
  2540. <a name='L2487'></a><a href='#L2487'>2487</a>
  2541. <a name='L2488'></a><a href='#L2488'>2488</a>
  2542. <a name='L2489'></a><a href='#L2489'>2489</a>
  2543. <a name='L2490'></a><a href='#L2490'>2490</a>
  2544. <a name='L2491'></a><a href='#L2491'>2491</a>
  2545. <a name='L2492'></a><a href='#L2492'>2492</a>
  2546. <a name='L2493'></a><a href='#L2493'>2493</a>
  2547. <a name='L2494'></a><a href='#L2494'>2494</a>
  2548. <a name='L2495'></a><a href='#L2495'>2495</a>
  2549. <a name='L2496'></a><a href='#L2496'>2496</a>
  2550. <a name='L2497'></a><a href='#L2497'>2497</a>
  2551. <a name='L2498'></a><a href='#L2498'>2498</a>
  2552. <a name='L2499'></a><a href='#L2499'>2499</a>
  2553. <a name='L2500'></a><a href='#L2500'>2500</a>
  2554. <a name='L2501'></a><a href='#L2501'>2501</a>
  2555. <a name='L2502'></a><a href='#L2502'>2502</a>
  2556. <a name='L2503'></a><a href='#L2503'>2503</a>
  2557. <a name='L2504'></a><a href='#L2504'>2504</a>
  2558. <a name='L2505'></a><a href='#L2505'>2505</a>
  2559. <a name='L2506'></a><a href='#L2506'>2506</a>
  2560. <a name='L2507'></a><a href='#L2507'>2507</a>
  2561. <a name='L2508'></a><a href='#L2508'>2508</a>
  2562. <a name='L2509'></a><a href='#L2509'>2509</a>
  2563. <a name='L2510'></a><a href='#L2510'>2510</a>
  2564. <a name='L2511'></a><a href='#L2511'>2511</a>
  2565. <a name='L2512'></a><a href='#L2512'>2512</a>
  2566. <a name='L2513'></a><a href='#L2513'>2513</a>
  2567. <a name='L2514'></a><a href='#L2514'>2514</a>
  2568. <a name='L2515'></a><a href='#L2515'>2515</a>
  2569. <a name='L2516'></a><a href='#L2516'>2516</a>
  2570. <a name='L2517'></a><a href='#L2517'>2517</a>
  2571. <a name='L2518'></a><a href='#L2518'>2518</a>
  2572. <a name='L2519'></a><a href='#L2519'>2519</a>
  2573. <a name='L2520'></a><a href='#L2520'>2520</a>
  2574. <a name='L2521'></a><a href='#L2521'>2521</a>
  2575. <a name='L2522'></a><a href='#L2522'>2522</a>
  2576. <a name='L2523'></a><a href='#L2523'>2523</a>
  2577. <a name='L2524'></a><a href='#L2524'>2524</a>
  2578. <a name='L2525'></a><a href='#L2525'>2525</a>
  2579. <a name='L2526'></a><a href='#L2526'>2526</a>
  2580. <a name='L2527'></a><a href='#L2527'>2527</a>
  2581. <a name='L2528'></a><a href='#L2528'>2528</a>
  2582. <a name='L2529'></a><a href='#L2529'>2529</a>
  2583. <a name='L2530'></a><a href='#L2530'>2530</a>
  2584. <a name='L2531'></a><a href='#L2531'>2531</a>
  2585. <a name='L2532'></a><a href='#L2532'>2532</a>
  2586. <a name='L2533'></a><a href='#L2533'>2533</a>
  2587. <a name='L2534'></a><a href='#L2534'>2534</a>
  2588. <a name='L2535'></a><a href='#L2535'>2535</a>
  2589. <a name='L2536'></a><a href='#L2536'>2536</a>
  2590. <a name='L2537'></a><a href='#L2537'>2537</a>
  2591. <a name='L2538'></a><a href='#L2538'>2538</a>
  2592. <a name='L2539'></a><a href='#L2539'>2539</a>
  2593. <a name='L2540'></a><a href='#L2540'>2540</a>
  2594. <a name='L2541'></a><a href='#L2541'>2541</a>
  2595. <a name='L2542'></a><a href='#L2542'>2542</a>
  2596. <a name='L2543'></a><a href='#L2543'>2543</a>
  2597. <a name='L2544'></a><a href='#L2544'>2544</a>
  2598. <a name='L2545'></a><a href='#L2545'>2545</a>
  2599. <a name='L2546'></a><a href='#L2546'>2546</a>
  2600. <a name='L2547'></a><a href='#L2547'>2547</a>
  2601. <a name='L2548'></a><a href='#L2548'>2548</a>
  2602. <a name='L2549'></a><a href='#L2549'>2549</a>
  2603. <a name='L2550'></a><a href='#L2550'>2550</a>
  2604. <a name='L2551'></a><a href='#L2551'>2551</a>
  2605. <a name='L2552'></a><a href='#L2552'>2552</a>
  2606. <a name='L2553'></a><a href='#L2553'>2553</a>
  2607. <a name='L2554'></a><a href='#L2554'>2554</a>
  2608. <a name='L2555'></a><a href='#L2555'>2555</a>
  2609. <a name='L2556'></a><a href='#L2556'>2556</a>
  2610. <a name='L2557'></a><a href='#L2557'>2557</a>
  2611. <a name='L2558'></a><a href='#L2558'>2558</a>
  2612. <a name='L2559'></a><a href='#L2559'>2559</a>
  2613. <a name='L2560'></a><a href='#L2560'>2560</a>
  2614. <a name='L2561'></a><a href='#L2561'>2561</a>
  2615. <a name='L2562'></a><a href='#L2562'>2562</a>
  2616. <a name='L2563'></a><a href='#L2563'>2563</a>
  2617. <a name='L2564'></a><a href='#L2564'>2564</a>
  2618. <a name='L2565'></a><a href='#L2565'>2565</a>
  2619. <a name='L2566'></a><a href='#L2566'>2566</a>
  2620. <a name='L2567'></a><a href='#L2567'>2567</a>
  2621. <a name='L2568'></a><a href='#L2568'>2568</a>
  2622. <a name='L2569'></a><a href='#L2569'>2569</a>
  2623. <a name='L2570'></a><a href='#L2570'>2570</a>
  2624. <a name='L2571'></a><a href='#L2571'>2571</a>
  2625. <a name='L2572'></a><a href='#L2572'>2572</a>
  2626. <a name='L2573'></a><a href='#L2573'>2573</a>
  2627. <a name='L2574'></a><a href='#L2574'>2574</a>
  2628. <a name='L2575'></a><a href='#L2575'>2575</a>
  2629. <a name='L2576'></a><a href='#L2576'>2576</a>
  2630. <a name='L2577'></a><a href='#L2577'>2577</a>
  2631. <a name='L2578'></a><a href='#L2578'>2578</a>
  2632. <a name='L2579'></a><a href='#L2579'>2579</a>
  2633. <a name='L2580'></a><a href='#L2580'>2580</a>
  2634. <a name='L2581'></a><a href='#L2581'>2581</a>
  2635. <a name='L2582'></a><a href='#L2582'>2582</a>
  2636. <a name='L2583'></a><a href='#L2583'>2583</a>
  2637. <a name='L2584'></a><a href='#L2584'>2584</a>
  2638. <a name='L2585'></a><a href='#L2585'>2585</a>
  2639. <a name='L2586'></a><a href='#L2586'>2586</a>
  2640. <a name='L2587'></a><a href='#L2587'>2587</a>
  2641. <a name='L2588'></a><a href='#L2588'>2588</a>
  2642. <a name='L2589'></a><a href='#L2589'>2589</a>
  2643. <a name='L2590'></a><a href='#L2590'>2590</a>
  2644. <a name='L2591'></a><a href='#L2591'>2591</a>
  2645. <a name='L2592'></a><a href='#L2592'>2592</a>
  2646. <a name='L2593'></a><a href='#L2593'>2593</a>
  2647. <a name='L2594'></a><a href='#L2594'>2594</a>
  2648. <a name='L2595'></a><a href='#L2595'>2595</a>
  2649. <a name='L2596'></a><a href='#L2596'>2596</a>
  2650. <a name='L2597'></a><a href='#L2597'>2597</a>
  2651. <a name='L2598'></a><a href='#L2598'>2598</a>
  2652. <a name='L2599'></a><a href='#L2599'>2599</a>
  2653. <a name='L2600'></a><a href='#L2600'>2600</a>
  2654. <a name='L2601'></a><a href='#L2601'>2601</a>
  2655. <a name='L2602'></a><a href='#L2602'>2602</a>
  2656. <a name='L2603'></a><a href='#L2603'>2603</a>
  2657. <a name='L2604'></a><a href='#L2604'>2604</a>
  2658. <a name='L2605'></a><a href='#L2605'>2605</a>
  2659. <a name='L2606'></a><a href='#L2606'>2606</a>
  2660. <a name='L2607'></a><a href='#L2607'>2607</a>
  2661. <a name='L2608'></a><a href='#L2608'>2608</a>
  2662. <a name='L2609'></a><a href='#L2609'>2609</a>
  2663. <a name='L2610'></a><a href='#L2610'>2610</a>
  2664. <a name='L2611'></a><a href='#L2611'>2611</a>
  2665. <a name='L2612'></a><a href='#L2612'>2612</a>
  2666. <a name='L2613'></a><a href='#L2613'>2613</a>
  2667. <a name='L2614'></a><a href='#L2614'>2614</a>
  2668. <a name='L2615'></a><a href='#L2615'>2615</a>
  2669. <a name='L2616'></a><a href='#L2616'>2616</a>
  2670. <a name='L2617'></a><a href='#L2617'>2617</a>
  2671. <a name='L2618'></a><a href='#L2618'>2618</a>
  2672. <a name='L2619'></a><a href='#L2619'>2619</a>
  2673. <a name='L2620'></a><a href='#L2620'>2620</a>
  2674. <a name='L2621'></a><a href='#L2621'>2621</a>
  2675. <a name='L2622'></a><a href='#L2622'>2622</a>
  2676. <a name='L2623'></a><a href='#L2623'>2623</a>
  2677. <a name='L2624'></a><a href='#L2624'>2624</a>
  2678. <a name='L2625'></a><a href='#L2625'>2625</a>
  2679. <a name='L2626'></a><a href='#L2626'>2626</a>
  2680. <a name='L2627'></a><a href='#L2627'>2627</a>
  2681. <a name='L2628'></a><a href='#L2628'>2628</a>
  2682. <a name='L2629'></a><a href='#L2629'>2629</a>
  2683. <a name='L2630'></a><a href='#L2630'>2630</a>
  2684. <a name='L2631'></a><a href='#L2631'>2631</a>
  2685. <a name='L2632'></a><a href='#L2632'>2632</a>
  2686. <a name='L2633'></a><a href='#L2633'>2633</a>
  2687. <a name='L2634'></a><a href='#L2634'>2634</a>
  2688. <a name='L2635'></a><a href='#L2635'>2635</a>
  2689. <a name='L2636'></a><a href='#L2636'>2636</a>
  2690. <a name='L2637'></a><a href='#L2637'>2637</a>
  2691. <a name='L2638'></a><a href='#L2638'>2638</a>
  2692. <a name='L2639'></a><a href='#L2639'>2639</a>
  2693. <a name='L2640'></a><a href='#L2640'>2640</a>
  2694. <a name='L2641'></a><a href='#L2641'>2641</a>
  2695. <a name='L2642'></a><a href='#L2642'>2642</a>
  2696. <a name='L2643'></a><a href='#L2643'>2643</a>
  2697. <a name='L2644'></a><a href='#L2644'>2644</a>
  2698. <a name='L2645'></a><a href='#L2645'>2645</a>
  2699. <a name='L2646'></a><a href='#L2646'>2646</a>
  2700. <a name='L2647'></a><a href='#L2647'>2647</a>
  2701. <a name='L2648'></a><a href='#L2648'>2648</a>
  2702. <a name='L2649'></a><a href='#L2649'>2649</a>
  2703. <a name='L2650'></a><a href='#L2650'>2650</a>
  2704. <a name='L2651'></a><a href='#L2651'>2651</a>
  2705. <a name='L2652'></a><a href='#L2652'>2652</a>
  2706. <a name='L2653'></a><a href='#L2653'>2653</a>
  2707. <a name='L2654'></a><a href='#L2654'>2654</a>
  2708. <a name='L2655'></a><a href='#L2655'>2655</a>
  2709. <a name='L2656'></a><a href='#L2656'>2656</a>
  2710. <a name='L2657'></a><a href='#L2657'>2657</a>
  2711. <a name='L2658'></a><a href='#L2658'>2658</a>
  2712. <a name='L2659'></a><a href='#L2659'>2659</a>
  2713. <a name='L2660'></a><a href='#L2660'>2660</a>
  2714. <a name='L2661'></a><a href='#L2661'>2661</a>
  2715. <a name='L2662'></a><a href='#L2662'>2662</a>
  2716. <a name='L2663'></a><a href='#L2663'>2663</a>
  2717. <a name='L2664'></a><a href='#L2664'>2664</a>
  2718. <a name='L2665'></a><a href='#L2665'>2665</a>
  2719. <a name='L2666'></a><a href='#L2666'>2666</a>
  2720. <a name='L2667'></a><a href='#L2667'>2667</a>
  2721. <a name='L2668'></a><a href='#L2668'>2668</a>
  2722. <a name='L2669'></a><a href='#L2669'>2669</a>
  2723. <a name='L2670'></a><a href='#L2670'>2670</a>
  2724. <a name='L2671'></a><a href='#L2671'>2671</a>
  2725. <a name='L2672'></a><a href='#L2672'>2672</a>
  2726. <a name='L2673'></a><a href='#L2673'>2673</a>
  2727. <a name='L2674'></a><a href='#L2674'>2674</a>
  2728. <a name='L2675'></a><a href='#L2675'>2675</a>
  2729. <a name='L2676'></a><a href='#L2676'>2676</a>
  2730. <a name='L2677'></a><a href='#L2677'>2677</a>
  2731. <a name='L2678'></a><a href='#L2678'>2678</a>
  2732. <a name='L2679'></a><a href='#L2679'>2679</a>
  2733. <a name='L2680'></a><a href='#L2680'>2680</a>
  2734. <a name='L2681'></a><a href='#L2681'>2681</a>
  2735. <a name='L2682'></a><a href='#L2682'>2682</a>
  2736. <a name='L2683'></a><a href='#L2683'>2683</a>
  2737. <a name='L2684'></a><a href='#L2684'>2684</a>
  2738. <a name='L2685'></a><a href='#L2685'>2685</a>
  2739. <a name='L2686'></a><a href='#L2686'>2686</a>
  2740. <a name='L2687'></a><a href='#L2687'>2687</a>
  2741. <a name='L2688'></a><a href='#L2688'>2688</a>
  2742. <a name='L2689'></a><a href='#L2689'>2689</a>
  2743. <a name='L2690'></a><a href='#L2690'>2690</a>
  2744. <a name='L2691'></a><a href='#L2691'>2691</a>
  2745. <a name='L2692'></a><a href='#L2692'>2692</a>
  2746. <a name='L2693'></a><a href='#L2693'>2693</a>
  2747. <a name='L2694'></a><a href='#L2694'>2694</a>
  2748. <a name='L2695'></a><a href='#L2695'>2695</a>
  2749. <a name='L2696'></a><a href='#L2696'>2696</a>
  2750. <a name='L2697'></a><a href='#L2697'>2697</a>
  2751. <a name='L2698'></a><a href='#L2698'>2698</a>
  2752. <a name='L2699'></a><a href='#L2699'>2699</a>
  2753. <a name='L2700'></a><a href='#L2700'>2700</a>
  2754. <a name='L2701'></a><a href='#L2701'>2701</a>
  2755. <a name='L2702'></a><a href='#L2702'>2702</a>
  2756. <a name='L2703'></a><a href='#L2703'>2703</a>
  2757. <a name='L2704'></a><a href='#L2704'>2704</a>
  2758. <a name='L2705'></a><a href='#L2705'>2705</a>
  2759. <a name='L2706'></a><a href='#L2706'>2706</a>
  2760. <a name='L2707'></a><a href='#L2707'>2707</a>
  2761. <a name='L2708'></a><a href='#L2708'>2708</a>
  2762. <a name='L2709'></a><a href='#L2709'>2709</a>
  2763. <a name='L2710'></a><a href='#L2710'>2710</a>
  2764. <a name='L2711'></a><a href='#L2711'>2711</a>
  2765. <a name='L2712'></a><a href='#L2712'>2712</a>
  2766. <a name='L2713'></a><a href='#L2713'>2713</a>
  2767. <a name='L2714'></a><a href='#L2714'>2714</a>
  2768. <a name='L2715'></a><a href='#L2715'>2715</a>
  2769. <a name='L2716'></a><a href='#L2716'>2716</a>
  2770. <a name='L2717'></a><a href='#L2717'>2717</a>
  2771. <a name='L2718'></a><a href='#L2718'>2718</a>
  2772. <a name='L2719'></a><a href='#L2719'>2719</a>
  2773. <a name='L2720'></a><a href='#L2720'>2720</a>
  2774. <a name='L2721'></a><a href='#L2721'>2721</a>
  2775. <a name='L2722'></a><a href='#L2722'>2722</a>
  2776. <a name='L2723'></a><a href='#L2723'>2723</a>
  2777. <a name='L2724'></a><a href='#L2724'>2724</a>
  2778. <a name='L2725'></a><a href='#L2725'>2725</a>
  2779. <a name='L2726'></a><a href='#L2726'>2726</a>
  2780. <a name='L2727'></a><a href='#L2727'>2727</a>
  2781. <a name='L2728'></a><a href='#L2728'>2728</a>
  2782. <a name='L2729'></a><a href='#L2729'>2729</a>
  2783. <a name='L2730'></a><a href='#L2730'>2730</a>
  2784. <a name='L2731'></a><a href='#L2731'>2731</a>
  2785. <a name='L2732'></a><a href='#L2732'>2732</a>
  2786. <a name='L2733'></a><a href='#L2733'>2733</a>
  2787. <a name='L2734'></a><a href='#L2734'>2734</a>
  2788. <a name='L2735'></a><a href='#L2735'>2735</a>
  2789. <a name='L2736'></a><a href='#L2736'>2736</a>
  2790. <a name='L2737'></a><a href='#L2737'>2737</a>
  2791. <a name='L2738'></a><a href='#L2738'>2738</a>
  2792. <a name='L2739'></a><a href='#L2739'>2739</a>
  2793. <a name='L2740'></a><a href='#L2740'>2740</a>
  2794. <a name='L2741'></a><a href='#L2741'>2741</a>
  2795. <a name='L2742'></a><a href='#L2742'>2742</a>
  2796. <a name='L2743'></a><a href='#L2743'>2743</a>
  2797. <a name='L2744'></a><a href='#L2744'>2744</a>
  2798. <a name='L2745'></a><a href='#L2745'>2745</a>
  2799. <a name='L2746'></a><a href='#L2746'>2746</a>
  2800. <a name='L2747'></a><a href='#L2747'>2747</a>
  2801. <a name='L2748'></a><a href='#L2748'>2748</a>
  2802. <a name='L2749'></a><a href='#L2749'>2749</a>
  2803. <a name='L2750'></a><a href='#L2750'>2750</a>
  2804. <a name='L2751'></a><a href='#L2751'>2751</a>
  2805. <a name='L2752'></a><a href='#L2752'>2752</a>
  2806. <a name='L2753'></a><a href='#L2753'>2753</a>
  2807. <a name='L2754'></a><a href='#L2754'>2754</a>
  2808. <a name='L2755'></a><a href='#L2755'>2755</a>
  2809. <a name='L2756'></a><a href='#L2756'>2756</a>
  2810. <a name='L2757'></a><a href='#L2757'>2757</a>
  2811. <a name='L2758'></a><a href='#L2758'>2758</a>
  2812. <a name='L2759'></a><a href='#L2759'>2759</a>
  2813. <a name='L2760'></a><a href='#L2760'>2760</a>
  2814. <a name='L2761'></a><a href='#L2761'>2761</a>
  2815. <a name='L2762'></a><a href='#L2762'>2762</a>
  2816. <a name='L2763'></a><a href='#L2763'>2763</a>
  2817. <a name='L2764'></a><a href='#L2764'>2764</a>
  2818. <a name='L2765'></a><a href='#L2765'>2765</a>
  2819. <a name='L2766'></a><a href='#L2766'>2766</a>
  2820. <a name='L2767'></a><a href='#L2767'>2767</a>
  2821. <a name='L2768'></a><a href='#L2768'>2768</a>
  2822. <a name='L2769'></a><a href='#L2769'>2769</a>
  2823. <a name='L2770'></a><a href='#L2770'>2770</a>
  2824. <a name='L2771'></a><a href='#L2771'>2771</a>
  2825. <a name='L2772'></a><a href='#L2772'>2772</a>
  2826. <a name='L2773'></a><a href='#L2773'>2773</a>
  2827. <a name='L2774'></a><a href='#L2774'>2774</a>
  2828. <a name='L2775'></a><a href='#L2775'>2775</a>
  2829. <a name='L2776'></a><a href='#L2776'>2776</a>
  2830. <a name='L2777'></a><a href='#L2777'>2777</a>
  2831. <a name='L2778'></a><a href='#L2778'>2778</a>
  2832. <a name='L2779'></a><a href='#L2779'>2779</a>
  2833. <a name='L2780'></a><a href='#L2780'>2780</a>
  2834. <a name='L2781'></a><a href='#L2781'>2781</a>
  2835. <a name='L2782'></a><a href='#L2782'>2782</a>
  2836. <a name='L2783'></a><a href='#L2783'>2783</a>
  2837. <a name='L2784'></a><a href='#L2784'>2784</a>
  2838. <a name='L2785'></a><a href='#L2785'>2785</a>
  2839. <a name='L2786'></a><a href='#L2786'>2786</a>
  2840. <a name='L2787'></a><a href='#L2787'>2787</a>
  2841. <a name='L2788'></a><a href='#L2788'>2788</a>
  2842. <a name='L2789'></a><a href='#L2789'>2789</a>
  2843. <a name='L2790'></a><a href='#L2790'>2790</a>
  2844. <a name='L2791'></a><a href='#L2791'>2791</a>
  2845. <a name='L2792'></a><a href='#L2792'>2792</a>
  2846. <a name='L2793'></a><a href='#L2793'>2793</a>
  2847. <a name='L2794'></a><a href='#L2794'>2794</a>
  2848. <a name='L2795'></a><a href='#L2795'>2795</a>
  2849. <a name='L2796'></a><a href='#L2796'>2796</a>
  2850. <a name='L2797'></a><a href='#L2797'>2797</a>
  2851. <a name='L2798'></a><a href='#L2798'>2798</a>
  2852. <a name='L2799'></a><a href='#L2799'>2799</a>
  2853. <a name='L2800'></a><a href='#L2800'>2800</a>
  2854. <a name='L2801'></a><a href='#L2801'>2801</a>
  2855. <a name='L2802'></a><a href='#L2802'>2802</a>
  2856. <a name='L2803'></a><a href='#L2803'>2803</a>
  2857. <a name='L2804'></a><a href='#L2804'>2804</a>
  2858. <a name='L2805'></a><a href='#L2805'>2805</a>
  2859. <a name='L2806'></a><a href='#L2806'>2806</a>
  2860. <a name='L2807'></a><a href='#L2807'>2807</a>
  2861. <a name='L2808'></a><a href='#L2808'>2808</a>
  2862. <a name='L2809'></a><a href='#L2809'>2809</a>
  2863. <a name='L2810'></a><a href='#L2810'>2810</a>
  2864. <a name='L2811'></a><a href='#L2811'>2811</a>
  2865. <a name='L2812'></a><a href='#L2812'>2812</a>
  2866. <a name='L2813'></a><a href='#L2813'>2813</a>
  2867. <a name='L2814'></a><a href='#L2814'>2814</a>
  2868. <a name='L2815'></a><a href='#L2815'>2815</a>
  2869. <a name='L2816'></a><a href='#L2816'>2816</a>
  2870. <a name='L2817'></a><a href='#L2817'>2817</a>
  2871. <a name='L2818'></a><a href='#L2818'>2818</a>
  2872. <a name='L2819'></a><a href='#L2819'>2819</a>
  2873. <a name='L2820'></a><a href='#L2820'>2820</a>
  2874. <a name='L2821'></a><a href='#L2821'>2821</a>
  2875. <a name='L2822'></a><a href='#L2822'>2822</a>
  2876. <a name='L2823'></a><a href='#L2823'>2823</a>
  2877. <a name='L2824'></a><a href='#L2824'>2824</a>
  2878. <a name='L2825'></a><a href='#L2825'>2825</a>
  2879. <a name='L2826'></a><a href='#L2826'>2826</a>
  2880. <a name='L2827'></a><a href='#L2827'>2827</a>
  2881. <a name='L2828'></a><a href='#L2828'>2828</a>
  2882. <a name='L2829'></a><a href='#L2829'>2829</a>
  2883. <a name='L2830'></a><a href='#L2830'>2830</a>
  2884. <a name='L2831'></a><a href='#L2831'>2831</a>
  2885. <a name='L2832'></a><a href='#L2832'>2832</a>
  2886. <a name='L2833'></a><a href='#L2833'>2833</a>
  2887. <a name='L2834'></a><a href='#L2834'>2834</a>
  2888. <a name='L2835'></a><a href='#L2835'>2835</a>
  2889. <a name='L2836'></a><a href='#L2836'>2836</a>
  2890. <a name='L2837'></a><a href='#L2837'>2837</a>
  2891. <a name='L2838'></a><a href='#L2838'>2838</a>
  2892. <a name='L2839'></a><a href='#L2839'>2839</a>
  2893. <a name='L2840'></a><a href='#L2840'>2840</a>
  2894. <a name='L2841'></a><a href='#L2841'>2841</a>
  2895. <a name='L2842'></a><a href='#L2842'>2842</a>
  2896. <a name='L2843'></a><a href='#L2843'>2843</a>
  2897. <a name='L2844'></a><a href='#L2844'>2844</a>
  2898. <a name='L2845'></a><a href='#L2845'>2845</a>
  2899. <a name='L2846'></a><a href='#L2846'>2846</a>
  2900. <a name='L2847'></a><a href='#L2847'>2847</a>
  2901. <a name='L2848'></a><a href='#L2848'>2848</a>
  2902. <a name='L2849'></a><a href='#L2849'>2849</a>
  2903. <a name='L2850'></a><a href='#L2850'>2850</a>
  2904. <a name='L2851'></a><a href='#L2851'>2851</a>
  2905. <a name='L2852'></a><a href='#L2852'>2852</a>
  2906. <a name='L2853'></a><a href='#L2853'>2853</a>
  2907. <a name='L2854'></a><a href='#L2854'>2854</a>
  2908. <a name='L2855'></a><a href='#L2855'>2855</a>
  2909. <a name='L2856'></a><a href='#L2856'>2856</a>
  2910. <a name='L2857'></a><a href='#L2857'>2857</a>
  2911. <a name='L2858'></a><a href='#L2858'>2858</a>
  2912. <a name='L2859'></a><a href='#L2859'>2859</a>
  2913. <a name='L2860'></a><a href='#L2860'>2860</a>
  2914. <a name='L2861'></a><a href='#L2861'>2861</a>
  2915. <a name='L2862'></a><a href='#L2862'>2862</a>
  2916. <a name='L2863'></a><a href='#L2863'>2863</a>
  2917. <a name='L2864'></a><a href='#L2864'>2864</a>
  2918. <a name='L2865'></a><a href='#L2865'>2865</a>
  2919. <a name='L2866'></a><a href='#L2866'>2866</a>
  2920. <a name='L2867'></a><a href='#L2867'>2867</a>
  2921. <a name='L2868'></a><a href='#L2868'>2868</a>
  2922. <a name='L2869'></a><a href='#L2869'>2869</a>
  2923. <a name='L2870'></a><a href='#L2870'>2870</a>
  2924. <a name='L2871'></a><a href='#L2871'>2871</a>
  2925. <a name='L2872'></a><a href='#L2872'>2872</a>
  2926. <a name='L2873'></a><a href='#L2873'>2873</a>
  2927. <a name='L2874'></a><a href='#L2874'>2874</a>
  2928. <a name='L2875'></a><a href='#L2875'>2875</a>
  2929. <a name='L2876'></a><a href='#L2876'>2876</a>
  2930. <a name='L2877'></a><a href='#L2877'>2877</a>
  2931. <a name='L2878'></a><a href='#L2878'>2878</a>
  2932. <a name='L2879'></a><a href='#L2879'>2879</a>
  2933. <a name='L2880'></a><a href='#L2880'>2880</a>
  2934. <a name='L2881'></a><a href='#L2881'>2881</a>
  2935. <a name='L2882'></a><a href='#L2882'>2882</a>
  2936. <a name='L2883'></a><a href='#L2883'>2883</a>
  2937. <a name='L2884'></a><a href='#L2884'>2884</a>
  2938. <a name='L2885'></a><a href='#L2885'>2885</a>
  2939. <a name='L2886'></a><a href='#L2886'>2886</a>
  2940. <a name='L2887'></a><a href='#L2887'>2887</a>
  2941. <a name='L2888'></a><a href='#L2888'>2888</a>
  2942. <a name='L2889'></a><a href='#L2889'>2889</a>
  2943. <a name='L2890'></a><a href='#L2890'>2890</a>
  2944. <a name='L2891'></a><a href='#L2891'>2891</a>
  2945. <a name='L2892'></a><a href='#L2892'>2892</a>
  2946. <a name='L2893'></a><a href='#L2893'>2893</a>
  2947. <a name='L2894'></a><a href='#L2894'>2894</a>
  2948. <a name='L2895'></a><a href='#L2895'>2895</a>
  2949. <a name='L2896'></a><a href='#L2896'>2896</a>
  2950. <a name='L2897'></a><a href='#L2897'>2897</a>
  2951. <a name='L2898'></a><a href='#L2898'>2898</a>
  2952. <a name='L2899'></a><a href='#L2899'>2899</a>
  2953. <a name='L2900'></a><a href='#L2900'>2900</a>
  2954. <a name='L2901'></a><a href='#L2901'>2901</a>
  2955. <a name='L2902'></a><a href='#L2902'>2902</a>
  2956. <a name='L2903'></a><a href='#L2903'>2903</a>
  2957. <a name='L2904'></a><a href='#L2904'>2904</a>
  2958. <a name='L2905'></a><a href='#L2905'>2905</a>
  2959. <a name='L2906'></a><a href='#L2906'>2906</a>
  2960. <a name='L2907'></a><a href='#L2907'>2907</a>
  2961. <a name='L2908'></a><a href='#L2908'>2908</a>
  2962. <a name='L2909'></a><a href='#L2909'>2909</a>
  2963. <a name='L2910'></a><a href='#L2910'>2910</a>
  2964. <a name='L2911'></a><a href='#L2911'>2911</a>
  2965. <a name='L2912'></a><a href='#L2912'>2912</a>
  2966. <a name='L2913'></a><a href='#L2913'>2913</a>
  2967. <a name='L2914'></a><a href='#L2914'>2914</a>
  2968. <a name='L2915'></a><a href='#L2915'>2915</a>
  2969. <a name='L2916'></a><a href='#L2916'>2916</a>
  2970. <a name='L2917'></a><a href='#L2917'>2917</a>
  2971. <a name='L2918'></a><a href='#L2918'>2918</a>
  2972. <a name='L2919'></a><a href='#L2919'>2919</a>
  2973. <a name='L2920'></a><a href='#L2920'>2920</a>
  2974. <a name='L2921'></a><a href='#L2921'>2921</a>
  2975. <a name='L2922'></a><a href='#L2922'>2922</a>
  2976. <a name='L2923'></a><a href='#L2923'>2923</a>
  2977. <a name='L2924'></a><a href='#L2924'>2924</a>
  2978. <a name='L2925'></a><a href='#L2925'>2925</a>
  2979. <a name='L2926'></a><a href='#L2926'>2926</a>
  2980. <a name='L2927'></a><a href='#L2927'>2927</a>
  2981. <a name='L2928'></a><a href='#L2928'>2928</a>
  2982. <a name='L2929'></a><a href='#L2929'>2929</a>
  2983. <a name='L2930'></a><a href='#L2930'>2930</a>
  2984. <a name='L2931'></a><a href='#L2931'>2931</a>
  2985. <a name='L2932'></a><a href='#L2932'>2932</a>
  2986. <a name='L2933'></a><a href='#L2933'>2933</a>
  2987. <a name='L2934'></a><a href='#L2934'>2934</a>
  2988. <a name='L2935'></a><a href='#L2935'>2935</a>
  2989. <a name='L2936'></a><a href='#L2936'>2936</a>
  2990. <a name='L2937'></a><a href='#L2937'>2937</a>
  2991. <a name='L2938'></a><a href='#L2938'>2938</a>
  2992. <a name='L2939'></a><a href='#L2939'>2939</a>
  2993. <a name='L2940'></a><a href='#L2940'>2940</a>
  2994. <a name='L2941'></a><a href='#L2941'>2941</a>
  2995. <a name='L2942'></a><a href='#L2942'>2942</a>
  2996. <a name='L2943'></a><a href='#L2943'>2943</a>
  2997. <a name='L2944'></a><a href='#L2944'>2944</a>
  2998. <a name='L2945'></a><a href='#L2945'>2945</a>
  2999. <a name='L2946'></a><a href='#L2946'>2946</a>
  3000. <a name='L2947'></a><a href='#L2947'>2947</a>
  3001. <a name='L2948'></a><a href='#L2948'>2948</a>
  3002. <a name='L2949'></a><a href='#L2949'>2949</a>
  3003. <a name='L2950'></a><a href='#L2950'>2950</a>
  3004. <a name='L2951'></a><a href='#L2951'>2951</a>
  3005. <a name='L2952'></a><a href='#L2952'>2952</a>
  3006. <a name='L2953'></a><a href='#L2953'>2953</a>
  3007. <a name='L2954'></a><a href='#L2954'>2954</a>
  3008. <a name='L2955'></a><a href='#L2955'>2955</a>
  3009. <a name='L2956'></a><a href='#L2956'>2956</a>
  3010. <a name='L2957'></a><a href='#L2957'>2957</a>
  3011. <a name='L2958'></a><a href='#L2958'>2958</a>
  3012. <a name='L2959'></a><a href='#L2959'>2959</a>
  3013. <a name='L2960'></a><a href='#L2960'>2960</a>
  3014. <a name='L2961'></a><a href='#L2961'>2961</a>
  3015. <a name='L2962'></a><a href='#L2962'>2962</a>
  3016. <a name='L2963'></a><a href='#L2963'>2963</a>
  3017. <a name='L2964'></a><a href='#L2964'>2964</a>
  3018. <a name='L2965'></a><a href='#L2965'>2965</a>
  3019. <a name='L2966'></a><a href='#L2966'>2966</a>
  3020. <a name='L2967'></a><a href='#L2967'>2967</a>
  3021. <a name='L2968'></a><a href='#L2968'>2968</a>
  3022. <a name='L2969'></a><a href='#L2969'>2969</a>
  3023. <a name='L2970'></a><a href='#L2970'>2970</a>
  3024. <a name='L2971'></a><a href='#L2971'>2971</a>
  3025. <a name='L2972'></a><a href='#L2972'>2972</a>
  3026. <a name='L2973'></a><a href='#L2973'>2973</a>
  3027. <a name='L2974'></a><a href='#L2974'>2974</a>
  3028. <a name='L2975'></a><a href='#L2975'>2975</a>
  3029. <a name='L2976'></a><a href='#L2976'>2976</a>
  3030. <a name='L2977'></a><a href='#L2977'>2977</a>
  3031. <a name='L2978'></a><a href='#L2978'>2978</a>
  3032. <a name='L2979'></a><a href='#L2979'>2979</a>
  3033. <a name='L2980'></a><a href='#L2980'>2980</a>
  3034. <a name='L2981'></a><a href='#L2981'>2981</a>
  3035. <a name='L2982'></a><a href='#L2982'>2982</a>
  3036. <a name='L2983'></a><a href='#L2983'>2983</a>
  3037. <a name='L2984'></a><a href='#L2984'>2984</a>
  3038. <a name='L2985'></a><a href='#L2985'>2985</a>
  3039. <a name='L2986'></a><a href='#L2986'>2986</a>
  3040. <a name='L2987'></a><a href='#L2987'>2987</a>
  3041. <a name='L2988'></a><a href='#L2988'>2988</a>
  3042. <a name='L2989'></a><a href='#L2989'>2989</a>
  3043. <a name='L2990'></a><a href='#L2990'>2990</a>
  3044. <a name='L2991'></a><a href='#L2991'>2991</a>
  3045. <a name='L2992'></a><a href='#L2992'>2992</a>
  3046. <a name='L2993'></a><a href='#L2993'>2993</a>
  3047. <a name='L2994'></a><a href='#L2994'>2994</a>
  3048. <a name='L2995'></a><a href='#L2995'>2995</a>
  3049. <a name='L2996'></a><a href='#L2996'>2996</a>
  3050. <a name='L2997'></a><a href='#L2997'>2997</a>
  3051. <a name='L2998'></a><a href='#L2998'>2998</a>
  3052. <a name='L2999'></a><a href='#L2999'>2999</a>
  3053. <a name='L3000'></a><a href='#L3000'>3000</a>
  3054. <a name='L3001'></a><a href='#L3001'>3001</a>
  3055. <a name='L3002'></a><a href='#L3002'>3002</a>
  3056. <a name='L3003'></a><a href='#L3003'>3003</a>
  3057. <a name='L3004'></a><a href='#L3004'>3004</a>
  3058. <a name='L3005'></a><a href='#L3005'>3005</a>
  3059. <a name='L3006'></a><a href='#L3006'>3006</a>
  3060. <a name='L3007'></a><a href='#L3007'>3007</a>
  3061. <a name='L3008'></a><a href='#L3008'>3008</a>
  3062. <a name='L3009'></a><a href='#L3009'>3009</a>
  3063. <a name='L3010'></a><a href='#L3010'>3010</a>
  3064. <a name='L3011'></a><a href='#L3011'>3011</a>
  3065. <a name='L3012'></a><a href='#L3012'>3012</a>
  3066. <a name='L3013'></a><a href='#L3013'>3013</a>
  3067. <a name='L3014'></a><a href='#L3014'>3014</a>
  3068. <a name='L3015'></a><a href='#L3015'>3015</a>
  3069. <a name='L3016'></a><a href='#L3016'>3016</a>
  3070. <a name='L3017'></a><a href='#L3017'>3017</a>
  3071. <a name='L3018'></a><a href='#L3018'>3018</a>
  3072. <a name='L3019'></a><a href='#L3019'>3019</a>
  3073. <a name='L3020'></a><a href='#L3020'>3020</a>
  3074. <a name='L3021'></a><a href='#L3021'>3021</a>
  3075. <a name='L3022'></a><a href='#L3022'>3022</a>
  3076. <a name='L3023'></a><a href='#L3023'>3023</a>
  3077. <a name='L3024'></a><a href='#L3024'>3024</a>
  3078. <a name='L3025'></a><a href='#L3025'>3025</a>
  3079. <a name='L3026'></a><a href='#L3026'>3026</a>
  3080. <a name='L3027'></a><a href='#L3027'>3027</a>
  3081. <a name='L3028'></a><a href='#L3028'>3028</a>
  3082. <a name='L3029'></a><a href='#L3029'>3029</a>
  3083. <a name='L3030'></a><a href='#L3030'>3030</a>
  3084. <a name='L3031'></a><a href='#L3031'>3031</a>
  3085. <a name='L3032'></a><a href='#L3032'>3032</a>
  3086. <a name='L3033'></a><a href='#L3033'>3033</a>
  3087. <a name='L3034'></a><a href='#L3034'>3034</a>
  3088. <a name='L3035'></a><a href='#L3035'>3035</a>
  3089. <a name='L3036'></a><a href='#L3036'>3036</a>
  3090. <a name='L3037'></a><a href='#L3037'>3037</a>
  3091. <a name='L3038'></a><a href='#L3038'>3038</a>
  3092. <a name='L3039'></a><a href='#L3039'>3039</a>
  3093. <a name='L3040'></a><a href='#L3040'>3040</a>
  3094. <a name='L3041'></a><a href='#L3041'>3041</a>
  3095. <a name='L3042'></a><a href='#L3042'>3042</a>
  3096. <a name='L3043'></a><a href='#L3043'>3043</a>
  3097. <a name='L3044'></a><a href='#L3044'>3044</a>
  3098. <a name='L3045'></a><a href='#L3045'>3045</a>
  3099. <a name='L3046'></a><a href='#L3046'>3046</a>
  3100. <a name='L3047'></a><a href='#L3047'>3047</a>
  3101. <a name='L3048'></a><a href='#L3048'>3048</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
  3102. <span class="cline-any cline-neutral">&nbsp;</span>
  3103. <span class="cline-any cline-neutral">&nbsp;</span>
  3104. <span class="cline-any cline-neutral">&nbsp;</span>
  3105. <span class="cline-any cline-neutral">&nbsp;</span>
  3106. <span class="cline-any cline-no">&nbsp;</span>
  3107. <span class="cline-any cline-neutral">&nbsp;</span>
  3108. <span class="cline-any cline-no">&nbsp;</span>
  3109. <span class="cline-any cline-no">&nbsp;</span>
  3110. <span class="cline-any cline-no">&nbsp;</span>
  3111. <span class="cline-any cline-no">&nbsp;</span>
  3112. <span class="cline-any cline-no">&nbsp;</span>
  3113. <span class="cline-any cline-no">&nbsp;</span>
  3114. <span class="cline-any cline-no">&nbsp;</span>
  3115. <span class="cline-any cline-no">&nbsp;</span>
  3116. <span class="cline-any cline-no">&nbsp;</span>
  3117. <span class="cline-any cline-no">&nbsp;</span>
  3118. <span class="cline-any cline-no">&nbsp;</span>
  3119. <span class="cline-any cline-no">&nbsp;</span>
  3120. <span class="cline-any cline-no">&nbsp;</span>
  3121. <span class="cline-any cline-no">&nbsp;</span>
  3122. <span class="cline-any cline-no">&nbsp;</span>
  3123. <span class="cline-any cline-no">&nbsp;</span>
  3124. <span class="cline-any cline-no">&nbsp;</span>
  3125. <span class="cline-any cline-no">&nbsp;</span>
  3126. <span class="cline-any cline-no">&nbsp;</span>
  3127. <span class="cline-any cline-neutral">&nbsp;</span>
  3128. <span class="cline-any cline-neutral">&nbsp;</span>
  3129. <span class="cline-any cline-no">&nbsp;</span>
  3130. <span class="cline-any cline-neutral">&nbsp;</span>
  3131. <span class="cline-any cline-neutral">&nbsp;</span>
  3132. <span class="cline-any cline-no">&nbsp;</span>
  3133. <span class="cline-any cline-neutral">&nbsp;</span>
  3134. <span class="cline-any cline-no">&nbsp;</span>
  3135. <span class="cline-any cline-neutral">&nbsp;</span>
  3136. <span class="cline-any cline-neutral">&nbsp;</span>
  3137. <span class="cline-any cline-neutral">&nbsp;</span>
  3138. <span class="cline-any cline-neutral">&nbsp;</span>
  3139. <span class="cline-any cline-neutral">&nbsp;</span>
  3140. <span class="cline-any cline-no">&nbsp;</span>
  3141. <span class="cline-any cline-no">&nbsp;</span>
  3142. <span class="cline-any cline-neutral">&nbsp;</span>
  3143. <span class="cline-any cline-no">&nbsp;</span>
  3144. <span class="cline-any cline-no">&nbsp;</span>
  3145. <span class="cline-any cline-no">&nbsp;</span>
  3146. <span class="cline-any cline-no">&nbsp;</span>
  3147. <span class="cline-any cline-no">&nbsp;</span>
  3148. <span class="cline-any cline-neutral">&nbsp;</span>
  3149. <span class="cline-any cline-no">&nbsp;</span>
  3150. <span class="cline-any cline-no">&nbsp;</span>
  3151. <span class="cline-any cline-no">&nbsp;</span>
  3152. <span class="cline-any cline-neutral">&nbsp;</span>
  3153. <span class="cline-any cline-neutral">&nbsp;</span>
  3154. <span class="cline-any cline-no">&nbsp;</span>
  3155. <span class="cline-any cline-neutral">&nbsp;</span>
  3156. <span class="cline-any cline-neutral">&nbsp;</span>
  3157. <span class="cline-any cline-no">&nbsp;</span>
  3158. <span class="cline-any cline-no">&nbsp;</span>
  3159. <span class="cline-any cline-no">&nbsp;</span>
  3160. <span class="cline-any cline-no">&nbsp;</span>
  3161. <span class="cline-any cline-no">&nbsp;</span>
  3162. <span class="cline-any cline-no">&nbsp;</span>
  3163. <span class="cline-any cline-no">&nbsp;</span>
  3164. <span class="cline-any cline-no">&nbsp;</span>
  3165. <span class="cline-any cline-neutral">&nbsp;</span>
  3166. <span class="cline-any cline-no">&nbsp;</span>
  3167. <span class="cline-any cline-no">&nbsp;</span>
  3168. <span class="cline-any cline-no">&nbsp;</span>
  3169. <span class="cline-any cline-no">&nbsp;</span>
  3170. <span class="cline-any cline-no">&nbsp;</span>
  3171. <span class="cline-any cline-no">&nbsp;</span>
  3172. <span class="cline-any cline-no">&nbsp;</span>
  3173. <span class="cline-any cline-no">&nbsp;</span>
  3174. <span class="cline-any cline-no">&nbsp;</span>
  3175. <span class="cline-any cline-no">&nbsp;</span>
  3176. <span class="cline-any cline-no">&nbsp;</span>
  3177. <span class="cline-any cline-no">&nbsp;</span>
  3178. <span class="cline-any cline-neutral">&nbsp;</span>
  3179. <span class="cline-any cline-neutral">&nbsp;</span>
  3180. <span class="cline-any cline-no">&nbsp;</span>
  3181. <span class="cline-any cline-no">&nbsp;</span>
  3182. <span class="cline-any cline-no">&nbsp;</span>
  3183. <span class="cline-any cline-no">&nbsp;</span>
  3184. <span class="cline-any cline-neutral">&nbsp;</span>
  3185. <span class="cline-any cline-no">&nbsp;</span>
  3186. <span class="cline-any cline-no">&nbsp;</span>
  3187. <span class="cline-any cline-no">&nbsp;</span>
  3188. <span class="cline-any cline-no">&nbsp;</span>
  3189. <span class="cline-any cline-no">&nbsp;</span>
  3190. <span class="cline-any cline-no">&nbsp;</span>
  3191. <span class="cline-any cline-neutral">&nbsp;</span>
  3192. <span class="cline-any cline-neutral">&nbsp;</span>
  3193. <span class="cline-any cline-neutral">&nbsp;</span>
  3194. <span class="cline-any cline-neutral">&nbsp;</span>
  3195. <span class="cline-any cline-neutral">&nbsp;</span>
  3196. <span class="cline-any cline-no">&nbsp;</span>
  3197. <span class="cline-any cline-no">&nbsp;</span>
  3198. <span class="cline-any cline-no">&nbsp;</span>
  3199. <span class="cline-any cline-no">&nbsp;</span>
  3200. <span class="cline-any cline-no">&nbsp;</span>
  3201. <span class="cline-any cline-no">&nbsp;</span>
  3202. <span class="cline-any cline-no">&nbsp;</span>
  3203. <span class="cline-any cline-no">&nbsp;</span>
  3204. <span class="cline-any cline-no">&nbsp;</span>
  3205. <span class="cline-any cline-no">&nbsp;</span>
  3206. <span class="cline-any cline-no">&nbsp;</span>
  3207. <span class="cline-any cline-no">&nbsp;</span>
  3208. <span class="cline-any cline-no">&nbsp;</span>
  3209. <span class="cline-any cline-no">&nbsp;</span>
  3210. <span class="cline-any cline-no">&nbsp;</span>
  3211. <span class="cline-any cline-no">&nbsp;</span>
  3212. <span class="cline-any cline-no">&nbsp;</span>
  3213. <span class="cline-any cline-no">&nbsp;</span>
  3214. <span class="cline-any cline-neutral">&nbsp;</span>
  3215. <span class="cline-any cline-neutral">&nbsp;</span>
  3216. <span class="cline-any cline-neutral">&nbsp;</span>
  3217. <span class="cline-any cline-neutral">&nbsp;</span>
  3218. <span class="cline-any cline-neutral">&nbsp;</span>
  3219. <span class="cline-any cline-no">&nbsp;</span>
  3220. <span class="cline-any cline-no">&nbsp;</span>
  3221. <span class="cline-any cline-no">&nbsp;</span>
  3222. <span class="cline-any cline-no">&nbsp;</span>
  3223. <span class="cline-any cline-no">&nbsp;</span>
  3224. <span class="cline-any cline-no">&nbsp;</span>
  3225. <span class="cline-any cline-no">&nbsp;</span>
  3226. <span class="cline-any cline-no">&nbsp;</span>
  3227. <span class="cline-any cline-no">&nbsp;</span>
  3228. <span class="cline-any cline-no">&nbsp;</span>
  3229. <span class="cline-any cline-no">&nbsp;</span>
  3230. <span class="cline-any cline-no">&nbsp;</span>
  3231. <span class="cline-any cline-no">&nbsp;</span>
  3232. <span class="cline-any cline-neutral">&nbsp;</span>
  3233. <span class="cline-any cline-no">&nbsp;</span>
  3234. <span class="cline-any cline-no">&nbsp;</span>
  3235. <span class="cline-any cline-no">&nbsp;</span>
  3236. <span class="cline-any cline-no">&nbsp;</span>
  3237. <span class="cline-any cline-no">&nbsp;</span>
  3238. <span class="cline-any cline-no">&nbsp;</span>
  3239. <span class="cline-any cline-neutral">&nbsp;</span>
  3240. <span class="cline-any cline-neutral">&nbsp;</span>
  3241. <span class="cline-any cline-neutral">&nbsp;</span>
  3242. <span class="cline-any cline-neutral">&nbsp;</span>
  3243. <span class="cline-any cline-neutral">&nbsp;</span>
  3244. <span class="cline-any cline-no">&nbsp;</span>
  3245. <span class="cline-any cline-no">&nbsp;</span>
  3246. <span class="cline-any cline-neutral">&nbsp;</span>
  3247. <span class="cline-any cline-neutral">&nbsp;</span>
  3248. <span class="cline-any cline-neutral">&nbsp;</span>
  3249. <span class="cline-any cline-neutral">&nbsp;</span>
  3250. <span class="cline-any cline-no">&nbsp;</span>
  3251. <span class="cline-any cline-no">&nbsp;</span>
  3252. <span class="cline-any cline-no">&nbsp;</span>
  3253. <span class="cline-any cline-no">&nbsp;</span>
  3254. <span class="cline-any cline-no">&nbsp;</span>
  3255. <span class="cline-any cline-neutral">&nbsp;</span>
  3256. <span class="cline-any cline-no">&nbsp;</span>
  3257. <span class="cline-any cline-neutral">&nbsp;</span>
  3258. <span class="cline-any cline-neutral">&nbsp;</span>
  3259. <span class="cline-any cline-no">&nbsp;</span>
  3260. <span class="cline-any cline-no">&nbsp;</span>
  3261. <span class="cline-any cline-no">&nbsp;</span>
  3262. <span class="cline-any cline-no">&nbsp;</span>
  3263. <span class="cline-any cline-neutral">&nbsp;</span>
  3264. <span class="cline-any cline-no">&nbsp;</span>
  3265. <span class="cline-any cline-no">&nbsp;</span>
  3266. <span class="cline-any cline-no">&nbsp;</span>
  3267. <span class="cline-any cline-no">&nbsp;</span>
  3268. <span class="cline-any cline-neutral">&nbsp;</span>
  3269. <span class="cline-any cline-neutral">&nbsp;</span>
  3270. <span class="cline-any cline-no">&nbsp;</span>
  3271. <span class="cline-any cline-neutral">&nbsp;</span>
  3272. <span class="cline-any cline-neutral">&nbsp;</span>
  3273. <span class="cline-any cline-neutral">&nbsp;</span>
  3274. <span class="cline-any cline-neutral">&nbsp;</span>
  3275. <span class="cline-any cline-neutral">&nbsp;</span>
  3276. <span class="cline-any cline-neutral">&nbsp;</span>
  3277. <span class="cline-any cline-neutral">&nbsp;</span>
  3278. <span class="cline-any cline-neutral">&nbsp;</span>
  3279. <span class="cline-any cline-neutral">&nbsp;</span>
  3280. <span class="cline-any cline-neutral">&nbsp;</span>
  3281. <span class="cline-any cline-neutral">&nbsp;</span>
  3282. <span class="cline-any cline-neutral">&nbsp;</span>
  3283. <span class="cline-any cline-neutral">&nbsp;</span>
  3284. <span class="cline-any cline-neutral">&nbsp;</span>
  3285. <span class="cline-any cline-neutral">&nbsp;</span>
  3286. <span class="cline-any cline-no">&nbsp;</span>
  3287. <span class="cline-any cline-no">&nbsp;</span>
  3288. <span class="cline-any cline-no">&nbsp;</span>
  3289. <span class="cline-any cline-no">&nbsp;</span>
  3290. <span class="cline-any cline-no">&nbsp;</span>
  3291. <span class="cline-any cline-no">&nbsp;</span>
  3292. <span class="cline-any cline-neutral">&nbsp;</span>
  3293. <span class="cline-any cline-no">&nbsp;</span>
  3294. <span class="cline-any cline-no">&nbsp;</span>
  3295. <span class="cline-any cline-no">&nbsp;</span>
  3296. <span class="cline-any cline-neutral">&nbsp;</span>
  3297. <span class="cline-any cline-no">&nbsp;</span>
  3298. <span class="cline-any cline-neutral">&nbsp;</span>
  3299. <span class="cline-any cline-no">&nbsp;</span>
  3300. <span class="cline-any cline-no">&nbsp;</span>
  3301. <span class="cline-any cline-no">&nbsp;</span>
  3302. <span class="cline-any cline-no">&nbsp;</span>
  3303. <span class="cline-any cline-no">&nbsp;</span>
  3304. <span class="cline-any cline-no">&nbsp;</span>
  3305. <span class="cline-any cline-no">&nbsp;</span>
  3306. <span class="cline-any cline-no">&nbsp;</span>
  3307. <span class="cline-any cline-no">&nbsp;</span>
  3308. <span class="cline-any cline-no">&nbsp;</span>
  3309. <span class="cline-any cline-no">&nbsp;</span>
  3310. <span class="cline-any cline-no">&nbsp;</span>
  3311. <span class="cline-any cline-no">&nbsp;</span>
  3312. <span class="cline-any cline-neutral">&nbsp;</span>
  3313. <span class="cline-any cline-no">&nbsp;</span>
  3314. <span class="cline-any cline-no">&nbsp;</span>
  3315. <span class="cline-any cline-no">&nbsp;</span>
  3316. <span class="cline-any cline-no">&nbsp;</span>
  3317. <span class="cline-any cline-no">&nbsp;</span>
  3318. <span class="cline-any cline-no">&nbsp;</span>
  3319. <span class="cline-any cline-no">&nbsp;</span>
  3320. <span class="cline-any cline-no">&nbsp;</span>
  3321. <span class="cline-any cline-no">&nbsp;</span>
  3322. <span class="cline-any cline-no">&nbsp;</span>
  3323. <span class="cline-any cline-no">&nbsp;</span>
  3324. <span class="cline-any cline-neutral">&nbsp;</span>
  3325. <span class="cline-any cline-no">&nbsp;</span>
  3326. <span class="cline-any cline-no">&nbsp;</span>
  3327. <span class="cline-any cline-no">&nbsp;</span>
  3328. <span class="cline-any cline-no">&nbsp;</span>
  3329. <span class="cline-any cline-no">&nbsp;</span>
  3330. <span class="cline-any cline-no">&nbsp;</span>
  3331. <span class="cline-any cline-no">&nbsp;</span>
  3332. <span class="cline-any cline-no">&nbsp;</span>
  3333. <span class="cline-any cline-no">&nbsp;</span>
  3334. <span class="cline-any cline-no">&nbsp;</span>
  3335. <span class="cline-any cline-no">&nbsp;</span>
  3336. <span class="cline-any cline-no">&nbsp;</span>
  3337. <span class="cline-any cline-no">&nbsp;</span>
  3338. <span class="cline-any cline-neutral">&nbsp;</span>
  3339. <span class="cline-any cline-no">&nbsp;</span>
  3340. <span class="cline-any cline-no">&nbsp;</span>
  3341. <span class="cline-any cline-no">&nbsp;</span>
  3342. <span class="cline-any cline-no">&nbsp;</span>
  3343. <span class="cline-any cline-no">&nbsp;</span>
  3344. <span class="cline-any cline-no">&nbsp;</span>
  3345. <span class="cline-any cline-neutral">&nbsp;</span>
  3346. <span class="cline-any cline-no">&nbsp;</span>
  3347. <span class="cline-any cline-neutral">&nbsp;</span>
  3348. <span class="cline-any cline-no">&nbsp;</span>
  3349. <span class="cline-any cline-no">&nbsp;</span>
  3350. <span class="cline-any cline-no">&nbsp;</span>
  3351. <span class="cline-any cline-no">&nbsp;</span>
  3352. <span class="cline-any cline-no">&nbsp;</span>
  3353. <span class="cline-any cline-no">&nbsp;</span>
  3354. <span class="cline-any cline-no">&nbsp;</span>
  3355. <span class="cline-any cline-no">&nbsp;</span>
  3356. <span class="cline-any cline-no">&nbsp;</span>
  3357. <span class="cline-any cline-no">&nbsp;</span>
  3358. <span class="cline-any cline-no">&nbsp;</span>
  3359. <span class="cline-any cline-no">&nbsp;</span>
  3360. <span class="cline-any cline-no">&nbsp;</span>
  3361. <span class="cline-any cline-neutral">&nbsp;</span>
  3362. <span class="cline-any cline-no">&nbsp;</span>
  3363. <span class="cline-any cline-neutral">&nbsp;</span>
  3364. <span class="cline-any cline-no">&nbsp;</span>
  3365. <span class="cline-any cline-no">&nbsp;</span>
  3366. <span class="cline-any cline-neutral">&nbsp;</span>
  3367. <span class="cline-any cline-neutral">&nbsp;</span>
  3368. <span class="cline-any cline-neutral">&nbsp;</span>
  3369. <span class="cline-any cline-neutral">&nbsp;</span>
  3370. <span class="cline-any cline-no">&nbsp;</span>
  3371. <span class="cline-any cline-no">&nbsp;</span>
  3372. <span class="cline-any cline-neutral">&nbsp;</span>
  3373. <span class="cline-any cline-no">&nbsp;</span>
  3374. <span class="cline-any cline-neutral">&nbsp;</span>
  3375. <span class="cline-any cline-neutral">&nbsp;</span>
  3376. <span class="cline-any cline-neutral">&nbsp;</span>
  3377. <span class="cline-any cline-no">&nbsp;</span>
  3378. <span class="cline-any cline-no">&nbsp;</span>
  3379. <span class="cline-any cline-no">&nbsp;</span>
  3380. <span class="cline-any cline-no">&nbsp;</span>
  3381. <span class="cline-any cline-no">&nbsp;</span>
  3382. <span class="cline-any cline-no">&nbsp;</span>
  3383. <span class="cline-any cline-no">&nbsp;</span>
  3384. <span class="cline-any cline-no">&nbsp;</span>
  3385. <span class="cline-any cline-no">&nbsp;</span>
  3386. <span class="cline-any cline-no">&nbsp;</span>
  3387. <span class="cline-any cline-no">&nbsp;</span>
  3388. <span class="cline-any cline-no">&nbsp;</span>
  3389. <span class="cline-any cline-no">&nbsp;</span>
  3390. <span class="cline-any cline-no">&nbsp;</span>
  3391. <span class="cline-any cline-neutral">&nbsp;</span>
  3392. <span class="cline-any cline-neutral">&nbsp;</span>
  3393. <span class="cline-any cline-neutral">&nbsp;</span>
  3394. <span class="cline-any cline-neutral">&nbsp;</span>
  3395. <span class="cline-any cline-neutral">&nbsp;</span>
  3396. <span class="cline-any cline-no">&nbsp;</span>
  3397. <span class="cline-any cline-no">&nbsp;</span>
  3398. <span class="cline-any cline-no">&nbsp;</span>
  3399. <span class="cline-any cline-no">&nbsp;</span>
  3400. <span class="cline-any cline-no">&nbsp;</span>
  3401. <span class="cline-any cline-no">&nbsp;</span>
  3402. <span class="cline-any cline-neutral">&nbsp;</span>
  3403. <span class="cline-any cline-neutral">&nbsp;</span>
  3404. <span class="cline-any cline-neutral">&nbsp;</span>
  3405. <span class="cline-any cline-neutral">&nbsp;</span>
  3406. <span class="cline-any cline-neutral">&nbsp;</span>
  3407. <span class="cline-any cline-neutral">&nbsp;</span>
  3408. <span class="cline-any cline-neutral">&nbsp;</span>
  3409. <span class="cline-any cline-neutral">&nbsp;</span>
  3410. <span class="cline-any cline-neutral">&nbsp;</span>
  3411. <span class="cline-any cline-neutral">&nbsp;</span>
  3412. <span class="cline-any cline-neutral">&nbsp;</span>
  3413. <span class="cline-any cline-neutral">&nbsp;</span>
  3414. <span class="cline-any cline-neutral">&nbsp;</span>
  3415. <span class="cline-any cline-neutral">&nbsp;</span>
  3416. <span class="cline-any cline-no">&nbsp;</span>
  3417. <span class="cline-any cline-no">&nbsp;</span>
  3418. <span class="cline-any cline-no">&nbsp;</span>
  3419. <span class="cline-any cline-no">&nbsp;</span>
  3420. <span class="cline-any cline-no">&nbsp;</span>
  3421. <span class="cline-any cline-no">&nbsp;</span>
  3422. <span class="cline-any cline-neutral">&nbsp;</span>
  3423. <span class="cline-any cline-no">&nbsp;</span>
  3424. <span class="cline-any cline-no">&nbsp;</span>
  3425. <span class="cline-any cline-no">&nbsp;</span>
  3426. <span class="cline-any cline-no">&nbsp;</span>
  3427. <span class="cline-any cline-neutral">&nbsp;</span>
  3428. <span class="cline-any cline-neutral">&nbsp;</span>
  3429. <span class="cline-any cline-no">&nbsp;</span>
  3430. <span class="cline-any cline-no">&nbsp;</span>
  3431. <span class="cline-any cline-no">&nbsp;</span>
  3432. <span class="cline-any cline-no">&nbsp;</span>
  3433. <span class="cline-any cline-no">&nbsp;</span>
  3434. <span class="cline-any cline-no">&nbsp;</span>
  3435. <span class="cline-any cline-no">&nbsp;</span>
  3436. <span class="cline-any cline-neutral">&nbsp;</span>
  3437. <span class="cline-any cline-no">&nbsp;</span>
  3438. <span class="cline-any cline-no">&nbsp;</span>
  3439. <span class="cline-any cline-no">&nbsp;</span>
  3440. <span class="cline-any cline-neutral">&nbsp;</span>
  3441. <span class="cline-any cline-no">&nbsp;</span>
  3442. <span class="cline-any cline-no">&nbsp;</span>
  3443. <span class="cline-any cline-neutral">&nbsp;</span>
  3444. <span class="cline-any cline-neutral">&nbsp;</span>
  3445. <span class="cline-any cline-no">&nbsp;</span>
  3446. <span class="cline-any cline-no">&nbsp;</span>
  3447. <span class="cline-any cline-no">&nbsp;</span>
  3448. <span class="cline-any cline-no">&nbsp;</span>
  3449. <span class="cline-any cline-no">&nbsp;</span>
  3450. <span class="cline-any cline-no">&nbsp;</span>
  3451. <span class="cline-any cline-no">&nbsp;</span>
  3452. <span class="cline-any cline-neutral">&nbsp;</span>
  3453. <span class="cline-any cline-neutral">&nbsp;</span>
  3454. <span class="cline-any cline-neutral">&nbsp;</span>
  3455. <span class="cline-any cline-neutral">&nbsp;</span>
  3456. <span class="cline-any cline-neutral">&nbsp;</span>
  3457. <span class="cline-any cline-no">&nbsp;</span>
  3458. <span class="cline-any cline-no">&nbsp;</span>
  3459. <span class="cline-any cline-no">&nbsp;</span>
  3460. <span class="cline-any cline-neutral">&nbsp;</span>
  3461. <span class="cline-any cline-no">&nbsp;</span>
  3462. <span class="cline-any cline-no">&nbsp;</span>
  3463. <span class="cline-any cline-no">&nbsp;</span>
  3464. <span class="cline-any cline-no">&nbsp;</span>
  3465. <span class="cline-any cline-no">&nbsp;</span>
  3466. <span class="cline-any cline-neutral">&nbsp;</span>
  3467. <span class="cline-any cline-neutral">&nbsp;</span>
  3468. <span class="cline-any cline-no">&nbsp;</span>
  3469. <span class="cline-any cline-no">&nbsp;</span>
  3470. <span class="cline-any cline-no">&nbsp;</span>
  3471. <span class="cline-any cline-no">&nbsp;</span>
  3472. <span class="cline-any cline-no">&nbsp;</span>
  3473. <span class="cline-any cline-no">&nbsp;</span>
  3474. <span class="cline-any cline-no">&nbsp;</span>
  3475. <span class="cline-any cline-neutral">&nbsp;</span>
  3476. <span class="cline-any cline-no">&nbsp;</span>
  3477. <span class="cline-any cline-neutral">&nbsp;</span>
  3478. <span class="cline-any cline-no">&nbsp;</span>
  3479. <span class="cline-any cline-no">&nbsp;</span>
  3480. <span class="cline-any cline-neutral">&nbsp;</span>
  3481. <span class="cline-any cline-neutral">&nbsp;</span>
  3482. <span class="cline-any cline-neutral">&nbsp;</span>
  3483. <span class="cline-any cline-neutral">&nbsp;</span>
  3484. <span class="cline-any cline-neutral">&nbsp;</span>
  3485. <span class="cline-any cline-neutral">&nbsp;</span>
  3486. <span class="cline-any cline-neutral">&nbsp;</span>
  3487. <span class="cline-any cline-neutral">&nbsp;</span>
  3488. <span class="cline-any cline-neutral">&nbsp;</span>
  3489. <span class="cline-any cline-neutral">&nbsp;</span>
  3490. <span class="cline-any cline-no">&nbsp;</span>
  3491. <span class="cline-any cline-no">&nbsp;</span>
  3492. <span class="cline-any cline-no">&nbsp;</span>
  3493. <span class="cline-any cline-no">&nbsp;</span>
  3494. <span class="cline-any cline-neutral">&nbsp;</span>
  3495. <span class="cline-any cline-no">&nbsp;</span>
  3496. <span class="cline-any cline-no">&nbsp;</span>
  3497. <span class="cline-any cline-neutral">&nbsp;</span>
  3498. <span class="cline-any cline-no">&nbsp;</span>
  3499. <span class="cline-any cline-no">&nbsp;</span>
  3500. <span class="cline-any cline-no">&nbsp;</span>
  3501. <span class="cline-any cline-neutral">&nbsp;</span>
  3502. <span class="cline-any cline-no">&nbsp;</span>
  3503. <span class="cline-any cline-no">&nbsp;</span>
  3504. <span class="cline-any cline-no">&nbsp;</span>
  3505. <span class="cline-any cline-no">&nbsp;</span>
  3506. <span class="cline-any cline-no">&nbsp;</span>
  3507. <span class="cline-any cline-no">&nbsp;</span>
  3508. <span class="cline-any cline-no">&nbsp;</span>
  3509. <span class="cline-any cline-no">&nbsp;</span>
  3510. <span class="cline-any cline-no">&nbsp;</span>
  3511. <span class="cline-any cline-no">&nbsp;</span>
  3512. <span class="cline-any cline-no">&nbsp;</span>
  3513. <span class="cline-any cline-no">&nbsp;</span>
  3514. <span class="cline-any cline-no">&nbsp;</span>
  3515. <span class="cline-any cline-neutral">&nbsp;</span>
  3516. <span class="cline-any cline-neutral">&nbsp;</span>
  3517. <span class="cline-any cline-neutral">&nbsp;</span>
  3518. <span class="cline-any cline-neutral">&nbsp;</span>
  3519. <span class="cline-any cline-neutral">&nbsp;</span>
  3520. <span class="cline-any cline-neutral">&nbsp;</span>
  3521. <span class="cline-any cline-neutral">&nbsp;</span>
  3522. <span class="cline-any cline-neutral">&nbsp;</span>
  3523. <span class="cline-any cline-neutral">&nbsp;</span>
  3524. <span class="cline-any cline-neutral">&nbsp;</span>
  3525. <span class="cline-any cline-no">&nbsp;</span>
  3526. <span class="cline-any cline-no">&nbsp;</span>
  3527. <span class="cline-any cline-no">&nbsp;</span>
  3528. <span class="cline-any cline-neutral">&nbsp;</span>
  3529. <span class="cline-any cline-neutral">&nbsp;</span>
  3530. <span class="cline-any cline-neutral">&nbsp;</span>
  3531. <span class="cline-any cline-neutral">&nbsp;</span>
  3532. <span class="cline-any cline-neutral">&nbsp;</span>
  3533. <span class="cline-any cline-neutral">&nbsp;</span>
  3534. <span class="cline-any cline-neutral">&nbsp;</span>
  3535. <span class="cline-any cline-neutral">&nbsp;</span>
  3536. <span class="cline-any cline-neutral">&nbsp;</span>
  3537. <span class="cline-any cline-neutral">&nbsp;</span>
  3538. <span class="cline-any cline-no">&nbsp;</span>
  3539. <span class="cline-any cline-no">&nbsp;</span>
  3540. <span class="cline-any cline-no">&nbsp;</span>
  3541. <span class="cline-any cline-no">&nbsp;</span>
  3542. <span class="cline-any cline-no">&nbsp;</span>
  3543. <span class="cline-any cline-neutral">&nbsp;</span>
  3544. <span class="cline-any cline-neutral">&nbsp;</span>
  3545. <span class="cline-any cline-no">&nbsp;</span>
  3546. <span class="cline-any cline-neutral">&nbsp;</span>
  3547. <span class="cline-any cline-no">&nbsp;</span>
  3548. <span class="cline-any cline-neutral">&nbsp;</span>
  3549. <span class="cline-any cline-no">&nbsp;</span>
  3550. <span class="cline-any cline-neutral">&nbsp;</span>
  3551. <span class="cline-any cline-neutral">&nbsp;</span>
  3552. <span class="cline-any cline-no">&nbsp;</span>
  3553. <span class="cline-any cline-no">&nbsp;</span>
  3554. <span class="cline-any cline-no">&nbsp;</span>
  3555. <span class="cline-any cline-no">&nbsp;</span>
  3556. <span class="cline-any cline-no">&nbsp;</span>
  3557. <span class="cline-any cline-no">&nbsp;</span>
  3558. <span class="cline-any cline-no">&nbsp;</span>
  3559. <span class="cline-any cline-neutral">&nbsp;</span>
  3560. <span class="cline-any cline-no">&nbsp;</span>
  3561. <span class="cline-any cline-no">&nbsp;</span>
  3562. <span class="cline-any cline-no">&nbsp;</span>
  3563. <span class="cline-any cline-no">&nbsp;</span>
  3564. <span class="cline-any cline-no">&nbsp;</span>
  3565. <span class="cline-any cline-no">&nbsp;</span>
  3566. <span class="cline-any cline-no">&nbsp;</span>
  3567. <span class="cline-any cline-no">&nbsp;</span>
  3568. <span class="cline-any cline-neutral">&nbsp;</span>
  3569. <span class="cline-any cline-no">&nbsp;</span>
  3570. <span class="cline-any cline-no">&nbsp;</span>
  3571. <span class="cline-any cline-no">&nbsp;</span>
  3572. <span class="cline-any cline-no">&nbsp;</span>
  3573. <span class="cline-any cline-no">&nbsp;</span>
  3574. <span class="cline-any cline-no">&nbsp;</span>
  3575. <span class="cline-any cline-no">&nbsp;</span>
  3576. <span class="cline-any cline-no">&nbsp;</span>
  3577. <span class="cline-any cline-neutral">&nbsp;</span>
  3578. <span class="cline-any cline-no">&nbsp;</span>
  3579. <span class="cline-any cline-no">&nbsp;</span>
  3580. <span class="cline-any cline-no">&nbsp;</span>
  3581. <span class="cline-any cline-no">&nbsp;</span>
  3582. <span class="cline-any cline-neutral">&nbsp;</span>
  3583. <span class="cline-any cline-no">&nbsp;</span>
  3584. <span class="cline-any cline-no">&nbsp;</span>
  3585. <span class="cline-any cline-no">&nbsp;</span>
  3586. <span class="cline-any cline-no">&nbsp;</span>
  3587. <span class="cline-any cline-no">&nbsp;</span>
  3588. <span class="cline-any cline-no">&nbsp;</span>
  3589. <span class="cline-any cline-no">&nbsp;</span>
  3590. <span class="cline-any cline-neutral">&nbsp;</span>
  3591. <span class="cline-any cline-no">&nbsp;</span>
  3592. <span class="cline-any cline-no">&nbsp;</span>
  3593. <span class="cline-any cline-no">&nbsp;</span>
  3594. <span class="cline-any cline-neutral">&nbsp;</span>
  3595. <span class="cline-any cline-neutral">&nbsp;</span>
  3596. <span class="cline-any cline-neutral">&nbsp;</span>
  3597. <span class="cline-any cline-neutral">&nbsp;</span>
  3598. <span class="cline-any cline-no">&nbsp;</span>
  3599. <span class="cline-any cline-no">&nbsp;</span>
  3600. <span class="cline-any cline-no">&nbsp;</span>
  3601. <span class="cline-any cline-no">&nbsp;</span>
  3602. <span class="cline-any cline-neutral">&nbsp;</span>
  3603. <span class="cline-any cline-neutral">&nbsp;</span>
  3604. <span class="cline-any cline-no">&nbsp;</span>
  3605. <span class="cline-any cline-no">&nbsp;</span>
  3606. <span class="cline-any cline-no">&nbsp;</span>
  3607. <span class="cline-any cline-no">&nbsp;</span>
  3608. <span class="cline-any cline-no">&nbsp;</span>
  3609. <span class="cline-any cline-no">&nbsp;</span>
  3610. <span class="cline-any cline-neutral">&nbsp;</span>
  3611. <span class="cline-any cline-neutral">&nbsp;</span>
  3612. <span class="cline-any cline-no">&nbsp;</span>
  3613. <span class="cline-any cline-no">&nbsp;</span>
  3614. <span class="cline-any cline-no">&nbsp;</span>
  3615. <span class="cline-any cline-no">&nbsp;</span>
  3616. <span class="cline-any cline-no">&nbsp;</span>
  3617. <span class="cline-any cline-no">&nbsp;</span>
  3618. <span class="cline-any cline-no">&nbsp;</span>
  3619. <span class="cline-any cline-no">&nbsp;</span>
  3620. <span class="cline-any cline-neutral">&nbsp;</span>
  3621. <span class="cline-any cline-neutral">&nbsp;</span>
  3622. <span class="cline-any cline-no">&nbsp;</span>
  3623. <span class="cline-any cline-no">&nbsp;</span>
  3624. <span class="cline-any cline-no">&nbsp;</span>
  3625. <span class="cline-any cline-neutral">&nbsp;</span>
  3626. <span class="cline-any cline-no">&nbsp;</span>
  3627. <span class="cline-any cline-neutral">&nbsp;</span>
  3628. <span class="cline-any cline-no">&nbsp;</span>
  3629. <span class="cline-any cline-no">&nbsp;</span>
  3630. <span class="cline-any cline-no">&nbsp;</span>
  3631. <span class="cline-any cline-no">&nbsp;</span>
  3632. <span class="cline-any cline-no">&nbsp;</span>
  3633. <span class="cline-any cline-no">&nbsp;</span>
  3634. <span class="cline-any cline-neutral">&nbsp;</span>
  3635. <span class="cline-any cline-neutral">&nbsp;</span>
  3636. <span class="cline-any cline-no">&nbsp;</span>
  3637. <span class="cline-any cline-neutral">&nbsp;</span>
  3638. <span class="cline-any cline-neutral">&nbsp;</span>
  3639. <span class="cline-any cline-no">&nbsp;</span>
  3640. <span class="cline-any cline-no">&nbsp;</span>
  3641. <span class="cline-any cline-no">&nbsp;</span>
  3642. <span class="cline-any cline-no">&nbsp;</span>
  3643. <span class="cline-any cline-no">&nbsp;</span>
  3644. <span class="cline-any cline-no">&nbsp;</span>
  3645. <span class="cline-any cline-no">&nbsp;</span>
  3646. <span class="cline-any cline-no">&nbsp;</span>
  3647. <span class="cline-any cline-no">&nbsp;</span>
  3648. <span class="cline-any cline-no">&nbsp;</span>
  3649. <span class="cline-any cline-neutral">&nbsp;</span>
  3650. <span class="cline-any cline-neutral">&nbsp;</span>
  3651. <span class="cline-any cline-no">&nbsp;</span>
  3652. <span class="cline-any cline-no">&nbsp;</span>
  3653. <span class="cline-any cline-no">&nbsp;</span>
  3654. <span class="cline-any cline-no">&nbsp;</span>
  3655. <span class="cline-any cline-neutral">&nbsp;</span>
  3656. <span class="cline-any cline-neutral">&nbsp;</span>
  3657. <span class="cline-any cline-no">&nbsp;</span>
  3658. <span class="cline-any cline-no">&nbsp;</span>
  3659. <span class="cline-any cline-no">&nbsp;</span>
  3660. <span class="cline-any cline-neutral">&nbsp;</span>
  3661. <span class="cline-any cline-no">&nbsp;</span>
  3662. <span class="cline-any cline-no">&nbsp;</span>
  3663. <span class="cline-any cline-no">&nbsp;</span>
  3664. <span class="cline-any cline-no">&nbsp;</span>
  3665. <span class="cline-any cline-no">&nbsp;</span>
  3666. <span class="cline-any cline-no">&nbsp;</span>
  3667. <span class="cline-any cline-no">&nbsp;</span>
  3668. <span class="cline-any cline-no">&nbsp;</span>
  3669. <span class="cline-any cline-no">&nbsp;</span>
  3670. <span class="cline-any cline-no">&nbsp;</span>
  3671. <span class="cline-any cline-no">&nbsp;</span>
  3672. <span class="cline-any cline-neutral">&nbsp;</span>
  3673. <span class="cline-any cline-neutral">&nbsp;</span>
  3674. <span class="cline-any cline-no">&nbsp;</span>
  3675. <span class="cline-any cline-no">&nbsp;</span>
  3676. <span class="cline-any cline-no">&nbsp;</span>
  3677. <span class="cline-any cline-no">&nbsp;</span>
  3678. <span class="cline-any cline-no">&nbsp;</span>
  3679. <span class="cline-any cline-no">&nbsp;</span>
  3680. <span class="cline-any cline-no">&nbsp;</span>
  3681. <span class="cline-any cline-neutral">&nbsp;</span>
  3682. <span class="cline-any cline-neutral">&nbsp;</span>
  3683. <span class="cline-any cline-no">&nbsp;</span>
  3684. <span class="cline-any cline-no">&nbsp;</span>
  3685. <span class="cline-any cline-no">&nbsp;</span>
  3686. <span class="cline-any cline-no">&nbsp;</span>
  3687. <span class="cline-any cline-no">&nbsp;</span>
  3688. <span class="cline-any cline-neutral">&nbsp;</span>
  3689. <span class="cline-any cline-no">&nbsp;</span>
  3690. <span class="cline-any cline-no">&nbsp;</span>
  3691. <span class="cline-any cline-no">&nbsp;</span>
  3692. <span class="cline-any cline-no">&nbsp;</span>
  3693. <span class="cline-any cline-no">&nbsp;</span>
  3694. <span class="cline-any cline-no">&nbsp;</span>
  3695. <span class="cline-any cline-no">&nbsp;</span>
  3696. <span class="cline-any cline-no">&nbsp;</span>
  3697. <span class="cline-any cline-no">&nbsp;</span>
  3698. <span class="cline-any cline-no">&nbsp;</span>
  3699. <span class="cline-any cline-no">&nbsp;</span>
  3700. <span class="cline-any cline-no">&nbsp;</span>
  3701. <span class="cline-any cline-no">&nbsp;</span>
  3702. <span class="cline-any cline-no">&nbsp;</span>
  3703. <span class="cline-any cline-no">&nbsp;</span>
  3704. <span class="cline-any cline-no">&nbsp;</span>
  3705. <span class="cline-any cline-no">&nbsp;</span>
  3706. <span class="cline-any cline-no">&nbsp;</span>
  3707. <span class="cline-any cline-no">&nbsp;</span>
  3708. <span class="cline-any cline-no">&nbsp;</span>
  3709. <span class="cline-any cline-neutral">&nbsp;</span>
  3710. <span class="cline-any cline-neutral">&nbsp;</span>
  3711. <span class="cline-any cline-neutral">&nbsp;</span>
  3712. <span class="cline-any cline-neutral">&nbsp;</span>
  3713. <span class="cline-any cline-no">&nbsp;</span>
  3714. <span class="cline-any cline-no">&nbsp;</span>
  3715. <span class="cline-any cline-no">&nbsp;</span>
  3716. <span class="cline-any cline-no">&nbsp;</span>
  3717. <span class="cline-any cline-no">&nbsp;</span>
  3718. <span class="cline-any cline-no">&nbsp;</span>
  3719. <span class="cline-any cline-no">&nbsp;</span>
  3720. <span class="cline-any cline-no">&nbsp;</span>
  3721. <span class="cline-any cline-no">&nbsp;</span>
  3722. <span class="cline-any cline-no">&nbsp;</span>
  3723. <span class="cline-any cline-neutral">&nbsp;</span>
  3724. <span class="cline-any cline-no">&nbsp;</span>
  3725. <span class="cline-any cline-no">&nbsp;</span>
  3726. <span class="cline-any cline-neutral">&nbsp;</span>
  3727. <span class="cline-any cline-no">&nbsp;</span>
  3728. <span class="cline-any cline-no">&nbsp;</span>
  3729. <span class="cline-any cline-no">&nbsp;</span>
  3730. <span class="cline-any cline-neutral">&nbsp;</span>
  3731. <span class="cline-any cline-no">&nbsp;</span>
  3732. <span class="cline-any cline-no">&nbsp;</span>
  3733. <span class="cline-any cline-no">&nbsp;</span>
  3734. <span class="cline-any cline-no">&nbsp;</span>
  3735. <span class="cline-any cline-no">&nbsp;</span>
  3736. <span class="cline-any cline-no">&nbsp;</span>
  3737. <span class="cline-any cline-no">&nbsp;</span>
  3738. <span class="cline-any cline-no">&nbsp;</span>
  3739. <span class="cline-any cline-no">&nbsp;</span>
  3740. <span class="cline-any cline-no">&nbsp;</span>
  3741. <span class="cline-any cline-no">&nbsp;</span>
  3742. <span class="cline-any cline-neutral">&nbsp;</span>
  3743. <span class="cline-any cline-no">&nbsp;</span>
  3744. <span class="cline-any cline-no">&nbsp;</span>
  3745. <span class="cline-any cline-no">&nbsp;</span>
  3746. <span class="cline-any cline-no">&nbsp;</span>
  3747. <span class="cline-any cline-no">&nbsp;</span>
  3748. <span class="cline-any cline-no">&nbsp;</span>
  3749. <span class="cline-any cline-no">&nbsp;</span>
  3750. <span class="cline-any cline-no">&nbsp;</span>
  3751. <span class="cline-any cline-no">&nbsp;</span>
  3752. <span class="cline-any cline-no">&nbsp;</span>
  3753. <span class="cline-any cline-no">&nbsp;</span>
  3754. <span class="cline-any cline-neutral">&nbsp;</span>
  3755. <span class="cline-any cline-neutral">&nbsp;</span>
  3756. <span class="cline-any cline-neutral">&nbsp;</span>
  3757. <span class="cline-any cline-neutral">&nbsp;</span>
  3758. <span class="cline-any cline-neutral">&nbsp;</span>
  3759. <span class="cline-any cline-neutral">&nbsp;</span>
  3760. <span class="cline-any cline-neutral">&nbsp;</span>
  3761. <span class="cline-any cline-no">&nbsp;</span>
  3762. <span class="cline-any cline-no">&nbsp;</span>
  3763. <span class="cline-any cline-no">&nbsp;</span>
  3764. <span class="cline-any cline-no">&nbsp;</span>
  3765. <span class="cline-any cline-neutral">&nbsp;</span>
  3766. <span class="cline-any cline-neutral">&nbsp;</span>
  3767. <span class="cline-any cline-no">&nbsp;</span>
  3768. <span class="cline-any cline-neutral">&nbsp;</span>
  3769. <span class="cline-any cline-neutral">&nbsp;</span>
  3770. <span class="cline-any cline-no">&nbsp;</span>
  3771. <span class="cline-any cline-no">&nbsp;</span>
  3772. <span class="cline-any cline-no">&nbsp;</span>
  3773. <span class="cline-any cline-no">&nbsp;</span>
  3774. <span class="cline-any cline-neutral">&nbsp;</span>
  3775. <span class="cline-any cline-neutral">&nbsp;</span>
  3776. <span class="cline-any cline-no">&nbsp;</span>
  3777. <span class="cline-any cline-no">&nbsp;</span>
  3778. <span class="cline-any cline-no">&nbsp;</span>
  3779. <span class="cline-any cline-no">&nbsp;</span>
  3780. <span class="cline-any cline-no">&nbsp;</span>
  3781. <span class="cline-any cline-no">&nbsp;</span>
  3782. <span class="cline-any cline-no">&nbsp;</span>
  3783. <span class="cline-any cline-neutral">&nbsp;</span>
  3784. <span class="cline-any cline-no">&nbsp;</span>
  3785. <span class="cline-any cline-neutral">&nbsp;</span>
  3786. <span class="cline-any cline-no">&nbsp;</span>
  3787. <span class="cline-any cline-no">&nbsp;</span>
  3788. <span class="cline-any cline-no">&nbsp;</span>
  3789. <span class="cline-any cline-no">&nbsp;</span>
  3790. <span class="cline-any cline-no">&nbsp;</span>
  3791. <span class="cline-any cline-no">&nbsp;</span>
  3792. <span class="cline-any cline-no">&nbsp;</span>
  3793. <span class="cline-any cline-neutral">&nbsp;</span>
  3794. <span class="cline-any cline-neutral">&nbsp;</span>
  3795. <span class="cline-any cline-neutral">&nbsp;</span>
  3796. <span class="cline-any cline-neutral">&nbsp;</span>
  3797. <span class="cline-any cline-neutral">&nbsp;</span>
  3798. <span class="cline-any cline-neutral">&nbsp;</span>
  3799. <span class="cline-any cline-no">&nbsp;</span>
  3800. <span class="cline-any cline-no">&nbsp;</span>
  3801. <span class="cline-any cline-no">&nbsp;</span>
  3802. <span class="cline-any cline-no">&nbsp;</span>
  3803. <span class="cline-any cline-no">&nbsp;</span>
  3804. <span class="cline-any cline-no">&nbsp;</span>
  3805. <span class="cline-any cline-no">&nbsp;</span>
  3806. <span class="cline-any cline-no">&nbsp;</span>
  3807. <span class="cline-any cline-no">&nbsp;</span>
  3808. <span class="cline-any cline-no">&nbsp;</span>
  3809. <span class="cline-any cline-neutral">&nbsp;</span>
  3810. <span class="cline-any cline-neutral">&nbsp;</span>
  3811. <span class="cline-any cline-neutral">&nbsp;</span>
  3812. <span class="cline-any cline-neutral">&nbsp;</span>
  3813. <span class="cline-any cline-neutral">&nbsp;</span>
  3814. <span class="cline-any cline-neutral">&nbsp;</span>
  3815. <span class="cline-any cline-no">&nbsp;</span>
  3816. <span class="cline-any cline-no">&nbsp;</span>
  3817. <span class="cline-any cline-no">&nbsp;</span>
  3818. <span class="cline-any cline-no">&nbsp;</span>
  3819. <span class="cline-any cline-no">&nbsp;</span>
  3820. <span class="cline-any cline-no">&nbsp;</span>
  3821. <span class="cline-any cline-no">&nbsp;</span>
  3822. <span class="cline-any cline-no">&nbsp;</span>
  3823. <span class="cline-any cline-neutral">&nbsp;</span>
  3824. <span class="cline-any cline-no">&nbsp;</span>
  3825. <span class="cline-any cline-no">&nbsp;</span>
  3826. <span class="cline-any cline-no">&nbsp;</span>
  3827. <span class="cline-any cline-no">&nbsp;</span>
  3828. <span class="cline-any cline-no">&nbsp;</span>
  3829. <span class="cline-any cline-no">&nbsp;</span>
  3830. <span class="cline-any cline-no">&nbsp;</span>
  3831. <span class="cline-any cline-no">&nbsp;</span>
  3832. <span class="cline-any cline-neutral">&nbsp;</span>
  3833. <span class="cline-any cline-neutral">&nbsp;</span>
  3834. <span class="cline-any cline-neutral">&nbsp;</span>
  3835. <span class="cline-any cline-neutral">&nbsp;</span>
  3836. <span class="cline-any cline-neutral">&nbsp;</span>
  3837. <span class="cline-any cline-no">&nbsp;</span>
  3838. <span class="cline-any cline-no">&nbsp;</span>
  3839. <span class="cline-any cline-no">&nbsp;</span>
  3840. <span class="cline-any cline-no">&nbsp;</span>
  3841. <span class="cline-any cline-no">&nbsp;</span>
  3842. <span class="cline-any cline-no">&nbsp;</span>
  3843. <span class="cline-any cline-no">&nbsp;</span>
  3844. <span class="cline-any cline-no">&nbsp;</span>
  3845. <span class="cline-any cline-no">&nbsp;</span>
  3846. <span class="cline-any cline-no">&nbsp;</span>
  3847. <span class="cline-any cline-no">&nbsp;</span>
  3848. <span class="cline-any cline-no">&nbsp;</span>
  3849. <span class="cline-any cline-no">&nbsp;</span>
  3850. <span class="cline-any cline-no">&nbsp;</span>
  3851. <span class="cline-any cline-no">&nbsp;</span>
  3852. <span class="cline-any cline-neutral">&nbsp;</span>
  3853. <span class="cline-any cline-neutral">&nbsp;</span>
  3854. <span class="cline-any cline-neutral">&nbsp;</span>
  3855. <span class="cline-any cline-neutral">&nbsp;</span>
  3856. <span class="cline-any cline-neutral">&nbsp;</span>
  3857. <span class="cline-any cline-neutral">&nbsp;</span>
  3858. <span class="cline-any cline-no">&nbsp;</span>
  3859. <span class="cline-any cline-no">&nbsp;</span>
  3860. <span class="cline-any cline-no">&nbsp;</span>
  3861. <span class="cline-any cline-no">&nbsp;</span>
  3862. <span class="cline-any cline-no">&nbsp;</span>
  3863. <span class="cline-any cline-neutral">&nbsp;</span>
  3864. <span class="cline-any cline-no">&nbsp;</span>
  3865. <span class="cline-any cline-neutral">&nbsp;</span>
  3866. <span class="cline-any cline-no">&nbsp;</span>
  3867. <span class="cline-any cline-no">&nbsp;</span>
  3868. <span class="cline-any cline-no">&nbsp;</span>
  3869. <span class="cline-any cline-no">&nbsp;</span>
  3870. <span class="cline-any cline-no">&nbsp;</span>
  3871. <span class="cline-any cline-neutral">&nbsp;</span>
  3872. <span class="cline-any cline-no">&nbsp;</span>
  3873. <span class="cline-any cline-no">&nbsp;</span>
  3874. <span class="cline-any cline-no">&nbsp;</span>
  3875. <span class="cline-any cline-no">&nbsp;</span>
  3876. <span class="cline-any cline-no">&nbsp;</span>
  3877. <span class="cline-any cline-no">&nbsp;</span>
  3878. <span class="cline-any cline-no">&nbsp;</span>
  3879. <span class="cline-any cline-neutral">&nbsp;</span>
  3880. <span class="cline-any cline-neutral">&nbsp;</span>
  3881. <span class="cline-any cline-neutral">&nbsp;</span>
  3882. <span class="cline-any cline-neutral">&nbsp;</span>
  3883. <span class="cline-any cline-neutral">&nbsp;</span>
  3884. <span class="cline-any cline-no">&nbsp;</span>
  3885. <span class="cline-any cline-no">&nbsp;</span>
  3886. <span class="cline-any cline-no">&nbsp;</span>
  3887. <span class="cline-any cline-no">&nbsp;</span>
  3888. <span class="cline-any cline-neutral">&nbsp;</span>
  3889. <span class="cline-any cline-no">&nbsp;</span>
  3890. <span class="cline-any cline-no">&nbsp;</span>
  3891. <span class="cline-any cline-no">&nbsp;</span>
  3892. <span class="cline-any cline-no">&nbsp;</span>
  3893. <span class="cline-any cline-no">&nbsp;</span>
  3894. <span class="cline-any cline-neutral">&nbsp;</span>
  3895. <span class="cline-any cline-neutral">&nbsp;</span>
  3896. <span class="cline-any cline-no">&nbsp;</span>
  3897. <span class="cline-any cline-no">&nbsp;</span>
  3898. <span class="cline-any cline-neutral">&nbsp;</span>
  3899. <span class="cline-any cline-neutral">&nbsp;</span>
  3900. <span class="cline-any cline-no">&nbsp;</span>
  3901. <span class="cline-any cline-no">&nbsp;</span>
  3902. <span class="cline-any cline-no">&nbsp;</span>
  3903. <span class="cline-any cline-no">&nbsp;</span>
  3904. <span class="cline-any cline-no">&nbsp;</span>
  3905. <span class="cline-any cline-no">&nbsp;</span>
  3906. <span class="cline-any cline-neutral">&nbsp;</span>
  3907. <span class="cline-any cline-neutral">&nbsp;</span>
  3908. <span class="cline-any cline-no">&nbsp;</span>
  3909. <span class="cline-any cline-no">&nbsp;</span>
  3910. <span class="cline-any cline-no">&nbsp;</span>
  3911. <span class="cline-any cline-no">&nbsp;</span>
  3912. <span class="cline-any cline-neutral">&nbsp;</span>
  3913. <span class="cline-any cline-no">&nbsp;</span>
  3914. <span class="cline-any cline-no">&nbsp;</span>
  3915. <span class="cline-any cline-no">&nbsp;</span>
  3916. <span class="cline-any cline-no">&nbsp;</span>
  3917. <span class="cline-any cline-no">&nbsp;</span>
  3918. <span class="cline-any cline-no">&nbsp;</span>
  3919. <span class="cline-any cline-no">&nbsp;</span>
  3920. <span class="cline-any cline-no">&nbsp;</span>
  3921. <span class="cline-any cline-no">&nbsp;</span>
  3922. <span class="cline-any cline-no">&nbsp;</span>
  3923. <span class="cline-any cline-no">&nbsp;</span>
  3924. <span class="cline-any cline-no">&nbsp;</span>
  3925. <span class="cline-any cline-no">&nbsp;</span>
  3926. <span class="cline-any cline-no">&nbsp;</span>
  3927. <span class="cline-any cline-no">&nbsp;</span>
  3928. <span class="cline-any cline-no">&nbsp;</span>
  3929. <span class="cline-any cline-no">&nbsp;</span>
  3930. <span class="cline-any cline-no">&nbsp;</span>
  3931. <span class="cline-any cline-neutral">&nbsp;</span>
  3932. <span class="cline-any cline-neutral">&nbsp;</span>
  3933. <span class="cline-any cline-neutral">&nbsp;</span>
  3934. <span class="cline-any cline-neutral">&nbsp;</span>
  3935. <span class="cline-any cline-neutral">&nbsp;</span>
  3936. <span class="cline-any cline-no">&nbsp;</span>
  3937. <span class="cline-any cline-no">&nbsp;</span>
  3938. <span class="cline-any cline-no">&nbsp;</span>
  3939. <span class="cline-any cline-no">&nbsp;</span>
  3940. <span class="cline-any cline-no">&nbsp;</span>
  3941. <span class="cline-any cline-no">&nbsp;</span>
  3942. <span class="cline-any cline-no">&nbsp;</span>
  3943. <span class="cline-any cline-no">&nbsp;</span>
  3944. <span class="cline-any cline-no">&nbsp;</span>
  3945. <span class="cline-any cline-no">&nbsp;</span>
  3946. <span class="cline-any cline-no">&nbsp;</span>
  3947. <span class="cline-any cline-neutral">&nbsp;</span>
  3948. <span class="cline-any cline-neutral">&nbsp;</span>
  3949. <span class="cline-any cline-neutral">&nbsp;</span>
  3950. <span class="cline-any cline-neutral">&nbsp;</span>
  3951. <span class="cline-any cline-neutral">&nbsp;</span>
  3952. <span class="cline-any cline-no">&nbsp;</span>
  3953. <span class="cline-any cline-no">&nbsp;</span>
  3954. <span class="cline-any cline-no">&nbsp;</span>
  3955. <span class="cline-any cline-no">&nbsp;</span>
  3956. <span class="cline-any cline-neutral">&nbsp;</span>
  3957. <span class="cline-any cline-no">&nbsp;</span>
  3958. <span class="cline-any cline-no">&nbsp;</span>
  3959. <span class="cline-any cline-no">&nbsp;</span>
  3960. <span class="cline-any cline-neutral">&nbsp;</span>
  3961. <span class="cline-any cline-no">&nbsp;</span>
  3962. <span class="cline-any cline-no">&nbsp;</span>
  3963. <span class="cline-any cline-no">&nbsp;</span>
  3964. <span class="cline-any cline-no">&nbsp;</span>
  3965. <span class="cline-any cline-no">&nbsp;</span>
  3966. <span class="cline-any cline-neutral">&nbsp;</span>
  3967. <span class="cline-any cline-neutral">&nbsp;</span>
  3968. <span class="cline-any cline-neutral">&nbsp;</span>
  3969. <span class="cline-any cline-neutral">&nbsp;</span>
  3970. <span class="cline-any cline-neutral">&nbsp;</span>
  3971. <span class="cline-any cline-neutral">&nbsp;</span>
  3972. <span class="cline-any cline-neutral">&nbsp;</span>
  3973. <span class="cline-any cline-no">&nbsp;</span>
  3974. <span class="cline-any cline-neutral">&nbsp;</span>
  3975. <span class="cline-any cline-no">&nbsp;</span>
  3976. <span class="cline-any cline-neutral">&nbsp;</span>
  3977. <span class="cline-any cline-no">&nbsp;</span>
  3978. <span class="cline-any cline-no">&nbsp;</span>
  3979. <span class="cline-any cline-no">&nbsp;</span>
  3980. <span class="cline-any cline-neutral">&nbsp;</span>
  3981. <span class="cline-any cline-no">&nbsp;</span>
  3982. <span class="cline-any cline-no">&nbsp;</span>
  3983. <span class="cline-any cline-no">&nbsp;</span>
  3984. <span class="cline-any cline-no">&nbsp;</span>
  3985. <span class="cline-any cline-no">&nbsp;</span>
  3986. <span class="cline-any cline-no">&nbsp;</span>
  3987. <span class="cline-any cline-no">&nbsp;</span>
  3988. <span class="cline-any cline-no">&nbsp;</span>
  3989. <span class="cline-any cline-neutral">&nbsp;</span>
  3990. <span class="cline-any cline-neutral">&nbsp;</span>
  3991. <span class="cline-any cline-no">&nbsp;</span>
  3992. <span class="cline-any cline-no">&nbsp;</span>
  3993. <span class="cline-any cline-no">&nbsp;</span>
  3994. <span class="cline-any cline-no">&nbsp;</span>
  3995. <span class="cline-any cline-neutral">&nbsp;</span>
  3996. <span class="cline-any cline-neutral">&nbsp;</span>
  3997. <span class="cline-any cline-no">&nbsp;</span>
  3998. <span class="cline-any cline-neutral">&nbsp;</span>
  3999. <span class="cline-any cline-neutral">&nbsp;</span>
  4000. <span class="cline-any cline-no">&nbsp;</span>
  4001. <span class="cline-any cline-no">&nbsp;</span>
  4002. <span class="cline-any cline-no">&nbsp;</span>
  4003. <span class="cline-any cline-neutral">&nbsp;</span>
  4004. <span class="cline-any cline-no">&nbsp;</span>
  4005. <span class="cline-any cline-neutral">&nbsp;</span>
  4006. <span class="cline-any cline-neutral">&nbsp;</span>
  4007. <span class="cline-any cline-no">&nbsp;</span>
  4008. <span class="cline-any cline-no">&nbsp;</span>
  4009. <span class="cline-any cline-no">&nbsp;</span>
  4010. <span class="cline-any cline-no">&nbsp;</span>
  4011. <span class="cline-any cline-no">&nbsp;</span>
  4012. <span class="cline-any cline-no">&nbsp;</span>
  4013. <span class="cline-any cline-no">&nbsp;</span>
  4014. <span class="cline-any cline-no">&nbsp;</span>
  4015. <span class="cline-any cline-no">&nbsp;</span>
  4016. <span class="cline-any cline-no">&nbsp;</span>
  4017. <span class="cline-any cline-no">&nbsp;</span>
  4018. <span class="cline-any cline-no">&nbsp;</span>
  4019. <span class="cline-any cline-no">&nbsp;</span>
  4020. <span class="cline-any cline-no">&nbsp;</span>
  4021. <span class="cline-any cline-no">&nbsp;</span>
  4022. <span class="cline-any cline-no">&nbsp;</span>
  4023. <span class="cline-any cline-no">&nbsp;</span>
  4024. <span class="cline-any cline-no">&nbsp;</span>
  4025. <span class="cline-any cline-neutral">&nbsp;</span>
  4026. <span class="cline-any cline-neutral">&nbsp;</span>
  4027. <span class="cline-any cline-no">&nbsp;</span>
  4028. <span class="cline-any cline-no">&nbsp;</span>
  4029. <span class="cline-any cline-no">&nbsp;</span>
  4030. <span class="cline-any cline-no">&nbsp;</span>
  4031. <span class="cline-any cline-no">&nbsp;</span>
  4032. <span class="cline-any cline-no">&nbsp;</span>
  4033. <span class="cline-any cline-no">&nbsp;</span>
  4034. <span class="cline-any cline-no">&nbsp;</span>
  4035. <span class="cline-any cline-no">&nbsp;</span>
  4036. <span class="cline-any cline-no">&nbsp;</span>
  4037. <span class="cline-any cline-no">&nbsp;</span>
  4038. <span class="cline-any cline-no">&nbsp;</span>
  4039. <span class="cline-any cline-no">&nbsp;</span>
  4040. <span class="cline-any cline-no">&nbsp;</span>
  4041. <span class="cline-any cline-neutral">&nbsp;</span>
  4042. <span class="cline-any cline-neutral">&nbsp;</span>
  4043. <span class="cline-any cline-no">&nbsp;</span>
  4044. <span class="cline-any cline-neutral">&nbsp;</span>
  4045. <span class="cline-any cline-no">&nbsp;</span>
  4046. <span class="cline-any cline-no">&nbsp;</span>
  4047. <span class="cline-any cline-no">&nbsp;</span>
  4048. <span class="cline-any cline-no">&nbsp;</span>
  4049. <span class="cline-any cline-no">&nbsp;</span>
  4050. <span class="cline-any cline-no">&nbsp;</span>
  4051. <span class="cline-any cline-no">&nbsp;</span>
  4052. <span class="cline-any cline-no">&nbsp;</span>
  4053. <span class="cline-any cline-no">&nbsp;</span>
  4054. <span class="cline-any cline-no">&nbsp;</span>
  4055. <span class="cline-any cline-no">&nbsp;</span>
  4056. <span class="cline-any cline-neutral">&nbsp;</span>
  4057. <span class="cline-any cline-no">&nbsp;</span>
  4058. <span class="cline-any cline-no">&nbsp;</span>
  4059. <span class="cline-any cline-no">&nbsp;</span>
  4060. <span class="cline-any cline-no">&nbsp;</span>
  4061. <span class="cline-any cline-no">&nbsp;</span>
  4062. <span class="cline-any cline-no">&nbsp;</span>
  4063. <span class="cline-any cline-no">&nbsp;</span>
  4064. <span class="cline-any cline-no">&nbsp;</span>
  4065. <span class="cline-any cline-no">&nbsp;</span>
  4066. <span class="cline-any cline-no">&nbsp;</span>
  4067. <span class="cline-any cline-no">&nbsp;</span>
  4068. <span class="cline-any cline-no">&nbsp;</span>
  4069. <span class="cline-any cline-no">&nbsp;</span>
  4070. <span class="cline-any cline-no">&nbsp;</span>
  4071. <span class="cline-any cline-neutral">&nbsp;</span>
  4072. <span class="cline-any cline-neutral">&nbsp;</span>
  4073. <span class="cline-any cline-neutral">&nbsp;</span>
  4074. <span class="cline-any cline-neutral">&nbsp;</span>
  4075. <span class="cline-any cline-neutral">&nbsp;</span>
  4076. <span class="cline-any cline-no">&nbsp;</span>
  4077. <span class="cline-any cline-no">&nbsp;</span>
  4078. <span class="cline-any cline-no">&nbsp;</span>
  4079. <span class="cline-any cline-no">&nbsp;</span>
  4080. <span class="cline-any cline-neutral">&nbsp;</span>
  4081. <span class="cline-any cline-no">&nbsp;</span>
  4082. <span class="cline-any cline-no">&nbsp;</span>
  4083. <span class="cline-any cline-no">&nbsp;</span>
  4084. <span class="cline-any cline-no">&nbsp;</span>
  4085. <span class="cline-any cline-no">&nbsp;</span>
  4086. <span class="cline-any cline-no">&nbsp;</span>
  4087. <span class="cline-any cline-neutral">&nbsp;</span>
  4088. <span class="cline-any cline-neutral">&nbsp;</span>
  4089. <span class="cline-any cline-no">&nbsp;</span>
  4090. <span class="cline-any cline-neutral">&nbsp;</span>
  4091. <span class="cline-any cline-neutral">&nbsp;</span>
  4092. <span class="cline-any cline-no">&nbsp;</span>
  4093. <span class="cline-any cline-no">&nbsp;</span>
  4094. <span class="cline-any cline-no">&nbsp;</span>
  4095. <span class="cline-any cline-neutral">&nbsp;</span>
  4096. <span class="cline-any cline-no">&nbsp;</span>
  4097. <span class="cline-any cline-no">&nbsp;</span>
  4098. <span class="cline-any cline-no">&nbsp;</span>
  4099. <span class="cline-any cline-no">&nbsp;</span>
  4100. <span class="cline-any cline-neutral">&nbsp;</span>
  4101. <span class="cline-any cline-neutral">&nbsp;</span>
  4102. <span class="cline-any cline-no">&nbsp;</span>
  4103. <span class="cline-any cline-neutral">&nbsp;</span>
  4104. <span class="cline-any cline-neutral">&nbsp;</span>
  4105. <span class="cline-any cline-no">&nbsp;</span>
  4106. <span class="cline-any cline-neutral">&nbsp;</span>
  4107. <span class="cline-any cline-no">&nbsp;</span>
  4108. <span class="cline-any cline-no">&nbsp;</span>
  4109. <span class="cline-any cline-no">&nbsp;</span>
  4110. <span class="cline-any cline-no">&nbsp;</span>
  4111. <span class="cline-any cline-neutral">&nbsp;</span>
  4112. <span class="cline-any cline-no">&nbsp;</span>
  4113. <span class="cline-any cline-no">&nbsp;</span>
  4114. <span class="cline-any cline-no">&nbsp;</span>
  4115. <span class="cline-any cline-no">&nbsp;</span>
  4116. <span class="cline-any cline-no">&nbsp;</span>
  4117. <span class="cline-any cline-no">&nbsp;</span>
  4118. <span class="cline-any cline-no">&nbsp;</span>
  4119. <span class="cline-any cline-no">&nbsp;</span>
  4120. <span class="cline-any cline-no">&nbsp;</span>
  4121. <span class="cline-any cline-no">&nbsp;</span>
  4122. <span class="cline-any cline-no">&nbsp;</span>
  4123. <span class="cline-any cline-neutral">&nbsp;</span>
  4124. <span class="cline-any cline-no">&nbsp;</span>
  4125. <span class="cline-any cline-neutral">&nbsp;</span>
  4126. <span class="cline-any cline-neutral">&nbsp;</span>
  4127. <span class="cline-any cline-no">&nbsp;</span>
  4128. <span class="cline-any cline-no">&nbsp;</span>
  4129. <span class="cline-any cline-no">&nbsp;</span>
  4130. <span class="cline-any cline-no">&nbsp;</span>
  4131. <span class="cline-any cline-no">&nbsp;</span>
  4132. <span class="cline-any cline-neutral">&nbsp;</span>
  4133. <span class="cline-any cline-no">&nbsp;</span>
  4134. <span class="cline-any cline-no">&nbsp;</span>
  4135. <span class="cline-any cline-no">&nbsp;</span>
  4136. <span class="cline-any cline-no">&nbsp;</span>
  4137. <span class="cline-any cline-no">&nbsp;</span>
  4138. <span class="cline-any cline-no">&nbsp;</span>
  4139. <span class="cline-any cline-no">&nbsp;</span>
  4140. <span class="cline-any cline-no">&nbsp;</span>
  4141. <span class="cline-any cline-no">&nbsp;</span>
  4142. <span class="cline-any cline-no">&nbsp;</span>
  4143. <span class="cline-any cline-no">&nbsp;</span>
  4144. <span class="cline-any cline-no">&nbsp;</span>
  4145. <span class="cline-any cline-no">&nbsp;</span>
  4146. <span class="cline-any cline-no">&nbsp;</span>
  4147. <span class="cline-any cline-neutral">&nbsp;</span>
  4148. <span class="cline-any cline-neutral">&nbsp;</span>
  4149. <span class="cline-any cline-neutral">&nbsp;</span>
  4150. <span class="cline-any cline-neutral">&nbsp;</span>
  4151. <span class="cline-any cline-neutral">&nbsp;</span>
  4152. <span class="cline-any cline-no">&nbsp;</span>
  4153. <span class="cline-any cline-no">&nbsp;</span>
  4154. <span class="cline-any cline-no">&nbsp;</span>
  4155. <span class="cline-any cline-neutral">&nbsp;</span>
  4156. <span class="cline-any cline-no">&nbsp;</span>
  4157. <span class="cline-any cline-no">&nbsp;</span>
  4158. <span class="cline-any cline-no">&nbsp;</span>
  4159. <span class="cline-any cline-no">&nbsp;</span>
  4160. <span class="cline-any cline-no">&nbsp;</span>
  4161. <span class="cline-any cline-no">&nbsp;</span>
  4162. <span class="cline-any cline-neutral">&nbsp;</span>
  4163. <span class="cline-any cline-no">&nbsp;</span>
  4164. <span class="cline-any cline-neutral">&nbsp;</span>
  4165. <span class="cline-any cline-no">&nbsp;</span>
  4166. <span class="cline-any cline-no">&nbsp;</span>
  4167. <span class="cline-any cline-no">&nbsp;</span>
  4168. <span class="cline-any cline-no">&nbsp;</span>
  4169. <span class="cline-any cline-no">&nbsp;</span>
  4170. <span class="cline-any cline-no">&nbsp;</span>
  4171. <span class="cline-any cline-no">&nbsp;</span>
  4172. <span class="cline-any cline-no">&nbsp;</span>
  4173. <span class="cline-any cline-neutral">&nbsp;</span>
  4174. <span class="cline-any cline-no">&nbsp;</span>
  4175. <span class="cline-any cline-neutral">&nbsp;</span>
  4176. <span class="cline-any cline-no">&nbsp;</span>
  4177. <span class="cline-any cline-no">&nbsp;</span>
  4178. <span class="cline-any cline-no">&nbsp;</span>
  4179. <span class="cline-any cline-no">&nbsp;</span>
  4180. <span class="cline-any cline-no">&nbsp;</span>
  4181. <span class="cline-any cline-no">&nbsp;</span>
  4182. <span class="cline-any cline-no">&nbsp;</span>
  4183. <span class="cline-any cline-no">&nbsp;</span>
  4184. <span class="cline-any cline-no">&nbsp;</span>
  4185. <span class="cline-any cline-no">&nbsp;</span>
  4186. <span class="cline-any cline-no">&nbsp;</span>
  4187. <span class="cline-any cline-neutral">&nbsp;</span>
  4188. <span class="cline-any cline-neutral">&nbsp;</span>
  4189. <span class="cline-any cline-neutral">&nbsp;</span>
  4190. <span class="cline-any cline-neutral">&nbsp;</span>
  4191. <span class="cline-any cline-neutral">&nbsp;</span>
  4192. <span class="cline-any cline-no">&nbsp;</span>
  4193. <span class="cline-any cline-no">&nbsp;</span>
  4194. <span class="cline-any cline-no">&nbsp;</span>
  4195. <span class="cline-any cline-no">&nbsp;</span>
  4196. <span class="cline-any cline-neutral">&nbsp;</span>
  4197. <span class="cline-any cline-no">&nbsp;</span>
  4198. <span class="cline-any cline-no">&nbsp;</span>
  4199. <span class="cline-any cline-no">&nbsp;</span>
  4200. <span class="cline-any cline-no">&nbsp;</span>
  4201. <span class="cline-any cline-no">&nbsp;</span>
  4202. <span class="cline-any cline-neutral">&nbsp;</span>
  4203. <span class="cline-any cline-neutral">&nbsp;</span>
  4204. <span class="cline-any cline-no">&nbsp;</span>
  4205. <span class="cline-any cline-neutral">&nbsp;</span>
  4206. <span class="cline-any cline-neutral">&nbsp;</span>
  4207. <span class="cline-any cline-no">&nbsp;</span>
  4208. <span class="cline-any cline-no">&nbsp;</span>
  4209. <span class="cline-any cline-no">&nbsp;</span>
  4210. <span class="cline-any cline-neutral">&nbsp;</span>
  4211. <span class="cline-any cline-neutral">&nbsp;</span>
  4212. <span class="cline-any cline-no">&nbsp;</span>
  4213. <span class="cline-any cline-neutral">&nbsp;</span>
  4214. <span class="cline-any cline-neutral">&nbsp;</span>
  4215. <span class="cline-any cline-no">&nbsp;</span>
  4216. <span class="cline-any cline-no">&nbsp;</span>
  4217. <span class="cline-any cline-no">&nbsp;</span>
  4218. <span class="cline-any cline-neutral">&nbsp;</span>
  4219. <span class="cline-any cline-no">&nbsp;</span>
  4220. <span class="cline-any cline-no">&nbsp;</span>
  4221. <span class="cline-any cline-no">&nbsp;</span>
  4222. <span class="cline-any cline-no">&nbsp;</span>
  4223. <span class="cline-any cline-no">&nbsp;</span>
  4224. <span class="cline-any cline-no">&nbsp;</span>
  4225. <span class="cline-any cline-no">&nbsp;</span>
  4226. <span class="cline-any cline-no">&nbsp;</span>
  4227. <span class="cline-any cline-no">&nbsp;</span>
  4228. <span class="cline-any cline-no">&nbsp;</span>
  4229. <span class="cline-any cline-no">&nbsp;</span>
  4230. <span class="cline-any cline-no">&nbsp;</span>
  4231. <span class="cline-any cline-no">&nbsp;</span>
  4232. <span class="cline-any cline-no">&nbsp;</span>
  4233. <span class="cline-any cline-no">&nbsp;</span>
  4234. <span class="cline-any cline-no">&nbsp;</span>
  4235. <span class="cline-any cline-no">&nbsp;</span>
  4236. <span class="cline-any cline-neutral">&nbsp;</span>
  4237. <span class="cline-any cline-neutral">&nbsp;</span>
  4238. <span class="cline-any cline-neutral">&nbsp;</span>
  4239. <span class="cline-any cline-neutral">&nbsp;</span>
  4240. <span class="cline-any cline-neutral">&nbsp;</span>
  4241. <span class="cline-any cline-no">&nbsp;</span>
  4242. <span class="cline-any cline-no">&nbsp;</span>
  4243. <span class="cline-any cline-no">&nbsp;</span>
  4244. <span class="cline-any cline-no">&nbsp;</span>
  4245. <span class="cline-any cline-neutral">&nbsp;</span>
  4246. <span class="cline-any cline-no">&nbsp;</span>
  4247. <span class="cline-any cline-no">&nbsp;</span>
  4248. <span class="cline-any cline-no">&nbsp;</span>
  4249. <span class="cline-any cline-no">&nbsp;</span>
  4250. <span class="cline-any cline-no">&nbsp;</span>
  4251. <span class="cline-any cline-neutral">&nbsp;</span>
  4252. <span class="cline-any cline-neutral">&nbsp;</span>
  4253. <span class="cline-any cline-no">&nbsp;</span>
  4254. <span class="cline-any cline-neutral">&nbsp;</span>
  4255. <span class="cline-any cline-neutral">&nbsp;</span>
  4256. <span class="cline-any cline-no">&nbsp;</span>
  4257. <span class="cline-any cline-no">&nbsp;</span>
  4258. <span class="cline-any cline-no">&nbsp;</span>
  4259. <span class="cline-any cline-neutral">&nbsp;</span>
  4260. <span class="cline-any cline-neutral">&nbsp;</span>
  4261. <span class="cline-any cline-no">&nbsp;</span>
  4262. <span class="cline-any cline-neutral">&nbsp;</span>
  4263. <span class="cline-any cline-neutral">&nbsp;</span>
  4264. <span class="cline-any cline-no">&nbsp;</span>
  4265. <span class="cline-any cline-no">&nbsp;</span>
  4266. <span class="cline-any cline-no">&nbsp;</span>
  4267. <span class="cline-any cline-neutral">&nbsp;</span>
  4268. <span class="cline-any cline-no">&nbsp;</span>
  4269. <span class="cline-any cline-no">&nbsp;</span>
  4270. <span class="cline-any cline-no">&nbsp;</span>
  4271. <span class="cline-any cline-no">&nbsp;</span>
  4272. <span class="cline-any cline-no">&nbsp;</span>
  4273. <span class="cline-any cline-no">&nbsp;</span>
  4274. <span class="cline-any cline-no">&nbsp;</span>
  4275. <span class="cline-any cline-no">&nbsp;</span>
  4276. <span class="cline-any cline-no">&nbsp;</span>
  4277. <span class="cline-any cline-no">&nbsp;</span>
  4278. <span class="cline-any cline-no">&nbsp;</span>
  4279. <span class="cline-any cline-no">&nbsp;</span>
  4280. <span class="cline-any cline-no">&nbsp;</span>
  4281. <span class="cline-any cline-no">&nbsp;</span>
  4282. <span class="cline-any cline-no">&nbsp;</span>
  4283. <span class="cline-any cline-no">&nbsp;</span>
  4284. <span class="cline-any cline-no">&nbsp;</span>
  4285. <span class="cline-any cline-neutral">&nbsp;</span>
  4286. <span class="cline-any cline-neutral">&nbsp;</span>
  4287. <span class="cline-any cline-neutral">&nbsp;</span>
  4288. <span class="cline-any cline-neutral">&nbsp;</span>
  4289. <span class="cline-any cline-neutral">&nbsp;</span>
  4290. <span class="cline-any cline-no">&nbsp;</span>
  4291. <span class="cline-any cline-no">&nbsp;</span>
  4292. <span class="cline-any cline-no">&nbsp;</span>
  4293. <span class="cline-any cline-no">&nbsp;</span>
  4294. <span class="cline-any cline-no">&nbsp;</span>
  4295. <span class="cline-any cline-no">&nbsp;</span>
  4296. <span class="cline-any cline-no">&nbsp;</span>
  4297. <span class="cline-any cline-no">&nbsp;</span>
  4298. <span class="cline-any cline-no">&nbsp;</span>
  4299. <span class="cline-any cline-neutral">&nbsp;</span>
  4300. <span class="cline-any cline-neutral">&nbsp;</span>
  4301. <span class="cline-any cline-no">&nbsp;</span>
  4302. <span class="cline-any cline-no">&nbsp;</span>
  4303. <span class="cline-any cline-neutral">&nbsp;</span>
  4304. <span class="cline-any cline-no">&nbsp;</span>
  4305. <span class="cline-any cline-no">&nbsp;</span>
  4306. <span class="cline-any cline-no">&nbsp;</span>
  4307. <span class="cline-any cline-no">&nbsp;</span>
  4308. <span class="cline-any cline-no">&nbsp;</span>
  4309. <span class="cline-any cline-no">&nbsp;</span>
  4310. <span class="cline-any cline-no">&nbsp;</span>
  4311. <span class="cline-any cline-no">&nbsp;</span>
  4312. <span class="cline-any cline-no">&nbsp;</span>
  4313. <span class="cline-any cline-no">&nbsp;</span>
  4314. <span class="cline-any cline-no">&nbsp;</span>
  4315. <span class="cline-any cline-no">&nbsp;</span>
  4316. <span class="cline-any cline-no">&nbsp;</span>
  4317. <span class="cline-any cline-no">&nbsp;</span>
  4318. <span class="cline-any cline-no">&nbsp;</span>
  4319. <span class="cline-any cline-no">&nbsp;</span>
  4320. <span class="cline-any cline-no">&nbsp;</span>
  4321. <span class="cline-any cline-no">&nbsp;</span>
  4322. <span class="cline-any cline-no">&nbsp;</span>
  4323. <span class="cline-any cline-no">&nbsp;</span>
  4324. <span class="cline-any cline-no">&nbsp;</span>
  4325. <span class="cline-any cline-no">&nbsp;</span>
  4326. <span class="cline-any cline-neutral">&nbsp;</span>
  4327. <span class="cline-any cline-neutral">&nbsp;</span>
  4328. <span class="cline-any cline-neutral">&nbsp;</span>
  4329. <span class="cline-any cline-neutral">&nbsp;</span>
  4330. <span class="cline-any cline-neutral">&nbsp;</span>
  4331. <span class="cline-any cline-no">&nbsp;</span>
  4332. <span class="cline-any cline-no">&nbsp;</span>
  4333. <span class="cline-any cline-no">&nbsp;</span>
  4334. <span class="cline-any cline-no">&nbsp;</span>
  4335. <span class="cline-any cline-no">&nbsp;</span>
  4336. <span class="cline-any cline-no">&nbsp;</span>
  4337. <span class="cline-any cline-no">&nbsp;</span>
  4338. <span class="cline-any cline-no">&nbsp;</span>
  4339. <span class="cline-any cline-no">&nbsp;</span>
  4340. <span class="cline-any cline-neutral">&nbsp;</span>
  4341. <span class="cline-any cline-no">&nbsp;</span>
  4342. <span class="cline-any cline-no">&nbsp;</span>
  4343. <span class="cline-any cline-no">&nbsp;</span>
  4344. <span class="cline-any cline-no">&nbsp;</span>
  4345. <span class="cline-any cline-neutral">&nbsp;</span>
  4346. <span class="cline-any cline-neutral">&nbsp;</span>
  4347. <span class="cline-any cline-no">&nbsp;</span>
  4348. <span class="cline-any cline-no">&nbsp;</span>
  4349. <span class="cline-any cline-neutral">&nbsp;</span>
  4350. <span class="cline-any cline-no">&nbsp;</span>
  4351. <span class="cline-any cline-no">&nbsp;</span>
  4352. <span class="cline-any cline-no">&nbsp;</span>
  4353. <span class="cline-any cline-no">&nbsp;</span>
  4354. <span class="cline-any cline-neutral">&nbsp;</span>
  4355. <span class="cline-any cline-neutral">&nbsp;</span>
  4356. <span class="cline-any cline-no">&nbsp;</span>
  4357. <span class="cline-any cline-no">&nbsp;</span>
  4358. <span class="cline-any cline-no">&nbsp;</span>
  4359. <span class="cline-any cline-no">&nbsp;</span>
  4360. <span class="cline-any cline-no">&nbsp;</span>
  4361. <span class="cline-any cline-no">&nbsp;</span>
  4362. <span class="cline-any cline-no">&nbsp;</span>
  4363. <span class="cline-any cline-neutral">&nbsp;</span>
  4364. <span class="cline-any cline-neutral">&nbsp;</span>
  4365. <span class="cline-any cline-no">&nbsp;</span>
  4366. <span class="cline-any cline-no">&nbsp;</span>
  4367. <span class="cline-any cline-no">&nbsp;</span>
  4368. <span class="cline-any cline-no">&nbsp;</span>
  4369. <span class="cline-any cline-no">&nbsp;</span>
  4370. <span class="cline-any cline-no">&nbsp;</span>
  4371. <span class="cline-any cline-no">&nbsp;</span>
  4372. <span class="cline-any cline-no">&nbsp;</span>
  4373. <span class="cline-any cline-no">&nbsp;</span>
  4374. <span class="cline-any cline-no">&nbsp;</span>
  4375. <span class="cline-any cline-neutral">&nbsp;</span>
  4376. <span class="cline-any cline-no">&nbsp;</span>
  4377. <span class="cline-any cline-no">&nbsp;</span>
  4378. <span class="cline-any cline-no">&nbsp;</span>
  4379. <span class="cline-any cline-no">&nbsp;</span>
  4380. <span class="cline-any cline-no">&nbsp;</span>
  4381. <span class="cline-any cline-no">&nbsp;</span>
  4382. <span class="cline-any cline-no">&nbsp;</span>
  4383. <span class="cline-any cline-no">&nbsp;</span>
  4384. <span class="cline-any cline-no">&nbsp;</span>
  4385. <span class="cline-any cline-no">&nbsp;</span>
  4386. <span class="cline-any cline-no">&nbsp;</span>
  4387. <span class="cline-any cline-no">&nbsp;</span>
  4388. <span class="cline-any cline-no">&nbsp;</span>
  4389. <span class="cline-any cline-no">&nbsp;</span>
  4390. <span class="cline-any cline-no">&nbsp;</span>
  4391. <span class="cline-any cline-neutral">&nbsp;</span>
  4392. <span class="cline-any cline-neutral">&nbsp;</span>
  4393. <span class="cline-any cline-neutral">&nbsp;</span>
  4394. <span class="cline-any cline-neutral">&nbsp;</span>
  4395. <span class="cline-any cline-neutral">&nbsp;</span>
  4396. <span class="cline-any cline-no">&nbsp;</span>
  4397. <span class="cline-any cline-no">&nbsp;</span>
  4398. <span class="cline-any cline-no">&nbsp;</span>
  4399. <span class="cline-any cline-no">&nbsp;</span>
  4400. <span class="cline-any cline-neutral">&nbsp;</span>
  4401. <span class="cline-any cline-no">&nbsp;</span>
  4402. <span class="cline-any cline-no">&nbsp;</span>
  4403. <span class="cline-any cline-no">&nbsp;</span>
  4404. <span class="cline-any cline-no">&nbsp;</span>
  4405. <span class="cline-any cline-no">&nbsp;</span>
  4406. <span class="cline-any cline-neutral">&nbsp;</span>
  4407. <span class="cline-any cline-neutral">&nbsp;</span>
  4408. <span class="cline-any cline-no">&nbsp;</span>
  4409. <span class="cline-any cline-no">&nbsp;</span>
  4410. <span class="cline-any cline-no">&nbsp;</span>
  4411. <span class="cline-any cline-no">&nbsp;</span>
  4412. <span class="cline-any cline-no">&nbsp;</span>
  4413. <span class="cline-any cline-no">&nbsp;</span>
  4414. <span class="cline-any cline-no">&nbsp;</span>
  4415. <span class="cline-any cline-neutral">&nbsp;</span>
  4416. <span class="cline-any cline-neutral">&nbsp;</span>
  4417. <span class="cline-any cline-no">&nbsp;</span>
  4418. <span class="cline-any cline-no">&nbsp;</span>
  4419. <span class="cline-any cline-no">&nbsp;</span>
  4420. <span class="cline-any cline-no">&nbsp;</span>
  4421. <span class="cline-any cline-no">&nbsp;</span>
  4422. <span class="cline-any cline-neutral">&nbsp;</span>
  4423. <span class="cline-any cline-no">&nbsp;</span>
  4424. <span class="cline-any cline-no">&nbsp;</span>
  4425. <span class="cline-any cline-no">&nbsp;</span>
  4426. <span class="cline-any cline-no">&nbsp;</span>
  4427. <span class="cline-any cline-no">&nbsp;</span>
  4428. <span class="cline-any cline-no">&nbsp;</span>
  4429. <span class="cline-any cline-no">&nbsp;</span>
  4430. <span class="cline-any cline-no">&nbsp;</span>
  4431. <span class="cline-any cline-no">&nbsp;</span>
  4432. <span class="cline-any cline-no">&nbsp;</span>
  4433. <span class="cline-any cline-no">&nbsp;</span>
  4434. <span class="cline-any cline-neutral">&nbsp;</span>
  4435. <span class="cline-any cline-neutral">&nbsp;</span>
  4436. <span class="cline-any cline-neutral">&nbsp;</span>
  4437. <span class="cline-any cline-neutral">&nbsp;</span>
  4438. <span class="cline-any cline-neutral">&nbsp;</span>
  4439. <span class="cline-any cline-no">&nbsp;</span>
  4440. <span class="cline-any cline-no">&nbsp;</span>
  4441. <span class="cline-any cline-no">&nbsp;</span>
  4442. <span class="cline-any cline-no">&nbsp;</span>
  4443. <span class="cline-any cline-neutral">&nbsp;</span>
  4444. <span class="cline-any cline-no">&nbsp;</span>
  4445. <span class="cline-any cline-no">&nbsp;</span>
  4446. <span class="cline-any cline-no">&nbsp;</span>
  4447. <span class="cline-any cline-no">&nbsp;</span>
  4448. <span class="cline-any cline-no">&nbsp;</span>
  4449. <span class="cline-any cline-neutral">&nbsp;</span>
  4450. <span class="cline-any cline-neutral">&nbsp;</span>
  4451. <span class="cline-any cline-no">&nbsp;</span>
  4452. <span class="cline-any cline-neutral">&nbsp;</span>
  4453. <span class="cline-any cline-neutral">&nbsp;</span>
  4454. <span class="cline-any cline-no">&nbsp;</span>
  4455. <span class="cline-any cline-no">&nbsp;</span>
  4456. <span class="cline-any cline-no">&nbsp;</span>
  4457. <span class="cline-any cline-no">&nbsp;</span>
  4458. <span class="cline-any cline-neutral">&nbsp;</span>
  4459. <span class="cline-any cline-neutral">&nbsp;</span>
  4460. <span class="cline-any cline-no">&nbsp;</span>
  4461. <span class="cline-any cline-no">&nbsp;</span>
  4462. <span class="cline-any cline-no">&nbsp;</span>
  4463. <span class="cline-any cline-no">&nbsp;</span>
  4464. <span class="cline-any cline-no">&nbsp;</span>
  4465. <span class="cline-any cline-neutral">&nbsp;</span>
  4466. <span class="cline-any cline-no">&nbsp;</span>
  4467. <span class="cline-any cline-no">&nbsp;</span>
  4468. <span class="cline-any cline-no">&nbsp;</span>
  4469. <span class="cline-any cline-no">&nbsp;</span>
  4470. <span class="cline-any cline-no">&nbsp;</span>
  4471. <span class="cline-any cline-neutral">&nbsp;</span>
  4472. <span class="cline-any cline-neutral">&nbsp;</span>
  4473. <span class="cline-any cline-no">&nbsp;</span>
  4474. <span class="cline-any cline-no">&nbsp;</span>
  4475. <span class="cline-any cline-neutral">&nbsp;</span>
  4476. <span class="cline-any cline-no">&nbsp;</span>
  4477. <span class="cline-any cline-no">&nbsp;</span>
  4478. <span class="cline-any cline-no">&nbsp;</span>
  4479. <span class="cline-any cline-no">&nbsp;</span>
  4480. <span class="cline-any cline-no">&nbsp;</span>
  4481. <span class="cline-any cline-no">&nbsp;</span>
  4482. <span class="cline-any cline-no">&nbsp;</span>
  4483. <span class="cline-any cline-no">&nbsp;</span>
  4484. <span class="cline-any cline-no">&nbsp;</span>
  4485. <span class="cline-any cline-no">&nbsp;</span>
  4486. <span class="cline-any cline-no">&nbsp;</span>
  4487. <span class="cline-any cline-no">&nbsp;</span>
  4488. <span class="cline-any cline-no">&nbsp;</span>
  4489. <span class="cline-any cline-no">&nbsp;</span>
  4490. <span class="cline-any cline-no">&nbsp;</span>
  4491. <span class="cline-any cline-no">&nbsp;</span>
  4492. <span class="cline-any cline-no">&nbsp;</span>
  4493. <span class="cline-any cline-neutral">&nbsp;</span>
  4494. <span class="cline-any cline-neutral">&nbsp;</span>
  4495. <span class="cline-any cline-neutral">&nbsp;</span>
  4496. <span class="cline-any cline-neutral">&nbsp;</span>
  4497. <span class="cline-any cline-neutral">&nbsp;</span>
  4498. <span class="cline-any cline-no">&nbsp;</span>
  4499. <span class="cline-any cline-no">&nbsp;</span>
  4500. <span class="cline-any cline-no">&nbsp;</span>
  4501. <span class="cline-any cline-no">&nbsp;</span>
  4502. <span class="cline-any cline-neutral">&nbsp;</span>
  4503. <span class="cline-any cline-no">&nbsp;</span>
  4504. <span class="cline-any cline-no">&nbsp;</span>
  4505. <span class="cline-any cline-no">&nbsp;</span>
  4506. <span class="cline-any cline-no">&nbsp;</span>
  4507. <span class="cline-any cline-no">&nbsp;</span>
  4508. <span class="cline-any cline-neutral">&nbsp;</span>
  4509. <span class="cline-any cline-neutral">&nbsp;</span>
  4510. <span class="cline-any cline-no">&nbsp;</span>
  4511. <span class="cline-any cline-no">&nbsp;</span>
  4512. <span class="cline-any cline-no">&nbsp;</span>
  4513. <span class="cline-any cline-no">&nbsp;</span>
  4514. <span class="cline-any cline-no">&nbsp;</span>
  4515. <span class="cline-any cline-no">&nbsp;</span>
  4516. <span class="cline-any cline-no">&nbsp;</span>
  4517. <span class="cline-any cline-no">&nbsp;</span>
  4518. <span class="cline-any cline-neutral">&nbsp;</span>
  4519. <span class="cline-any cline-neutral">&nbsp;</span>
  4520. <span class="cline-any cline-no">&nbsp;</span>
  4521. <span class="cline-any cline-neutral">&nbsp;</span>
  4522. <span class="cline-any cline-neutral">&nbsp;</span>
  4523. <span class="cline-any cline-no">&nbsp;</span>
  4524. <span class="cline-any cline-no">&nbsp;</span>
  4525. <span class="cline-any cline-neutral">&nbsp;</span>
  4526. <span class="cline-any cline-neutral">&nbsp;</span>
  4527. <span class="cline-any cline-no">&nbsp;</span>
  4528. <span class="cline-any cline-neutral">&nbsp;</span>
  4529. <span class="cline-any cline-no">&nbsp;</span>
  4530. <span class="cline-any cline-no">&nbsp;</span>
  4531. <span class="cline-any cline-no">&nbsp;</span>
  4532. <span class="cline-any cline-no">&nbsp;</span>
  4533. <span class="cline-any cline-no">&nbsp;</span>
  4534. <span class="cline-any cline-no">&nbsp;</span>
  4535. <span class="cline-any cline-no">&nbsp;</span>
  4536. <span class="cline-any cline-no">&nbsp;</span>
  4537. <span class="cline-any cline-no">&nbsp;</span>
  4538. <span class="cline-any cline-no">&nbsp;</span>
  4539. <span class="cline-any cline-no">&nbsp;</span>
  4540. <span class="cline-any cline-neutral">&nbsp;</span>
  4541. <span class="cline-any cline-neutral">&nbsp;</span>
  4542. <span class="cline-any cline-neutral">&nbsp;</span>
  4543. <span class="cline-any cline-neutral">&nbsp;</span>
  4544. <span class="cline-any cline-neutral">&nbsp;</span>
  4545. <span class="cline-any cline-neutral">&nbsp;</span>
  4546. <span class="cline-any cline-no">&nbsp;</span>
  4547. <span class="cline-any cline-no">&nbsp;</span>
  4548. <span class="cline-any cline-no">&nbsp;</span>
  4549. <span class="cline-any cline-no">&nbsp;</span>
  4550. <span class="cline-any cline-no">&nbsp;</span>
  4551. <span class="cline-any cline-neutral">&nbsp;</span>
  4552. <span class="cline-any cline-no">&nbsp;</span>
  4553. <span class="cline-any cline-no">&nbsp;</span>
  4554. <span class="cline-any cline-no">&nbsp;</span>
  4555. <span class="cline-any cline-no">&nbsp;</span>
  4556. <span class="cline-any cline-no">&nbsp;</span>
  4557. <span class="cline-any cline-neutral">&nbsp;</span>
  4558. <span class="cline-any cline-neutral">&nbsp;</span>
  4559. <span class="cline-any cline-no">&nbsp;</span>
  4560. <span class="cline-any cline-neutral">&nbsp;</span>
  4561. <span class="cline-any cline-no">&nbsp;</span>
  4562. <span class="cline-any cline-no">&nbsp;</span>
  4563. <span class="cline-any cline-neutral">&nbsp;</span>
  4564. <span class="cline-any cline-no">&nbsp;</span>
  4565. <span class="cline-any cline-no">&nbsp;</span>
  4566. <span class="cline-any cline-no">&nbsp;</span>
  4567. <span class="cline-any cline-no">&nbsp;</span>
  4568. <span class="cline-any cline-no">&nbsp;</span>
  4569. <span class="cline-any cline-neutral">&nbsp;</span>
  4570. <span class="cline-any cline-neutral">&nbsp;</span>
  4571. <span class="cline-any cline-no">&nbsp;</span>
  4572. <span class="cline-any cline-no">&nbsp;</span>
  4573. <span class="cline-any cline-no">&nbsp;</span>
  4574. <span class="cline-any cline-neutral">&nbsp;</span>
  4575. <span class="cline-any cline-no">&nbsp;</span>
  4576. <span class="cline-any cline-no">&nbsp;</span>
  4577. <span class="cline-any cline-no">&nbsp;</span>
  4578. <span class="cline-any cline-no">&nbsp;</span>
  4579. <span class="cline-any cline-no">&nbsp;</span>
  4580. <span class="cline-any cline-no">&nbsp;</span>
  4581. <span class="cline-any cline-neutral">&nbsp;</span>
  4582. <span class="cline-any cline-no">&nbsp;</span>
  4583. <span class="cline-any cline-no">&nbsp;</span>
  4584. <span class="cline-any cline-no">&nbsp;</span>
  4585. <span class="cline-any cline-no">&nbsp;</span>
  4586. <span class="cline-any cline-no">&nbsp;</span>
  4587. <span class="cline-any cline-no">&nbsp;</span>
  4588. <span class="cline-any cline-no">&nbsp;</span>
  4589. <span class="cline-any cline-no">&nbsp;</span>
  4590. <span class="cline-any cline-no">&nbsp;</span>
  4591. <span class="cline-any cline-no">&nbsp;</span>
  4592. <span class="cline-any cline-no">&nbsp;</span>
  4593. <span class="cline-any cline-no">&nbsp;</span>
  4594. <span class="cline-any cline-neutral">&nbsp;</span>
  4595. <span class="cline-any cline-neutral">&nbsp;</span>
  4596. <span class="cline-any cline-neutral">&nbsp;</span>
  4597. <span class="cline-any cline-neutral">&nbsp;</span>
  4598. <span class="cline-any cline-neutral">&nbsp;</span>
  4599. <span class="cline-any cline-no">&nbsp;</span>
  4600. <span class="cline-any cline-no">&nbsp;</span>
  4601. <span class="cline-any cline-no">&nbsp;</span>
  4602. <span class="cline-any cline-no">&nbsp;</span>
  4603. <span class="cline-any cline-neutral">&nbsp;</span>
  4604. <span class="cline-any cline-no">&nbsp;</span>
  4605. <span class="cline-any cline-no">&nbsp;</span>
  4606. <span class="cline-any cline-no">&nbsp;</span>
  4607. <span class="cline-any cline-no">&nbsp;</span>
  4608. <span class="cline-any cline-no">&nbsp;</span>
  4609. <span class="cline-any cline-neutral">&nbsp;</span>
  4610. <span class="cline-any cline-neutral">&nbsp;</span>
  4611. <span class="cline-any cline-no">&nbsp;</span>
  4612. <span class="cline-any cline-no">&nbsp;</span>
  4613. <span class="cline-any cline-no">&nbsp;</span>
  4614. <span class="cline-any cline-no">&nbsp;</span>
  4615. <span class="cline-any cline-neutral">&nbsp;</span>
  4616. <span class="cline-any cline-neutral">&nbsp;</span>
  4617. <span class="cline-any cline-neutral">&nbsp;</span>
  4618. <span class="cline-any cline-neutral">&nbsp;</span>
  4619. <span class="cline-any cline-neutral">&nbsp;</span>
  4620. <span class="cline-any cline-neutral">&nbsp;</span>
  4621. <span class="cline-any cline-neutral">&nbsp;</span>
  4622. <span class="cline-any cline-no">&nbsp;</span>
  4623. <span class="cline-any cline-no">&nbsp;</span>
  4624. <span class="cline-any cline-no">&nbsp;</span>
  4625. <span class="cline-any cline-no">&nbsp;</span>
  4626. <span class="cline-any cline-no">&nbsp;</span>
  4627. <span class="cline-any cline-no">&nbsp;</span>
  4628. <span class="cline-any cline-no">&nbsp;</span>
  4629. <span class="cline-any cline-no">&nbsp;</span>
  4630. <span class="cline-any cline-neutral">&nbsp;</span>
  4631. <span class="cline-any cline-neutral">&nbsp;</span>
  4632. <span class="cline-any cline-no">&nbsp;</span>
  4633. <span class="cline-any cline-no">&nbsp;</span>
  4634. <span class="cline-any cline-neutral">&nbsp;</span>
  4635. <span class="cline-any cline-no">&nbsp;</span>
  4636. <span class="cline-any cline-neutral">&nbsp;</span>
  4637. <span class="cline-any cline-neutral">&nbsp;</span>
  4638. <span class="cline-any cline-no">&nbsp;</span>
  4639. <span class="cline-any cline-neutral">&nbsp;</span>
  4640. <span class="cline-any cline-no">&nbsp;</span>
  4641. <span class="cline-any cline-no">&nbsp;</span>
  4642. <span class="cline-any cline-no">&nbsp;</span>
  4643. <span class="cline-any cline-no">&nbsp;</span>
  4644. <span class="cline-any cline-no">&nbsp;</span>
  4645. <span class="cline-any cline-no">&nbsp;</span>
  4646. <span class="cline-any cline-no">&nbsp;</span>
  4647. <span class="cline-any cline-no">&nbsp;</span>
  4648. <span class="cline-any cline-no">&nbsp;</span>
  4649. <span class="cline-any cline-no">&nbsp;</span>
  4650. <span class="cline-any cline-no">&nbsp;</span>
  4651. <span class="cline-any cline-neutral">&nbsp;</span>
  4652. <span class="cline-any cline-neutral">&nbsp;</span>
  4653. <span class="cline-any cline-neutral">&nbsp;</span>
  4654. <span class="cline-any cline-neutral">&nbsp;</span>
  4655. <span class="cline-any cline-neutral">&nbsp;</span>
  4656. <span class="cline-any cline-no">&nbsp;</span>
  4657. <span class="cline-any cline-no">&nbsp;</span>
  4658. <span class="cline-any cline-no">&nbsp;</span>
  4659. <span class="cline-any cline-no">&nbsp;</span>
  4660. <span class="cline-any cline-neutral">&nbsp;</span>
  4661. <span class="cline-any cline-no">&nbsp;</span>
  4662. <span class="cline-any cline-no">&nbsp;</span>
  4663. <span class="cline-any cline-no">&nbsp;</span>
  4664. <span class="cline-any cline-no">&nbsp;</span>
  4665. <span class="cline-any cline-no">&nbsp;</span>
  4666. <span class="cline-any cline-neutral">&nbsp;</span>
  4667. <span class="cline-any cline-neutral">&nbsp;</span>
  4668. <span class="cline-any cline-no">&nbsp;</span>
  4669. <span class="cline-any cline-no">&nbsp;</span>
  4670. <span class="cline-any cline-no">&nbsp;</span>
  4671. <span class="cline-any cline-no">&nbsp;</span>
  4672. <span class="cline-any cline-neutral">&nbsp;</span>
  4673. <span class="cline-any cline-neutral">&nbsp;</span>
  4674. <span class="cline-any cline-neutral">&nbsp;</span>
  4675. <span class="cline-any cline-neutral">&nbsp;</span>
  4676. <span class="cline-any cline-neutral">&nbsp;</span>
  4677. <span class="cline-any cline-neutral">&nbsp;</span>
  4678. <span class="cline-any cline-neutral">&nbsp;</span>
  4679. <span class="cline-any cline-no">&nbsp;</span>
  4680. <span class="cline-any cline-no">&nbsp;</span>
  4681. <span class="cline-any cline-no">&nbsp;</span>
  4682. <span class="cline-any cline-no">&nbsp;</span>
  4683. <span class="cline-any cline-no">&nbsp;</span>
  4684. <span class="cline-any cline-no">&nbsp;</span>
  4685. <span class="cline-any cline-no">&nbsp;</span>
  4686. <span class="cline-any cline-no">&nbsp;</span>
  4687. <span class="cline-any cline-neutral">&nbsp;</span>
  4688. <span class="cline-any cline-neutral">&nbsp;</span>
  4689. <span class="cline-any cline-no">&nbsp;</span>
  4690. <span class="cline-any cline-no">&nbsp;</span>
  4691. <span class="cline-any cline-neutral">&nbsp;</span>
  4692. <span class="cline-any cline-no">&nbsp;</span>
  4693. <span class="cline-any cline-neutral">&nbsp;</span>
  4694. <span class="cline-any cline-neutral">&nbsp;</span>
  4695. <span class="cline-any cline-no">&nbsp;</span>
  4696. <span class="cline-any cline-neutral">&nbsp;</span>
  4697. <span class="cline-any cline-no">&nbsp;</span>
  4698. <span class="cline-any cline-no">&nbsp;</span>
  4699. <span class="cline-any cline-no">&nbsp;</span>
  4700. <span class="cline-any cline-no">&nbsp;</span>
  4701. <span class="cline-any cline-no">&nbsp;</span>
  4702. <span class="cline-any cline-no">&nbsp;</span>
  4703. <span class="cline-any cline-no">&nbsp;</span>
  4704. <span class="cline-any cline-no">&nbsp;</span>
  4705. <span class="cline-any cline-no">&nbsp;</span>
  4706. <span class="cline-any cline-no">&nbsp;</span>
  4707. <span class="cline-any cline-no">&nbsp;</span>
  4708. <span class="cline-any cline-neutral">&nbsp;</span>
  4709. <span class="cline-any cline-neutral">&nbsp;</span>
  4710. <span class="cline-any cline-neutral">&nbsp;</span>
  4711. <span class="cline-any cline-neutral">&nbsp;</span>
  4712. <span class="cline-any cline-neutral">&nbsp;</span>
  4713. <span class="cline-any cline-no">&nbsp;</span>
  4714. <span class="cline-any cline-no">&nbsp;</span>
  4715. <span class="cline-any cline-no">&nbsp;</span>
  4716. <span class="cline-any cline-no">&nbsp;</span>
  4717. <span class="cline-any cline-neutral">&nbsp;</span>
  4718. <span class="cline-any cline-no">&nbsp;</span>
  4719. <span class="cline-any cline-no">&nbsp;</span>
  4720. <span class="cline-any cline-no">&nbsp;</span>
  4721. <span class="cline-any cline-no">&nbsp;</span>
  4722. <span class="cline-any cline-no">&nbsp;</span>
  4723. <span class="cline-any cline-neutral">&nbsp;</span>
  4724. <span class="cline-any cline-neutral">&nbsp;</span>
  4725. <span class="cline-any cline-no">&nbsp;</span>
  4726. <span class="cline-any cline-neutral">&nbsp;</span>
  4727. <span class="cline-any cline-neutral">&nbsp;</span>
  4728. <span class="cline-any cline-no">&nbsp;</span>
  4729. <span class="cline-any cline-no">&nbsp;</span>
  4730. <span class="cline-any cline-no">&nbsp;</span>
  4731. <span class="cline-any cline-no">&nbsp;</span>
  4732. <span class="cline-any cline-neutral">&nbsp;</span>
  4733. <span class="cline-any cline-neutral">&nbsp;</span>
  4734. <span class="cline-any cline-no">&nbsp;</span>
  4735. <span class="cline-any cline-no">&nbsp;</span>
  4736. <span class="cline-any cline-no">&nbsp;</span>
  4737. <span class="cline-any cline-no">&nbsp;</span>
  4738. <span class="cline-any cline-no">&nbsp;</span>
  4739. <span class="cline-any cline-no">&nbsp;</span>
  4740. <span class="cline-any cline-no">&nbsp;</span>
  4741. <span class="cline-any cline-no">&nbsp;</span>
  4742. <span class="cline-any cline-neutral">&nbsp;</span>
  4743. <span class="cline-any cline-no">&nbsp;</span>
  4744. <span class="cline-any cline-no">&nbsp;</span>
  4745. <span class="cline-any cline-no">&nbsp;</span>
  4746. <span class="cline-any cline-no">&nbsp;</span>
  4747. <span class="cline-any cline-no">&nbsp;</span>
  4748. <span class="cline-any cline-no">&nbsp;</span>
  4749. <span class="cline-any cline-no">&nbsp;</span>
  4750. <span class="cline-any cline-no">&nbsp;</span>
  4751. <span class="cline-any cline-no">&nbsp;</span>
  4752. <span class="cline-any cline-no">&nbsp;</span>
  4753. <span class="cline-any cline-no">&nbsp;</span>
  4754. <span class="cline-any cline-no">&nbsp;</span>
  4755. <span class="cline-any cline-no">&nbsp;</span>
  4756. <span class="cline-any cline-no">&nbsp;</span>
  4757. <span class="cline-any cline-no">&nbsp;</span>
  4758. <span class="cline-any cline-no">&nbsp;</span>
  4759. <span class="cline-any cline-no">&nbsp;</span>
  4760. <span class="cline-any cline-no">&nbsp;</span>
  4761. <span class="cline-any cline-no">&nbsp;</span>
  4762. <span class="cline-any cline-no">&nbsp;</span>
  4763. <span class="cline-any cline-no">&nbsp;</span>
  4764. <span class="cline-any cline-no">&nbsp;</span>
  4765. <span class="cline-any cline-neutral">&nbsp;</span>
  4766. <span class="cline-any cline-neutral">&nbsp;</span>
  4767. <span class="cline-any cline-neutral">&nbsp;</span>
  4768. <span class="cline-any cline-neutral">&nbsp;</span>
  4769. <span class="cline-any cline-neutral">&nbsp;</span>
  4770. <span class="cline-any cline-no">&nbsp;</span>
  4771. <span class="cline-any cline-no">&nbsp;</span>
  4772. <span class="cline-any cline-no">&nbsp;</span>
  4773. <span class="cline-any cline-no">&nbsp;</span>
  4774. <span class="cline-any cline-neutral">&nbsp;</span>
  4775. <span class="cline-any cline-neutral">&nbsp;</span>
  4776. <span class="cline-any cline-no">&nbsp;</span>
  4777. <span class="cline-any cline-no">&nbsp;</span>
  4778. <span class="cline-any cline-no">&nbsp;</span>
  4779. <span class="cline-any cline-no">&nbsp;</span>
  4780. <span class="cline-any cline-no">&nbsp;</span>
  4781. <span class="cline-any cline-no">&nbsp;</span>
  4782. <span class="cline-any cline-neutral">&nbsp;</span>
  4783. <span class="cline-any cline-neutral">&nbsp;</span>
  4784. <span class="cline-any cline-no">&nbsp;</span>
  4785. <span class="cline-any cline-no">&nbsp;</span>
  4786. <span class="cline-any cline-no">&nbsp;</span>
  4787. <span class="cline-any cline-no">&nbsp;</span>
  4788. <span class="cline-any cline-no">&nbsp;</span>
  4789. <span class="cline-any cline-no">&nbsp;</span>
  4790. <span class="cline-any cline-no">&nbsp;</span>
  4791. <span class="cline-any cline-no">&nbsp;</span>
  4792. <span class="cline-any cline-neutral">&nbsp;</span>
  4793. <span class="cline-any cline-neutral">&nbsp;</span>
  4794. <span class="cline-any cline-no">&nbsp;</span>
  4795. <span class="cline-any cline-no">&nbsp;</span>
  4796. <span class="cline-any cline-no">&nbsp;</span>
  4797. <span class="cline-any cline-no">&nbsp;</span>
  4798. <span class="cline-any cline-no">&nbsp;</span>
  4799. <span class="cline-any cline-neutral">&nbsp;</span>
  4800. <span class="cline-any cline-no">&nbsp;</span>
  4801. <span class="cline-any cline-no">&nbsp;</span>
  4802. <span class="cline-any cline-no">&nbsp;</span>
  4803. <span class="cline-any cline-no">&nbsp;</span>
  4804. <span class="cline-any cline-no">&nbsp;</span>
  4805. <span class="cline-any cline-no">&nbsp;</span>
  4806. <span class="cline-any cline-no">&nbsp;</span>
  4807. <span class="cline-any cline-no">&nbsp;</span>
  4808. <span class="cline-any cline-no">&nbsp;</span>
  4809. <span class="cline-any cline-no">&nbsp;</span>
  4810. <span class="cline-any cline-no">&nbsp;</span>
  4811. <span class="cline-any cline-no">&nbsp;</span>
  4812. <span class="cline-any cline-no">&nbsp;</span>
  4813. <span class="cline-any cline-no">&nbsp;</span>
  4814. <span class="cline-any cline-no">&nbsp;</span>
  4815. <span class="cline-any cline-no">&nbsp;</span>
  4816. <span class="cline-any cline-no">&nbsp;</span>
  4817. <span class="cline-any cline-no">&nbsp;</span>
  4818. <span class="cline-any cline-no">&nbsp;</span>
  4819. <span class="cline-any cline-no">&nbsp;</span>
  4820. <span class="cline-any cline-no">&nbsp;</span>
  4821. <span class="cline-any cline-no">&nbsp;</span>
  4822. <span class="cline-any cline-no">&nbsp;</span>
  4823. <span class="cline-any cline-no">&nbsp;</span>
  4824. <span class="cline-any cline-no">&nbsp;</span>
  4825. <span class="cline-any cline-no">&nbsp;</span>
  4826. <span class="cline-any cline-neutral">&nbsp;</span>
  4827. <span class="cline-any cline-neutral">&nbsp;</span>
  4828. <span class="cline-any cline-neutral">&nbsp;</span>
  4829. <span class="cline-any cline-neutral">&nbsp;</span>
  4830. <span class="cline-any cline-neutral">&nbsp;</span>
  4831. <span class="cline-any cline-no">&nbsp;</span>
  4832. <span class="cline-any cline-no">&nbsp;</span>
  4833. <span class="cline-any cline-no">&nbsp;</span>
  4834. <span class="cline-any cline-no">&nbsp;</span>
  4835. <span class="cline-any cline-no">&nbsp;</span>
  4836. <span class="cline-any cline-neutral">&nbsp;</span>
  4837. <span class="cline-any cline-no">&nbsp;</span>
  4838. <span class="cline-any cline-no">&nbsp;</span>
  4839. <span class="cline-any cline-no">&nbsp;</span>
  4840. <span class="cline-any cline-no">&nbsp;</span>
  4841. <span class="cline-any cline-no">&nbsp;</span>
  4842. <span class="cline-any cline-neutral">&nbsp;</span>
  4843. <span class="cline-any cline-neutral">&nbsp;</span>
  4844. <span class="cline-any cline-no">&nbsp;</span>
  4845. <span class="cline-any cline-no">&nbsp;</span>
  4846. <span class="cline-any cline-no">&nbsp;</span>
  4847. <span class="cline-any cline-no">&nbsp;</span>
  4848. <span class="cline-any cline-no">&nbsp;</span>
  4849. <span class="cline-any cline-no">&nbsp;</span>
  4850. <span class="cline-any cline-no">&nbsp;</span>
  4851. <span class="cline-any cline-no">&nbsp;</span>
  4852. <span class="cline-any cline-neutral">&nbsp;</span>
  4853. <span class="cline-any cline-neutral">&nbsp;</span>
  4854. <span class="cline-any cline-no">&nbsp;</span>
  4855. <span class="cline-any cline-no">&nbsp;</span>
  4856. <span class="cline-any cline-no">&nbsp;</span>
  4857. <span class="cline-any cline-no">&nbsp;</span>
  4858. <span class="cline-any cline-no">&nbsp;</span>
  4859. <span class="cline-any cline-neutral">&nbsp;</span>
  4860. <span class="cline-any cline-neutral">&nbsp;</span>
  4861. <span class="cline-any cline-no">&nbsp;</span>
  4862. <span class="cline-any cline-neutral">&nbsp;</span>
  4863. <span class="cline-any cline-neutral">&nbsp;</span>
  4864. <span class="cline-any cline-no">&nbsp;</span>
  4865. <span class="cline-any cline-no">&nbsp;</span>
  4866. <span class="cline-any cline-no">&nbsp;</span>
  4867. <span class="cline-any cline-no">&nbsp;</span>
  4868. <span class="cline-any cline-neutral">&nbsp;</span>
  4869. <span class="cline-any cline-no">&nbsp;</span>
  4870. <span class="cline-any cline-no">&nbsp;</span>
  4871. <span class="cline-any cline-no">&nbsp;</span>
  4872. <span class="cline-any cline-no">&nbsp;</span>
  4873. <span class="cline-any cline-no">&nbsp;</span>
  4874. <span class="cline-any cline-no">&nbsp;</span>
  4875. <span class="cline-any cline-no">&nbsp;</span>
  4876. <span class="cline-any cline-no">&nbsp;</span>
  4877. <span class="cline-any cline-no">&nbsp;</span>
  4878. <span class="cline-any cline-no">&nbsp;</span>
  4879. <span class="cline-any cline-no">&nbsp;</span>
  4880. <span class="cline-any cline-neutral">&nbsp;</span>
  4881. <span class="cline-any cline-neutral">&nbsp;</span>
  4882. <span class="cline-any cline-neutral">&nbsp;</span>
  4883. <span class="cline-any cline-neutral">&nbsp;</span>
  4884. <span class="cline-any cline-neutral">&nbsp;</span>
  4885. <span class="cline-any cline-no">&nbsp;</span>
  4886. <span class="cline-any cline-no">&nbsp;</span>
  4887. <span class="cline-any cline-no">&nbsp;</span>
  4888. <span class="cline-any cline-no">&nbsp;</span>
  4889. <span class="cline-any cline-neutral">&nbsp;</span>
  4890. <span class="cline-any cline-no">&nbsp;</span>
  4891. <span class="cline-any cline-no">&nbsp;</span>
  4892. <span class="cline-any cline-no">&nbsp;</span>
  4893. <span class="cline-any cline-no">&nbsp;</span>
  4894. <span class="cline-any cline-no">&nbsp;</span>
  4895. <span class="cline-any cline-neutral">&nbsp;</span>
  4896. <span class="cline-any cline-neutral">&nbsp;</span>
  4897. <span class="cline-any cline-no">&nbsp;</span>
  4898. <span class="cline-any cline-no">&nbsp;</span>
  4899. <span class="cline-any cline-no">&nbsp;</span>
  4900. <span class="cline-any cline-no">&nbsp;</span>
  4901. <span class="cline-any cline-no">&nbsp;</span>
  4902. <span class="cline-any cline-no">&nbsp;</span>
  4903. <span class="cline-any cline-neutral">&nbsp;</span>
  4904. <span class="cline-any cline-neutral">&nbsp;</span>
  4905. <span class="cline-any cline-no">&nbsp;</span>
  4906. <span class="cline-any cline-neutral">&nbsp;</span>
  4907. <span class="cline-any cline-neutral">&nbsp;</span>
  4908. <span class="cline-any cline-no">&nbsp;</span>
  4909. <span class="cline-any cline-no">&nbsp;</span>
  4910. <span class="cline-any cline-no">&nbsp;</span>
  4911. <span class="cline-any cline-no">&nbsp;</span>
  4912. <span class="cline-any cline-no">&nbsp;</span>
  4913. <span class="cline-any cline-neutral">&nbsp;</span>
  4914. <span class="cline-any cline-no">&nbsp;</span>
  4915. <span class="cline-any cline-no">&nbsp;</span>
  4916. <span class="cline-any cline-no">&nbsp;</span>
  4917. <span class="cline-any cline-no">&nbsp;</span>
  4918. <span class="cline-any cline-neutral">&nbsp;</span>
  4919. <span class="cline-any cline-no">&nbsp;</span>
  4920. <span class="cline-any cline-no">&nbsp;</span>
  4921. <span class="cline-any cline-no">&nbsp;</span>
  4922. <span class="cline-any cline-no">&nbsp;</span>
  4923. <span class="cline-any cline-no">&nbsp;</span>
  4924. <span class="cline-any cline-no">&nbsp;</span>
  4925. <span class="cline-any cline-no">&nbsp;</span>
  4926. <span class="cline-any cline-no">&nbsp;</span>
  4927. <span class="cline-any cline-no">&nbsp;</span>
  4928. <span class="cline-any cline-no">&nbsp;</span>
  4929. <span class="cline-any cline-no">&nbsp;</span>
  4930. <span class="cline-any cline-neutral">&nbsp;</span>
  4931. <span class="cline-any cline-neutral">&nbsp;</span>
  4932. <span class="cline-any cline-neutral">&nbsp;</span>
  4933. <span class="cline-any cline-neutral">&nbsp;</span>
  4934. <span class="cline-any cline-neutral">&nbsp;</span>
  4935. <span class="cline-any cline-no">&nbsp;</span>
  4936. <span class="cline-any cline-no">&nbsp;</span>
  4937. <span class="cline-any cline-no">&nbsp;</span>
  4938. <span class="cline-any cline-no">&nbsp;</span>
  4939. <span class="cline-any cline-neutral">&nbsp;</span>
  4940. <span class="cline-any cline-no">&nbsp;</span>
  4941. <span class="cline-any cline-no">&nbsp;</span>
  4942. <span class="cline-any cline-no">&nbsp;</span>
  4943. <span class="cline-any cline-no">&nbsp;</span>
  4944. <span class="cline-any cline-no">&nbsp;</span>
  4945. <span class="cline-any cline-neutral">&nbsp;</span>
  4946. <span class="cline-any cline-neutral">&nbsp;</span>
  4947. <span class="cline-any cline-no">&nbsp;</span>
  4948. <span class="cline-any cline-no">&nbsp;</span>
  4949. <span class="cline-any cline-no">&nbsp;</span>
  4950. <span class="cline-any cline-no">&nbsp;</span>
  4951. <span class="cline-any cline-no">&nbsp;</span>
  4952. <span class="cline-any cline-no">&nbsp;</span>
  4953. <span class="cline-any cline-neutral">&nbsp;</span>
  4954. <span class="cline-any cline-neutral">&nbsp;</span>
  4955. <span class="cline-any cline-neutral">&nbsp;</span>
  4956. <span class="cline-any cline-no">&nbsp;</span>
  4957. <span class="cline-any cline-neutral">&nbsp;</span>
  4958. <span class="cline-any cline-no">&nbsp;</span>
  4959. <span class="cline-any cline-no">&nbsp;</span>
  4960. <span class="cline-any cline-no">&nbsp;</span>
  4961. <span class="cline-any cline-no">&nbsp;</span>
  4962. <span class="cline-any cline-no">&nbsp;</span>
  4963. <span class="cline-any cline-no">&nbsp;</span>
  4964. <span class="cline-any cline-neutral">&nbsp;</span>
  4965. <span class="cline-any cline-no">&nbsp;</span>
  4966. <span class="cline-any cline-no">&nbsp;</span>
  4967. <span class="cline-any cline-no">&nbsp;</span>
  4968. <span class="cline-any cline-no">&nbsp;</span>
  4969. <span class="cline-any cline-no">&nbsp;</span>
  4970. <span class="cline-any cline-no">&nbsp;</span>
  4971. <span class="cline-any cline-no">&nbsp;</span>
  4972. <span class="cline-any cline-neutral">&nbsp;</span>
  4973. <span class="cline-any cline-no">&nbsp;</span>
  4974. <span class="cline-any cline-no">&nbsp;</span>
  4975. <span class="cline-any cline-no">&nbsp;</span>
  4976. <span class="cline-any cline-no">&nbsp;</span>
  4977. <span class="cline-any cline-no">&nbsp;</span>
  4978. <span class="cline-any cline-no">&nbsp;</span>
  4979. <span class="cline-any cline-no">&nbsp;</span>
  4980. <span class="cline-any cline-no">&nbsp;</span>
  4981. <span class="cline-any cline-no">&nbsp;</span>
  4982. <span class="cline-any cline-no">&nbsp;</span>
  4983. <span class="cline-any cline-no">&nbsp;</span>
  4984. <span class="cline-any cline-neutral">&nbsp;</span>
  4985. <span class="cline-any cline-neutral">&nbsp;</span>
  4986. <span class="cline-any cline-neutral">&nbsp;</span>
  4987. <span class="cline-any cline-neutral">&nbsp;</span>
  4988. <span class="cline-any cline-neutral">&nbsp;</span>
  4989. <span class="cline-any cline-no">&nbsp;</span>
  4990. <span class="cline-any cline-no">&nbsp;</span>
  4991. <span class="cline-any cline-no">&nbsp;</span>
  4992. <span class="cline-any cline-no">&nbsp;</span>
  4993. <span class="cline-any cline-neutral">&nbsp;</span>
  4994. <span class="cline-any cline-neutral">&nbsp;</span>
  4995. <span class="cline-any cline-no">&nbsp;</span>
  4996. <span class="cline-any cline-no">&nbsp;</span>
  4997. <span class="cline-any cline-no">&nbsp;</span>
  4998. <span class="cline-any cline-no">&nbsp;</span>
  4999. <span class="cline-any cline-no">&nbsp;</span>
  5000. <span class="cline-any cline-no">&nbsp;</span>
  5001. <span class="cline-any cline-neutral">&nbsp;</span>
  5002. <span class="cline-any cline-neutral">&nbsp;</span>
  5003. <span class="cline-any cline-no">&nbsp;</span>
  5004. <span class="cline-any cline-no">&nbsp;</span>
  5005. <span class="cline-any cline-no">&nbsp;</span>
  5006. <span class="cline-any cline-no">&nbsp;</span>
  5007. <span class="cline-any cline-no">&nbsp;</span>
  5008. <span class="cline-any cline-no">&nbsp;</span>
  5009. <span class="cline-any cline-no">&nbsp;</span>
  5010. <span class="cline-any cline-no">&nbsp;</span>
  5011. <span class="cline-any cline-neutral">&nbsp;</span>
  5012. <span class="cline-any cline-neutral">&nbsp;</span>
  5013. <span class="cline-any cline-no">&nbsp;</span>
  5014. <span class="cline-any cline-no">&nbsp;</span>
  5015. <span class="cline-any cline-no">&nbsp;</span>
  5016. <span class="cline-any cline-no">&nbsp;</span>
  5017. <span class="cline-any cline-no">&nbsp;</span>
  5018. <span class="cline-any cline-no">&nbsp;</span>
  5019. <span class="cline-any cline-no">&nbsp;</span>
  5020. <span class="cline-any cline-no">&nbsp;</span>
  5021. <span class="cline-any cline-neutral">&nbsp;</span>
  5022. <span class="cline-any cline-neutral">&nbsp;</span>
  5023. <span class="cline-any cline-no">&nbsp;</span>
  5024. <span class="cline-any cline-no">&nbsp;</span>
  5025. <span class="cline-any cline-no">&nbsp;</span>
  5026. <span class="cline-any cline-no">&nbsp;</span>
  5027. <span class="cline-any cline-no">&nbsp;</span>
  5028. <span class="cline-any cline-neutral">&nbsp;</span>
  5029. <span class="cline-any cline-neutral">&nbsp;</span>
  5030. <span class="cline-any cline-neutral">&nbsp;</span>
  5031. <span class="cline-any cline-no">&nbsp;</span>
  5032. <span class="cline-any cline-no">&nbsp;</span>
  5033. <span class="cline-any cline-no">&nbsp;</span>
  5034. <span class="cline-any cline-neutral">&nbsp;</span>
  5035. <span class="cline-any cline-no">&nbsp;</span>
  5036. <span class="cline-any cline-no">&nbsp;</span>
  5037. <span class="cline-any cline-no">&nbsp;</span>
  5038. <span class="cline-any cline-no">&nbsp;</span>
  5039. <span class="cline-any cline-no">&nbsp;</span>
  5040. <span class="cline-any cline-no">&nbsp;</span>
  5041. <span class="cline-any cline-no">&nbsp;</span>
  5042. <span class="cline-any cline-no">&nbsp;</span>
  5043. <span class="cline-any cline-no">&nbsp;</span>
  5044. <span class="cline-any cline-no">&nbsp;</span>
  5045. <span class="cline-any cline-no">&nbsp;</span>
  5046. <span class="cline-any cline-neutral">&nbsp;</span>
  5047. <span class="cline-any cline-neutral">&nbsp;</span>
  5048. <span class="cline-any cline-neutral">&nbsp;</span>
  5049. <span class="cline-any cline-neutral">&nbsp;</span>
  5050. <span class="cline-any cline-neutral">&nbsp;</span>
  5051. <span class="cline-any cline-no">&nbsp;</span>
  5052. <span class="cline-any cline-no">&nbsp;</span>
  5053. <span class="cline-any cline-no">&nbsp;</span>
  5054. <span class="cline-any cline-no">&nbsp;</span>
  5055. <span class="cline-any cline-neutral">&nbsp;</span>
  5056. <span class="cline-any cline-neutral">&nbsp;</span>
  5057. <span class="cline-any cline-no">&nbsp;</span>
  5058. <span class="cline-any cline-no">&nbsp;</span>
  5059. <span class="cline-any cline-no">&nbsp;</span>
  5060. <span class="cline-any cline-no">&nbsp;</span>
  5061. <span class="cline-any cline-no">&nbsp;</span>
  5062. <span class="cline-any cline-no">&nbsp;</span>
  5063. <span class="cline-any cline-neutral">&nbsp;</span>
  5064. <span class="cline-any cline-neutral">&nbsp;</span>
  5065. <span class="cline-any cline-no">&nbsp;</span>
  5066. <span class="cline-any cline-no">&nbsp;</span>
  5067. <span class="cline-any cline-no">&nbsp;</span>
  5068. <span class="cline-any cline-no">&nbsp;</span>
  5069. <span class="cline-any cline-no">&nbsp;</span>
  5070. <span class="cline-any cline-no">&nbsp;</span>
  5071. <span class="cline-any cline-no">&nbsp;</span>
  5072. <span class="cline-any cline-no">&nbsp;</span>
  5073. <span class="cline-any cline-neutral">&nbsp;</span>
  5074. <span class="cline-any cline-neutral">&nbsp;</span>
  5075. <span class="cline-any cline-no">&nbsp;</span>
  5076. <span class="cline-any cline-no">&nbsp;</span>
  5077. <span class="cline-any cline-no">&nbsp;</span>
  5078. <span class="cline-any cline-no">&nbsp;</span>
  5079. <span class="cline-any cline-no">&nbsp;</span>
  5080. <span class="cline-any cline-no">&nbsp;</span>
  5081. <span class="cline-any cline-no">&nbsp;</span>
  5082. <span class="cline-any cline-no">&nbsp;</span>
  5083. <span class="cline-any cline-neutral">&nbsp;</span>
  5084. <span class="cline-any cline-neutral">&nbsp;</span>
  5085. <span class="cline-any cline-no">&nbsp;</span>
  5086. <span class="cline-any cline-no">&nbsp;</span>
  5087. <span class="cline-any cline-no">&nbsp;</span>
  5088. <span class="cline-any cline-no">&nbsp;</span>
  5089. <span class="cline-any cline-no">&nbsp;</span>
  5090. <span class="cline-any cline-neutral">&nbsp;</span>
  5091. <span class="cline-any cline-neutral">&nbsp;</span>
  5092. <span class="cline-any cline-no">&nbsp;</span>
  5093. <span class="cline-any cline-no">&nbsp;</span>
  5094. <span class="cline-any cline-no">&nbsp;</span>
  5095. <span class="cline-any cline-no">&nbsp;</span>
  5096. <span class="cline-any cline-no">&nbsp;</span>
  5097. <span class="cline-any cline-no">&nbsp;</span>
  5098. <span class="cline-any cline-neutral">&nbsp;</span>
  5099. <span class="cline-any cline-neutral">&nbsp;</span>
  5100. <span class="cline-any cline-no">&nbsp;</span>
  5101. <span class="cline-any cline-no">&nbsp;</span>
  5102. <span class="cline-any cline-no">&nbsp;</span>
  5103. <span class="cline-any cline-no">&nbsp;</span>
  5104. <span class="cline-any cline-no">&nbsp;</span>
  5105. <span class="cline-any cline-no">&nbsp;</span>
  5106. <span class="cline-any cline-no">&nbsp;</span>
  5107. <span class="cline-any cline-no">&nbsp;</span>
  5108. <span class="cline-any cline-no">&nbsp;</span>
  5109. <span class="cline-any cline-no">&nbsp;</span>
  5110. <span class="cline-any cline-neutral">&nbsp;</span>
  5111. <span class="cline-any cline-no">&nbsp;</span>
  5112. <span class="cline-any cline-no">&nbsp;</span>
  5113. <span class="cline-any cline-no">&nbsp;</span>
  5114. <span class="cline-any cline-no">&nbsp;</span>
  5115. <span class="cline-any cline-no">&nbsp;</span>
  5116. <span class="cline-any cline-no">&nbsp;</span>
  5117. <span class="cline-any cline-no">&nbsp;</span>
  5118. <span class="cline-any cline-no">&nbsp;</span>
  5119. <span class="cline-any cline-no">&nbsp;</span>
  5120. <span class="cline-any cline-no">&nbsp;</span>
  5121. <span class="cline-any cline-no">&nbsp;</span>
  5122. <span class="cline-any cline-no">&nbsp;</span>
  5123. <span class="cline-any cline-no">&nbsp;</span>
  5124. <span class="cline-any cline-no">&nbsp;</span>
  5125. <span class="cline-any cline-neutral">&nbsp;</span>
  5126. <span class="cline-any cline-neutral">&nbsp;</span>
  5127. <span class="cline-any cline-no">&nbsp;</span>
  5128. <span class="cline-any cline-neutral">&nbsp;</span>
  5129. <span class="cline-any cline-no">&nbsp;</span>
  5130. <span class="cline-any cline-no">&nbsp;</span>
  5131. <span class="cline-any cline-no">&nbsp;</span>
  5132. <span class="cline-any cline-no">&nbsp;</span>
  5133. <span class="cline-any cline-no">&nbsp;</span>
  5134. <span class="cline-any cline-no">&nbsp;</span>
  5135. <span class="cline-any cline-no">&nbsp;</span>
  5136. <span class="cline-any cline-no">&nbsp;</span>
  5137. <span class="cline-any cline-no">&nbsp;</span>
  5138. <span class="cline-any cline-no">&nbsp;</span>
  5139. <span class="cline-any cline-no">&nbsp;</span>
  5140. <span class="cline-any cline-neutral">&nbsp;</span>
  5141. <span class="cline-any cline-neutral">&nbsp;</span>
  5142. <span class="cline-any cline-neutral">&nbsp;</span>
  5143. <span class="cline-any cline-neutral">&nbsp;</span>
  5144. <span class="cline-any cline-neutral">&nbsp;</span>
  5145. <span class="cline-any cline-no">&nbsp;</span>
  5146. <span class="cline-any cline-no">&nbsp;</span>
  5147. <span class="cline-any cline-no">&nbsp;</span>
  5148. <span class="cline-any cline-no">&nbsp;</span>
  5149. <span class="cline-any cline-neutral">&nbsp;</span>
  5150. <span class="cline-any cline-no">&nbsp;</span>
  5151. <span class="cline-any cline-no">&nbsp;</span>
  5152. <span class="cline-any cline-no">&nbsp;</span>
  5153. <span class="cline-any cline-no">&nbsp;</span>
  5154. <span class="cline-any cline-no">&nbsp;</span>
  5155. <span class="cline-any cline-no">&nbsp;</span>
  5156. <span class="cline-any cline-no">&nbsp;</span>
  5157. <span class="cline-any cline-no">&nbsp;</span>
  5158. <span class="cline-any cline-neutral">&nbsp;</span>
  5159. <span class="cline-any cline-neutral">&nbsp;</span>
  5160. <span class="cline-any cline-no">&nbsp;</span>
  5161. <span class="cline-any cline-no">&nbsp;</span>
  5162. <span class="cline-any cline-no">&nbsp;</span>
  5163. <span class="cline-any cline-no">&nbsp;</span>
  5164. <span class="cline-any cline-no">&nbsp;</span>
  5165. <span class="cline-any cline-neutral">&nbsp;</span>
  5166. <span class="cline-any cline-neutral">&nbsp;</span>
  5167. <span class="cline-any cline-no">&nbsp;</span>
  5168. <span class="cline-any cline-neutral">&nbsp;</span>
  5169. <span class="cline-any cline-neutral">&nbsp;</span>
  5170. <span class="cline-any cline-no">&nbsp;</span>
  5171. <span class="cline-any cline-neutral">&nbsp;</span>
  5172. <span class="cline-any cline-no">&nbsp;</span>
  5173. <span class="cline-any cline-no">&nbsp;</span>
  5174. <span class="cline-any cline-no">&nbsp;</span>
  5175. <span class="cline-any cline-no">&nbsp;</span>
  5176. <span class="cline-any cline-no">&nbsp;</span>
  5177. <span class="cline-any cline-no">&nbsp;</span>
  5178. <span class="cline-any cline-neutral">&nbsp;</span>
  5179. <span class="cline-any cline-neutral">&nbsp;</span>
  5180. <span class="cline-any cline-no">&nbsp;</span>
  5181. <span class="cline-any cline-no">&nbsp;</span>
  5182. <span class="cline-any cline-no">&nbsp;</span>
  5183. <span class="cline-any cline-no">&nbsp;</span>
  5184. <span class="cline-any cline-no">&nbsp;</span>
  5185. <span class="cline-any cline-no">&nbsp;</span>
  5186. <span class="cline-any cline-no">&nbsp;</span>
  5187. <span class="cline-any cline-no">&nbsp;</span>
  5188. <span class="cline-any cline-no">&nbsp;</span>
  5189. <span class="cline-any cline-no">&nbsp;</span>
  5190. <span class="cline-any cline-no">&nbsp;</span>
  5191. <span class="cline-any cline-no">&nbsp;</span>
  5192. <span class="cline-any cline-no">&nbsp;</span>
  5193. <span class="cline-any cline-no">&nbsp;</span>
  5194. <span class="cline-any cline-no">&nbsp;</span>
  5195. <span class="cline-any cline-no">&nbsp;</span>
  5196. <span class="cline-any cline-neutral">&nbsp;</span>
  5197. <span class="cline-any cline-no">&nbsp;</span>
  5198. <span class="cline-any cline-no">&nbsp;</span>
  5199. <span class="cline-any cline-no">&nbsp;</span>
  5200. <span class="cline-any cline-no">&nbsp;</span>
  5201. <span class="cline-any cline-no">&nbsp;</span>
  5202. <span class="cline-any cline-no">&nbsp;</span>
  5203. <span class="cline-any cline-no">&nbsp;</span>
  5204. <span class="cline-any cline-no">&nbsp;</span>
  5205. <span class="cline-any cline-no">&nbsp;</span>
  5206. <span class="cline-any cline-no">&nbsp;</span>
  5207. <span class="cline-any cline-no">&nbsp;</span>
  5208. <span class="cline-any cline-no">&nbsp;</span>
  5209. <span class="cline-any cline-no">&nbsp;</span>
  5210. <span class="cline-any cline-no">&nbsp;</span>
  5211. <span class="cline-any cline-neutral">&nbsp;</span>
  5212. <span class="cline-any cline-neutral">&nbsp;</span>
  5213. <span class="cline-any cline-neutral">&nbsp;</span>
  5214. <span class="cline-any cline-neutral">&nbsp;</span>
  5215. <span class="cline-any cline-neutral">&nbsp;</span>
  5216. <span class="cline-any cline-no">&nbsp;</span>
  5217. <span class="cline-any cline-no">&nbsp;</span>
  5218. <span class="cline-any cline-no">&nbsp;</span>
  5219. <span class="cline-any cline-no">&nbsp;</span>
  5220. <span class="cline-any cline-neutral">&nbsp;</span>
  5221. <span class="cline-any cline-no">&nbsp;</span>
  5222. <span class="cline-any cline-no">&nbsp;</span>
  5223. <span class="cline-any cline-no">&nbsp;</span>
  5224. <span class="cline-any cline-no">&nbsp;</span>
  5225. <span class="cline-any cline-no">&nbsp;</span>
  5226. <span class="cline-any cline-neutral">&nbsp;</span>
  5227. <span class="cline-any cline-neutral">&nbsp;</span>
  5228. <span class="cline-any cline-no">&nbsp;</span>
  5229. <span class="cline-any cline-neutral">&nbsp;</span>
  5230. <span class="cline-any cline-neutral">&nbsp;</span>
  5231. <span class="cline-any cline-no">&nbsp;</span>
  5232. <span class="cline-any cline-no">&nbsp;</span>
  5233. <span class="cline-any cline-no">&nbsp;</span>
  5234. <span class="cline-any cline-neutral">&nbsp;</span>
  5235. <span class="cline-any cline-no">&nbsp;</span>
  5236. <span class="cline-any cline-no">&nbsp;</span>
  5237. <span class="cline-any cline-no">&nbsp;</span>
  5238. <span class="cline-any cline-no">&nbsp;</span>
  5239. <span class="cline-any cline-neutral">&nbsp;</span>
  5240. <span class="cline-any cline-neutral">&nbsp;</span>
  5241. <span class="cline-any cline-no">&nbsp;</span>
  5242. <span class="cline-any cline-neutral">&nbsp;</span>
  5243. <span class="cline-any cline-neutral">&nbsp;</span>
  5244. <span class="cline-any cline-no">&nbsp;</span>
  5245. <span class="cline-any cline-neutral">&nbsp;</span>
  5246. <span class="cline-any cline-no">&nbsp;</span>
  5247. <span class="cline-any cline-neutral">&nbsp;</span>
  5248. <span class="cline-any cline-no">&nbsp;</span>
  5249. <span class="cline-any cline-no">&nbsp;</span>
  5250. <span class="cline-any cline-no">&nbsp;</span>
  5251. <span class="cline-any cline-no">&nbsp;</span>
  5252. <span class="cline-any cline-neutral">&nbsp;</span>
  5253. <span class="cline-any cline-no">&nbsp;</span>
  5254. <span class="cline-any cline-no">&nbsp;</span>
  5255. <span class="cline-any cline-no">&nbsp;</span>
  5256. <span class="cline-any cline-no">&nbsp;</span>
  5257. <span class="cline-any cline-no">&nbsp;</span>
  5258. <span class="cline-any cline-no">&nbsp;</span>
  5259. <span class="cline-any cline-no">&nbsp;</span>
  5260. <span class="cline-any cline-no">&nbsp;</span>
  5261. <span class="cline-any cline-no">&nbsp;</span>
  5262. <span class="cline-any cline-no">&nbsp;</span>
  5263. <span class="cline-any cline-no">&nbsp;</span>
  5264. <span class="cline-any cline-neutral">&nbsp;</span>
  5265. <span class="cline-any cline-no">&nbsp;</span>
  5266. <span class="cline-any cline-neutral">&nbsp;</span>
  5267. <span class="cline-any cline-neutral">&nbsp;</span>
  5268. <span class="cline-any cline-no">&nbsp;</span>
  5269. <span class="cline-any cline-no">&nbsp;</span>
  5270. <span class="cline-any cline-neutral">&nbsp;</span>
  5271. <span class="cline-any cline-no">&nbsp;</span>
  5272. <span class="cline-any cline-neutral">&nbsp;</span>
  5273. <span class="cline-any cline-no">&nbsp;</span>
  5274. <span class="cline-any cline-neutral">&nbsp;</span>
  5275. <span class="cline-any cline-neutral">&nbsp;</span>
  5276. <span class="cline-any cline-no">&nbsp;</span>
  5277. <span class="cline-any cline-no">&nbsp;</span>
  5278. <span class="cline-any cline-no">&nbsp;</span>
  5279. <span class="cline-any cline-neutral">&nbsp;</span>
  5280. <span class="cline-any cline-neutral">&nbsp;</span>
  5281. <span class="cline-any cline-no">&nbsp;</span>
  5282. <span class="cline-any cline-no">&nbsp;</span>
  5283. <span class="cline-any cline-no">&nbsp;</span>
  5284. <span class="cline-any cline-no">&nbsp;</span>
  5285. <span class="cline-any cline-no">&nbsp;</span>
  5286. <span class="cline-any cline-neutral">&nbsp;</span>
  5287. <span class="cline-any cline-no">&nbsp;</span>
  5288. <span class="cline-any cline-no">&nbsp;</span>
  5289. <span class="cline-any cline-no">&nbsp;</span>
  5290. <span class="cline-any cline-no">&nbsp;</span>
  5291. <span class="cline-any cline-no">&nbsp;</span>
  5292. <span class="cline-any cline-neutral">&nbsp;</span>
  5293. <span class="cline-any cline-no">&nbsp;</span>
  5294. <span class="cline-any cline-neutral">&nbsp;</span>
  5295. <span class="cline-any cline-neutral">&nbsp;</span>
  5296. <span class="cline-any cline-no">&nbsp;</span>
  5297. <span class="cline-any cline-neutral">&nbsp;</span>
  5298. <span class="cline-any cline-no">&nbsp;</span>
  5299. <span class="cline-any cline-no">&nbsp;</span>
  5300. <span class="cline-any cline-no">&nbsp;</span>
  5301. <span class="cline-any cline-no">&nbsp;</span>
  5302. <span class="cline-any cline-no">&nbsp;</span>
  5303. <span class="cline-any cline-no">&nbsp;</span>
  5304. <span class="cline-any cline-no">&nbsp;</span>
  5305. <span class="cline-any cline-no">&nbsp;</span>
  5306. <span class="cline-any cline-no">&nbsp;</span>
  5307. <span class="cline-any cline-no">&nbsp;</span>
  5308. <span class="cline-any cline-no">&nbsp;</span>
  5309. <span class="cline-any cline-no">&nbsp;</span>
  5310. <span class="cline-any cline-no">&nbsp;</span>
  5311. <span class="cline-any cline-no">&nbsp;</span>
  5312. <span class="cline-any cline-no">&nbsp;</span>
  5313. <span class="cline-any cline-neutral">&nbsp;</span>
  5314. <span class="cline-any cline-no">&nbsp;</span>
  5315. <span class="cline-any cline-no">&nbsp;</span>
  5316. <span class="cline-any cline-no">&nbsp;</span>
  5317. <span class="cline-any cline-no">&nbsp;</span>
  5318. <span class="cline-any cline-no">&nbsp;</span>
  5319. <span class="cline-any cline-no">&nbsp;</span>
  5320. <span class="cline-any cline-no">&nbsp;</span>
  5321. <span class="cline-any cline-no">&nbsp;</span>
  5322. <span class="cline-any cline-no">&nbsp;</span>
  5323. <span class="cline-any cline-no">&nbsp;</span>
  5324. <span class="cline-any cline-no">&nbsp;</span>
  5325. <span class="cline-any cline-no">&nbsp;</span>
  5326. <span class="cline-any cline-no">&nbsp;</span>
  5327. <span class="cline-any cline-no">&nbsp;</span>
  5328. <span class="cline-any cline-no">&nbsp;</span>
  5329. <span class="cline-any cline-neutral">&nbsp;</span>
  5330. <span class="cline-any cline-neutral">&nbsp;</span>
  5331. <span class="cline-any cline-neutral">&nbsp;</span>
  5332. <span class="cline-any cline-neutral">&nbsp;</span>
  5333. <span class="cline-any cline-neutral">&nbsp;</span>
  5334. <span class="cline-any cline-no">&nbsp;</span>
  5335. <span class="cline-any cline-no">&nbsp;</span>
  5336. <span class="cline-any cline-no">&nbsp;</span>
  5337. <span class="cline-any cline-no">&nbsp;</span>
  5338. <span class="cline-any cline-neutral">&nbsp;</span>
  5339. <span class="cline-any cline-no">&nbsp;</span>
  5340. <span class="cline-any cline-no">&nbsp;</span>
  5341. <span class="cline-any cline-no">&nbsp;</span>
  5342. <span class="cline-any cline-no">&nbsp;</span>
  5343. <span class="cline-any cline-no">&nbsp;</span>
  5344. <span class="cline-any cline-neutral">&nbsp;</span>
  5345. <span class="cline-any cline-neutral">&nbsp;</span>
  5346. <span class="cline-any cline-no">&nbsp;</span>
  5347. <span class="cline-any cline-neutral">&nbsp;</span>
  5348. <span class="cline-any cline-neutral">&nbsp;</span>
  5349. <span class="cline-any cline-no">&nbsp;</span>
  5350. <span class="cline-any cline-no">&nbsp;</span>
  5351. <span class="cline-any cline-no">&nbsp;</span>
  5352. <span class="cline-any cline-neutral">&nbsp;</span>
  5353. <span class="cline-any cline-no">&nbsp;</span>
  5354. <span class="cline-any cline-no">&nbsp;</span>
  5355. <span class="cline-any cline-no">&nbsp;</span>
  5356. <span class="cline-any cline-no">&nbsp;</span>
  5357. <span class="cline-any cline-neutral">&nbsp;</span>
  5358. <span class="cline-any cline-neutral">&nbsp;</span>
  5359. <span class="cline-any cline-no">&nbsp;</span>
  5360. <span class="cline-any cline-neutral">&nbsp;</span>
  5361. <span class="cline-any cline-neutral">&nbsp;</span>
  5362. <span class="cline-any cline-no">&nbsp;</span>
  5363. <span class="cline-any cline-neutral">&nbsp;</span>
  5364. <span class="cline-any cline-no">&nbsp;</span>
  5365. <span class="cline-any cline-no">&nbsp;</span>
  5366. <span class="cline-any cline-no">&nbsp;</span>
  5367. <span class="cline-any cline-no">&nbsp;</span>
  5368. <span class="cline-any cline-neutral">&nbsp;</span>
  5369. <span class="cline-any cline-no">&nbsp;</span>
  5370. <span class="cline-any cline-no">&nbsp;</span>
  5371. <span class="cline-any cline-no">&nbsp;</span>
  5372. <span class="cline-any cline-no">&nbsp;</span>
  5373. <span class="cline-any cline-no">&nbsp;</span>
  5374. <span class="cline-any cline-no">&nbsp;</span>
  5375. <span class="cline-any cline-no">&nbsp;</span>
  5376. <span class="cline-any cline-no">&nbsp;</span>
  5377. <span class="cline-any cline-no">&nbsp;</span>
  5378. <span class="cline-any cline-no">&nbsp;</span>
  5379. <span class="cline-any cline-no">&nbsp;</span>
  5380. <span class="cline-any cline-neutral">&nbsp;</span>
  5381. <span class="cline-any cline-neutral">&nbsp;</span>
  5382. <span class="cline-any cline-no">&nbsp;</span>
  5383. <span class="cline-any cline-no">&nbsp;</span>
  5384. <span class="cline-any cline-no">&nbsp;</span>
  5385. <span class="cline-any cline-no">&nbsp;</span>
  5386. <span class="cline-any cline-no">&nbsp;</span>
  5387. <span class="cline-any cline-no">&nbsp;</span>
  5388. <span class="cline-any cline-no">&nbsp;</span>
  5389. <span class="cline-any cline-no">&nbsp;</span>
  5390. <span class="cline-any cline-no">&nbsp;</span>
  5391. <span class="cline-any cline-neutral">&nbsp;</span>
  5392. <span class="cline-any cline-neutral">&nbsp;</span>
  5393. <span class="cline-any cline-no">&nbsp;</span>
  5394. <span class="cline-any cline-no">&nbsp;</span>
  5395. <span class="cline-any cline-no">&nbsp;</span>
  5396. <span class="cline-any cline-neutral">&nbsp;</span>
  5397. <span class="cline-any cline-no">&nbsp;</span>
  5398. <span class="cline-any cline-no">&nbsp;</span>
  5399. <span class="cline-any cline-no">&nbsp;</span>
  5400. <span class="cline-any cline-no">&nbsp;</span>
  5401. <span class="cline-any cline-no">&nbsp;</span>
  5402. <span class="cline-any cline-no">&nbsp;</span>
  5403. <span class="cline-any cline-neutral">&nbsp;</span>
  5404. <span class="cline-any cline-no">&nbsp;</span>
  5405. <span class="cline-any cline-no">&nbsp;</span>
  5406. <span class="cline-any cline-no">&nbsp;</span>
  5407. <span class="cline-any cline-no">&nbsp;</span>
  5408. <span class="cline-any cline-no">&nbsp;</span>
  5409. <span class="cline-any cline-no">&nbsp;</span>
  5410. <span class="cline-any cline-no">&nbsp;</span>
  5411. <span class="cline-any cline-neutral">&nbsp;</span>
  5412. <span class="cline-any cline-neutral">&nbsp;</span>
  5413. <span class="cline-any cline-no">&nbsp;</span>
  5414. <span class="cline-any cline-no">&nbsp;</span>
  5415. <span class="cline-any cline-no">&nbsp;</span>
  5416. <span class="cline-any cline-no">&nbsp;</span>
  5417. <span class="cline-any cline-no">&nbsp;</span>
  5418. <span class="cline-any cline-neutral">&nbsp;</span>
  5419. <span class="cline-any cline-no">&nbsp;</span>
  5420. <span class="cline-any cline-neutral">&nbsp;</span>
  5421. <span class="cline-any cline-neutral">&nbsp;</span>
  5422. <span class="cline-any cline-no">&nbsp;</span>
  5423. <span class="cline-any cline-no">&nbsp;</span>
  5424. <span class="cline-any cline-no">&nbsp;</span>
  5425. <span class="cline-any cline-no">&nbsp;</span>
  5426. <span class="cline-any cline-neutral">&nbsp;</span>
  5427. <span class="cline-any cline-no">&nbsp;</span>
  5428. <span class="cline-any cline-no">&nbsp;</span>
  5429. <span class="cline-any cline-no">&nbsp;</span>
  5430. <span class="cline-any cline-neutral">&nbsp;</span>
  5431. <span class="cline-any cline-no">&nbsp;</span>
  5432. <span class="cline-any cline-no">&nbsp;</span>
  5433. <span class="cline-any cline-no">&nbsp;</span>
  5434. <span class="cline-any cline-no">&nbsp;</span>
  5435. <span class="cline-any cline-no">&nbsp;</span>
  5436. <span class="cline-any cline-no">&nbsp;</span>
  5437. <span class="cline-any cline-no">&nbsp;</span>
  5438. <span class="cline-any cline-no">&nbsp;</span>
  5439. <span class="cline-any cline-neutral">&nbsp;</span>
  5440. <span class="cline-any cline-no">&nbsp;</span>
  5441. <span class="cline-any cline-no">&nbsp;</span>
  5442. <span class="cline-any cline-no">&nbsp;</span>
  5443. <span class="cline-any cline-no">&nbsp;</span>
  5444. <span class="cline-any cline-no">&nbsp;</span>
  5445. <span class="cline-any cline-no">&nbsp;</span>
  5446. <span class="cline-any cline-no">&nbsp;</span>
  5447. <span class="cline-any cline-no">&nbsp;</span>
  5448. <span class="cline-any cline-no">&nbsp;</span>
  5449. <span class="cline-any cline-no">&nbsp;</span>
  5450. <span class="cline-any cline-no">&nbsp;</span>
  5451. <span class="cline-any cline-no">&nbsp;</span>
  5452. <span class="cline-any cline-no">&nbsp;</span>
  5453. <span class="cline-any cline-no">&nbsp;</span>
  5454. <span class="cline-any cline-neutral">&nbsp;</span>
  5455. <span class="cline-any cline-neutral">&nbsp;</span>
  5456. <span class="cline-any cline-neutral">&nbsp;</span>
  5457. <span class="cline-any cline-neutral">&nbsp;</span>
  5458. <span class="cline-any cline-neutral">&nbsp;</span>
  5459. <span class="cline-any cline-no">&nbsp;</span>
  5460. <span class="cline-any cline-no">&nbsp;</span>
  5461. <span class="cline-any cline-no">&nbsp;</span>
  5462. <span class="cline-any cline-no">&nbsp;</span>
  5463. <span class="cline-any cline-neutral">&nbsp;</span>
  5464. <span class="cline-any cline-no">&nbsp;</span>
  5465. <span class="cline-any cline-no">&nbsp;</span>
  5466. <span class="cline-any cline-no">&nbsp;</span>
  5467. <span class="cline-any cline-no">&nbsp;</span>
  5468. <span class="cline-any cline-no">&nbsp;</span>
  5469. <span class="cline-any cline-neutral">&nbsp;</span>
  5470. <span class="cline-any cline-neutral">&nbsp;</span>
  5471. <span class="cline-any cline-no">&nbsp;</span>
  5472. <span class="cline-any cline-neutral">&nbsp;</span>
  5473. <span class="cline-any cline-neutral">&nbsp;</span>
  5474. <span class="cline-any cline-no">&nbsp;</span>
  5475. <span class="cline-any cline-no">&nbsp;</span>
  5476. <span class="cline-any cline-no">&nbsp;</span>
  5477. <span class="cline-any cline-neutral">&nbsp;</span>
  5478. <span class="cline-any cline-no">&nbsp;</span>
  5479. <span class="cline-any cline-no">&nbsp;</span>
  5480. <span class="cline-any cline-no">&nbsp;</span>
  5481. <span class="cline-any cline-no">&nbsp;</span>
  5482. <span class="cline-any cline-neutral">&nbsp;</span>
  5483. <span class="cline-any cline-neutral">&nbsp;</span>
  5484. <span class="cline-any cline-no">&nbsp;</span>
  5485. <span class="cline-any cline-neutral">&nbsp;</span>
  5486. <span class="cline-any cline-neutral">&nbsp;</span>
  5487. <span class="cline-any cline-no">&nbsp;</span>
  5488. <span class="cline-any cline-neutral">&nbsp;</span>
  5489. <span class="cline-any cline-no">&nbsp;</span>
  5490. <span class="cline-any cline-no">&nbsp;</span>
  5491. <span class="cline-any cline-no">&nbsp;</span>
  5492. <span class="cline-any cline-no">&nbsp;</span>
  5493. <span class="cline-any cline-neutral">&nbsp;</span>
  5494. <span class="cline-any cline-no">&nbsp;</span>
  5495. <span class="cline-any cline-no">&nbsp;</span>
  5496. <span class="cline-any cline-no">&nbsp;</span>
  5497. <span class="cline-any cline-no">&nbsp;</span>
  5498. <span class="cline-any cline-no">&nbsp;</span>
  5499. <span class="cline-any cline-no">&nbsp;</span>
  5500. <span class="cline-any cline-no">&nbsp;</span>
  5501. <span class="cline-any cline-no">&nbsp;</span>
  5502. <span class="cline-any cline-no">&nbsp;</span>
  5503. <span class="cline-any cline-no">&nbsp;</span>
  5504. <span class="cline-any cline-no">&nbsp;</span>
  5505. <span class="cline-any cline-neutral">&nbsp;</span>
  5506. <span class="cline-any cline-neutral">&nbsp;</span>
  5507. <span class="cline-any cline-no">&nbsp;</span>
  5508. <span class="cline-any cline-no">&nbsp;</span>
  5509. <span class="cline-any cline-no">&nbsp;</span>
  5510. <span class="cline-any cline-no">&nbsp;</span>
  5511. <span class="cline-any cline-no">&nbsp;</span>
  5512. <span class="cline-any cline-no">&nbsp;</span>
  5513. <span class="cline-any cline-no">&nbsp;</span>
  5514. <span class="cline-any cline-no">&nbsp;</span>
  5515. <span class="cline-any cline-no">&nbsp;</span>
  5516. <span class="cline-any cline-neutral">&nbsp;</span>
  5517. <span class="cline-any cline-neutral">&nbsp;</span>
  5518. <span class="cline-any cline-no">&nbsp;</span>
  5519. <span class="cline-any cline-no">&nbsp;</span>
  5520. <span class="cline-any cline-no">&nbsp;</span>
  5521. <span class="cline-any cline-no">&nbsp;</span>
  5522. <span class="cline-any cline-neutral">&nbsp;</span>
  5523. <span class="cline-any cline-no">&nbsp;</span>
  5524. <span class="cline-any cline-neutral">&nbsp;</span>
  5525. <span class="cline-any cline-no">&nbsp;</span>
  5526. <span class="cline-any cline-no">&nbsp;</span>
  5527. <span class="cline-any cline-neutral">&nbsp;</span>
  5528. <span class="cline-any cline-no">&nbsp;</span>
  5529. <span class="cline-any cline-no">&nbsp;</span>
  5530. <span class="cline-any cline-no">&nbsp;</span>
  5531. <span class="cline-any cline-no">&nbsp;</span>
  5532. <span class="cline-any cline-no">&nbsp;</span>
  5533. <span class="cline-any cline-neutral">&nbsp;</span>
  5534. <span class="cline-any cline-no">&nbsp;</span>
  5535. <span class="cline-any cline-neutral">&nbsp;</span>
  5536. <span class="cline-any cline-no">&nbsp;</span>
  5537. <span class="cline-any cline-no">&nbsp;</span>
  5538. <span class="cline-any cline-no">&nbsp;</span>
  5539. <span class="cline-any cline-neutral">&nbsp;</span>
  5540. <span class="cline-any cline-no">&nbsp;</span>
  5541. <span class="cline-any cline-no">&nbsp;</span>
  5542. <span class="cline-any cline-no">&nbsp;</span>
  5543. <span class="cline-any cline-no">&nbsp;</span>
  5544. <span class="cline-any cline-no">&nbsp;</span>
  5545. <span class="cline-any cline-neutral">&nbsp;</span>
  5546. <span class="cline-any cline-no">&nbsp;</span>
  5547. <span class="cline-any cline-no">&nbsp;</span>
  5548. <span class="cline-any cline-no">&nbsp;</span>
  5549. <span class="cline-any cline-no">&nbsp;</span>
  5550. <span class="cline-any cline-neutral">&nbsp;</span>
  5551. <span class="cline-any cline-no">&nbsp;</span>
  5552. <span class="cline-any cline-no">&nbsp;</span>
  5553. <span class="cline-any cline-no">&nbsp;</span>
  5554. <span class="cline-any cline-no">&nbsp;</span>
  5555. <span class="cline-any cline-no">&nbsp;</span>
  5556. <span class="cline-any cline-no">&nbsp;</span>
  5557. <span class="cline-any cline-no">&nbsp;</span>
  5558. <span class="cline-any cline-no">&nbsp;</span>
  5559. <span class="cline-any cline-no">&nbsp;</span>
  5560. <span class="cline-any cline-no">&nbsp;</span>
  5561. <span class="cline-any cline-no">&nbsp;</span>
  5562. <span class="cline-any cline-no">&nbsp;</span>
  5563. <span class="cline-any cline-no">&nbsp;</span>
  5564. <span class="cline-any cline-no">&nbsp;</span>
  5565. <span class="cline-any cline-neutral">&nbsp;</span>
  5566. <span class="cline-any cline-neutral">&nbsp;</span>
  5567. <span class="cline-any cline-neutral">&nbsp;</span>
  5568. <span class="cline-any cline-neutral">&nbsp;</span>
  5569. <span class="cline-any cline-no">&nbsp;</span>
  5570. <span class="cline-any cline-no">&nbsp;</span>
  5571. <span class="cline-any cline-neutral">&nbsp;</span>
  5572. <span class="cline-any cline-no">&nbsp;</span>
  5573. <span class="cline-any cline-no">&nbsp;</span>
  5574. <span class="cline-any cline-neutral">&nbsp;</span>
  5575. <span class="cline-any cline-neutral">&nbsp;</span>
  5576. <span class="cline-any cline-no">&nbsp;</span>
  5577. <span class="cline-any cline-neutral">&nbsp;</span>
  5578. <span class="cline-any cline-neutral">&nbsp;</span>
  5579. <span class="cline-any cline-no">&nbsp;</span>
  5580. <span class="cline-any cline-no">&nbsp;</span>
  5581. <span class="cline-any cline-neutral">&nbsp;</span>
  5582. <span class="cline-any cline-neutral">&nbsp;</span>
  5583. <span class="cline-any cline-no">&nbsp;</span>
  5584. <span class="cline-any cline-no">&nbsp;</span>
  5585. <span class="cline-any cline-no">&nbsp;</span>
  5586. <span class="cline-any cline-neutral">&nbsp;</span>
  5587. <span class="cline-any cline-no">&nbsp;</span>
  5588. <span class="cline-any cline-no">&nbsp;</span>
  5589. <span class="cline-any cline-neutral">&nbsp;</span>
  5590. <span class="cline-any cline-neutral">&nbsp;</span>
  5591. <span class="cline-any cline-no">&nbsp;</span>
  5592. <span class="cline-any cline-no">&nbsp;</span>
  5593. <span class="cline-any cline-no">&nbsp;</span>
  5594. <span class="cline-any cline-no">&nbsp;</span>
  5595. <span class="cline-any cline-no">&nbsp;</span>
  5596. <span class="cline-any cline-no">&nbsp;</span>
  5597. <span class="cline-any cline-no">&nbsp;</span>
  5598. <span class="cline-any cline-no">&nbsp;</span>
  5599. <span class="cline-any cline-no">&nbsp;</span>
  5600. <span class="cline-any cline-neutral">&nbsp;</span>
  5601. <span class="cline-any cline-no">&nbsp;</span>
  5602. <span class="cline-any cline-no">&nbsp;</span>
  5603. <span class="cline-any cline-no">&nbsp;</span>
  5604. <span class="cline-any cline-neutral">&nbsp;</span>
  5605. <span class="cline-any cline-no">&nbsp;</span>
  5606. <span class="cline-any cline-neutral">&nbsp;</span>
  5607. <span class="cline-any cline-no">&nbsp;</span>
  5608. <span class="cline-any cline-no">&nbsp;</span>
  5609. <span class="cline-any cline-no">&nbsp;</span>
  5610. <span class="cline-any cline-neutral">&nbsp;</span>
  5611. <span class="cline-any cline-no">&nbsp;</span>
  5612. <span class="cline-any cline-no">&nbsp;</span>
  5613. <span class="cline-any cline-no">&nbsp;</span>
  5614. <span class="cline-any cline-no">&nbsp;</span>
  5615. <span class="cline-any cline-no">&nbsp;</span>
  5616. <span class="cline-any cline-no">&nbsp;</span>
  5617. <span class="cline-any cline-no">&nbsp;</span>
  5618. <span class="cline-any cline-no">&nbsp;</span>
  5619. <span class="cline-any cline-no">&nbsp;</span>
  5620. <span class="cline-any cline-neutral">&nbsp;</span>
  5621. <span class="cline-any cline-neutral">&nbsp;</span>
  5622. <span class="cline-any cline-no">&nbsp;</span>
  5623. <span class="cline-any cline-no">&nbsp;</span>
  5624. <span class="cline-any cline-neutral">&nbsp;</span>
  5625. <span class="cline-any cline-neutral">&nbsp;</span>
  5626. <span class="cline-any cline-neutral">&nbsp;</span>
  5627. <span class="cline-any cline-no">&nbsp;</span>
  5628. <span class="cline-any cline-no">&nbsp;</span>
  5629. <span class="cline-any cline-neutral">&nbsp;</span>
  5630. <span class="cline-any cline-no">&nbsp;</span>
  5631. <span class="cline-any cline-no">&nbsp;</span>
  5632. <span class="cline-any cline-no">&nbsp;</span>
  5633. <span class="cline-any cline-no">&nbsp;</span>
  5634. <span class="cline-any cline-no">&nbsp;</span>
  5635. <span class="cline-any cline-no">&nbsp;</span>
  5636. <span class="cline-any cline-no">&nbsp;</span>
  5637. <span class="cline-any cline-neutral">&nbsp;</span>
  5638. <span class="cline-any cline-no">&nbsp;</span>
  5639. <span class="cline-any cline-no">&nbsp;</span>
  5640. <span class="cline-any cline-no">&nbsp;</span>
  5641. <span class="cline-any cline-no">&nbsp;</span>
  5642. <span class="cline-any cline-no">&nbsp;</span>
  5643. <span class="cline-any cline-no">&nbsp;</span>
  5644. <span class="cline-any cline-neutral">&nbsp;</span>
  5645. <span class="cline-any cline-neutral">&nbsp;</span>
  5646. <span class="cline-any cline-no">&nbsp;</span>
  5647. <span class="cline-any cline-neutral">&nbsp;</span>
  5648. <span class="cline-any cline-neutral">&nbsp;</span>
  5649. <span class="cline-any cline-no">&nbsp;</span>
  5650. <span class="cline-any cline-no">&nbsp;</span>
  5651. <span class="cline-any cline-no">&nbsp;</span>
  5652. <span class="cline-any cline-no">&nbsp;</span>
  5653. <span class="cline-any cline-no">&nbsp;</span>
  5654. <span class="cline-any cline-neutral">&nbsp;</span>
  5655. <span class="cline-any cline-neutral">&nbsp;</span>
  5656. <span class="cline-any cline-no">&nbsp;</span>
  5657. <span class="cline-any cline-no">&nbsp;</span>
  5658. <span class="cline-any cline-neutral">&nbsp;</span>
  5659. <span class="cline-any cline-no">&nbsp;</span>
  5660. <span class="cline-any cline-no">&nbsp;</span>
  5661. <span class="cline-any cline-no">&nbsp;</span>
  5662. <span class="cline-any cline-no">&nbsp;</span>
  5663. <span class="cline-any cline-no">&nbsp;</span>
  5664. <span class="cline-any cline-neutral">&nbsp;</span>
  5665. <span class="cline-any cline-neutral">&nbsp;</span>
  5666. <span class="cline-any cline-neutral">&nbsp;</span>
  5667. <span class="cline-any cline-neutral">&nbsp;</span>
  5668. <span class="cline-any cline-neutral">&nbsp;</span>
  5669. <span class="cline-any cline-no">&nbsp;</span>
  5670. <span class="cline-any cline-no">&nbsp;</span>
  5671. <span class="cline-any cline-no">&nbsp;</span>
  5672. <span class="cline-any cline-no">&nbsp;</span>
  5673. <span class="cline-any cline-no">&nbsp;</span>
  5674. <span class="cline-any cline-no">&nbsp;</span>
  5675. <span class="cline-any cline-no">&nbsp;</span>
  5676. <span class="cline-any cline-no">&nbsp;</span>
  5677. <span class="cline-any cline-neutral">&nbsp;</span>
  5678. <span class="cline-any cline-neutral">&nbsp;</span>
  5679. <span class="cline-any cline-no">&nbsp;</span>
  5680. <span class="cline-any cline-no">&nbsp;</span>
  5681. <span class="cline-any cline-no">&nbsp;</span>
  5682. <span class="cline-any cline-no">&nbsp;</span>
  5683. <span class="cline-any cline-no">&nbsp;</span>
  5684. <span class="cline-any cline-neutral">&nbsp;</span>
  5685. <span class="cline-any cline-no">&nbsp;</span>
  5686. <span class="cline-any cline-no">&nbsp;</span>
  5687. <span class="cline-any cline-neutral">&nbsp;</span>
  5688. <span class="cline-any cline-no">&nbsp;</span>
  5689. <span class="cline-any cline-no">&nbsp;</span>
  5690. <span class="cline-any cline-no">&nbsp;</span>
  5691. <span class="cline-any cline-no">&nbsp;</span>
  5692. <span class="cline-any cline-no">&nbsp;</span>
  5693. <span class="cline-any cline-no">&nbsp;</span>
  5694. <span class="cline-any cline-no">&nbsp;</span>
  5695. <span class="cline-any cline-no">&nbsp;</span>
  5696. <span class="cline-any cline-no">&nbsp;</span>
  5697. <span class="cline-any cline-no">&nbsp;</span>
  5698. <span class="cline-any cline-no">&nbsp;</span>
  5699. <span class="cline-any cline-no">&nbsp;</span>
  5700. <span class="cline-any cline-neutral">&nbsp;</span>
  5701. <span class="cline-any cline-neutral">&nbsp;</span>
  5702. <span class="cline-any cline-neutral">&nbsp;</span>
  5703. <span class="cline-any cline-neutral">&nbsp;</span>
  5704. <span class="cline-any cline-neutral">&nbsp;</span>
  5705. <span class="cline-any cline-neutral">&nbsp;</span>
  5706. <span class="cline-any cline-neutral">&nbsp;</span>
  5707. <span class="cline-any cline-neutral">&nbsp;</span>
  5708. <span class="cline-any cline-no">&nbsp;</span>
  5709. <span class="cline-any cline-no">&nbsp;</span>
  5710. <span class="cline-any cline-no">&nbsp;</span>
  5711. <span class="cline-any cline-no">&nbsp;</span>
  5712. <span class="cline-any cline-no">&nbsp;</span>
  5713. <span class="cline-any cline-no">&nbsp;</span>
  5714. <span class="cline-any cline-no">&nbsp;</span>
  5715. <span class="cline-any cline-no">&nbsp;</span>
  5716. <span class="cline-any cline-no">&nbsp;</span>
  5717. <span class="cline-any cline-no">&nbsp;</span>
  5718. <span class="cline-any cline-neutral">&nbsp;</span>
  5719. <span class="cline-any cline-neutral">&nbsp;</span>
  5720. <span class="cline-any cline-no">&nbsp;</span>
  5721. <span class="cline-any cline-no">&nbsp;</span>
  5722. <span class="cline-any cline-no">&nbsp;</span>
  5723. <span class="cline-any cline-no">&nbsp;</span>
  5724. <span class="cline-any cline-neutral">&nbsp;</span>
  5725. <span class="cline-any cline-neutral">&nbsp;</span>
  5726. <span class="cline-any cline-no">&nbsp;</span>
  5727. <span class="cline-any cline-no">&nbsp;</span>
  5728. <span class="cline-any cline-no">&nbsp;</span>
  5729. <span class="cline-any cline-no">&nbsp;</span>
  5730. <span class="cline-any cline-no">&nbsp;</span>
  5731. <span class="cline-any cline-no">&nbsp;</span>
  5732. <span class="cline-any cline-no">&nbsp;</span>
  5733. <span class="cline-any cline-no">&nbsp;</span>
  5734. <span class="cline-any cline-no">&nbsp;</span>
  5735. <span class="cline-any cline-no">&nbsp;</span>
  5736. <span class="cline-any cline-no">&nbsp;</span>
  5737. <span class="cline-any cline-no">&nbsp;</span>
  5738. <span class="cline-any cline-no">&nbsp;</span>
  5739. <span class="cline-any cline-no">&nbsp;</span>
  5740. <span class="cline-any cline-neutral">&nbsp;</span>
  5741. <span class="cline-any cline-no">&nbsp;</span>
  5742. <span class="cline-any cline-neutral">&nbsp;</span>
  5743. <span class="cline-any cline-neutral">&nbsp;</span>
  5744. <span class="cline-any cline-no">&nbsp;</span>
  5745. <span class="cline-any cline-no">&nbsp;</span>
  5746. <span class="cline-any cline-no">&nbsp;</span>
  5747. <span class="cline-any cline-no">&nbsp;</span>
  5748. <span class="cline-any cline-no">&nbsp;</span>
  5749. <span class="cline-any cline-no">&nbsp;</span>
  5750. <span class="cline-any cline-no">&nbsp;</span>
  5751. <span class="cline-any cline-no">&nbsp;</span>
  5752. <span class="cline-any cline-no">&nbsp;</span>
  5753. <span class="cline-any cline-no">&nbsp;</span>
  5754. <span class="cline-any cline-no">&nbsp;</span>
  5755. <span class="cline-any cline-no">&nbsp;</span>
  5756. <span class="cline-any cline-no">&nbsp;</span>
  5757. <span class="cline-any cline-no">&nbsp;</span>
  5758. <span class="cline-any cline-no">&nbsp;</span>
  5759. <span class="cline-any cline-no">&nbsp;</span>
  5760. <span class="cline-any cline-no">&nbsp;</span>
  5761. <span class="cline-any cline-neutral">&nbsp;</span>
  5762. <span class="cline-any cline-no">&nbsp;</span>
  5763. <span class="cline-any cline-no">&nbsp;</span>
  5764. <span class="cline-any cline-no">&nbsp;</span>
  5765. <span class="cline-any cline-no">&nbsp;</span>
  5766. <span class="cline-any cline-no">&nbsp;</span>
  5767. <span class="cline-any cline-no">&nbsp;</span>
  5768. <span class="cline-any cline-no">&nbsp;</span>
  5769. <span class="cline-any cline-no">&nbsp;</span>
  5770. <span class="cline-any cline-no">&nbsp;</span>
  5771. <span class="cline-any cline-no">&nbsp;</span>
  5772. <span class="cline-any cline-no">&nbsp;</span>
  5773. <span class="cline-any cline-neutral">&nbsp;</span>
  5774. <span class="cline-any cline-neutral">&nbsp;</span>
  5775. <span class="cline-any cline-neutral">&nbsp;</span>
  5776. <span class="cline-any cline-neutral">&nbsp;</span>
  5777. <span class="cline-any cline-neutral">&nbsp;</span>
  5778. <span class="cline-any cline-no">&nbsp;</span>
  5779. <span class="cline-any cline-no">&nbsp;</span>
  5780. <span class="cline-any cline-no">&nbsp;</span>
  5781. <span class="cline-any cline-no">&nbsp;</span>
  5782. <span class="cline-any cline-no">&nbsp;</span>
  5783. <span class="cline-any cline-no">&nbsp;</span>
  5784. <span class="cline-any cline-no">&nbsp;</span>
  5785. <span class="cline-any cline-no">&nbsp;</span>
  5786. <span class="cline-any cline-no">&nbsp;</span>
  5787. <span class="cline-any cline-neutral">&nbsp;</span>
  5788. <span class="cline-any cline-no">&nbsp;</span>
  5789. <span class="cline-any cline-neutral">&nbsp;</span>
  5790. <span class="cline-any cline-no">&nbsp;</span>
  5791. <span class="cline-any cline-no">&nbsp;</span>
  5792. <span class="cline-any cline-no">&nbsp;</span>
  5793. <span class="cline-any cline-no">&nbsp;</span>
  5794. <span class="cline-any cline-neutral">&nbsp;</span>
  5795. <span class="cline-any cline-no">&nbsp;</span>
  5796. <span class="cline-any cline-no">&nbsp;</span>
  5797. <span class="cline-any cline-no">&nbsp;</span>
  5798. <span class="cline-any cline-no">&nbsp;</span>
  5799. <span class="cline-any cline-no">&nbsp;</span>
  5800. <span class="cline-any cline-no">&nbsp;</span>
  5801. <span class="cline-any cline-no">&nbsp;</span>
  5802. <span class="cline-any cline-no">&nbsp;</span>
  5803. <span class="cline-any cline-neutral">&nbsp;</span>
  5804. <span class="cline-any cline-no">&nbsp;</span>
  5805. <span class="cline-any cline-no">&nbsp;</span>
  5806. <span class="cline-any cline-no">&nbsp;</span>
  5807. <span class="cline-any cline-no">&nbsp;</span>
  5808. <span class="cline-any cline-no">&nbsp;</span>
  5809. <span class="cline-any cline-no">&nbsp;</span>
  5810. <span class="cline-any cline-no">&nbsp;</span>
  5811. <span class="cline-any cline-neutral">&nbsp;</span>
  5812. <span class="cline-any cline-neutral">&nbsp;</span>
  5813. <span class="cline-any cline-no">&nbsp;</span>
  5814. <span class="cline-any cline-no">&nbsp;</span>
  5815. <span class="cline-any cline-no">&nbsp;</span>
  5816. <span class="cline-any cline-no">&nbsp;</span>
  5817. <span class="cline-any cline-no">&nbsp;</span>
  5818. <span class="cline-any cline-no">&nbsp;</span>
  5819. <span class="cline-any cline-no">&nbsp;</span>
  5820. <span class="cline-any cline-no">&nbsp;</span>
  5821. <span class="cline-any cline-no">&nbsp;</span>
  5822. <span class="cline-any cline-no">&nbsp;</span>
  5823. <span class="cline-any cline-neutral">&nbsp;</span>
  5824. <span class="cline-any cline-neutral">&nbsp;</span>
  5825. <span class="cline-any cline-neutral">&nbsp;</span>
  5826. <span class="cline-any cline-neutral">&nbsp;</span>
  5827. <span class="cline-any cline-neutral">&nbsp;</span>
  5828. <span class="cline-any cline-no">&nbsp;</span>
  5829. <span class="cline-any cline-no">&nbsp;</span>
  5830. <span class="cline-any cline-no">&nbsp;</span>
  5831. <span class="cline-any cline-no">&nbsp;</span>
  5832. <span class="cline-any cline-neutral">&nbsp;</span>
  5833. <span class="cline-any cline-no">&nbsp;</span>
  5834. <span class="cline-any cline-no">&nbsp;</span>
  5835. <span class="cline-any cline-no">&nbsp;</span>
  5836. <span class="cline-any cline-no">&nbsp;</span>
  5837. <span class="cline-any cline-no">&nbsp;</span>
  5838. <span class="cline-any cline-neutral">&nbsp;</span>
  5839. <span class="cline-any cline-no">&nbsp;</span>
  5840. <span class="cline-any cline-no">&nbsp;</span>
  5841. <span class="cline-any cline-no">&nbsp;</span>
  5842. <span class="cline-any cline-no">&nbsp;</span>
  5843. <span class="cline-any cline-neutral">&nbsp;</span>
  5844. <span class="cline-any cline-no">&nbsp;</span>
  5845. <span class="cline-any cline-no">&nbsp;</span>
  5846. <span class="cline-any cline-no">&nbsp;</span>
  5847. <span class="cline-any cline-no">&nbsp;</span>
  5848. <span class="cline-any cline-no">&nbsp;</span>
  5849. <span class="cline-any cline-no">&nbsp;</span>
  5850. <span class="cline-any cline-no">&nbsp;</span>
  5851. <span class="cline-any cline-neutral">&nbsp;</span>
  5852. <span class="cline-any cline-neutral">&nbsp;</span>
  5853. <span class="cline-any cline-neutral">&nbsp;</span>
  5854. <span class="cline-any cline-neutral">&nbsp;</span>
  5855. <span class="cline-any cline-neutral">&nbsp;</span>
  5856. <span class="cline-any cline-no">&nbsp;</span>
  5857. <span class="cline-any cline-no">&nbsp;</span>
  5858. <span class="cline-any cline-no">&nbsp;</span>
  5859. <span class="cline-any cline-no">&nbsp;</span>
  5860. <span class="cline-any cline-no">&nbsp;</span>
  5861. <span class="cline-any cline-no">&nbsp;</span>
  5862. <span class="cline-any cline-no">&nbsp;</span>
  5863. <span class="cline-any cline-no">&nbsp;</span>
  5864. <span class="cline-any cline-no">&nbsp;</span>
  5865. <span class="cline-any cline-no">&nbsp;</span>
  5866. <span class="cline-any cline-neutral">&nbsp;</span>
  5867. <span class="cline-any cline-neutral">&nbsp;</span>
  5868. <span class="cline-any cline-no">&nbsp;</span>
  5869. <span class="cline-any cline-no">&nbsp;</span>
  5870. <span class="cline-any cline-no">&nbsp;</span>
  5871. <span class="cline-any cline-no">&nbsp;</span>
  5872. <span class="cline-any cline-neutral">&nbsp;</span>
  5873. <span class="cline-any cline-neutral">&nbsp;</span>
  5874. <span class="cline-any cline-no">&nbsp;</span>
  5875. <span class="cline-any cline-no">&nbsp;</span>
  5876. <span class="cline-any cline-no">&nbsp;</span>
  5877. <span class="cline-any cline-no">&nbsp;</span>
  5878. <span class="cline-any cline-no">&nbsp;</span>
  5879. <span class="cline-any cline-no">&nbsp;</span>
  5880. <span class="cline-any cline-no">&nbsp;</span>
  5881. <span class="cline-any cline-no">&nbsp;</span>
  5882. <span class="cline-any cline-no">&nbsp;</span>
  5883. <span class="cline-any cline-no">&nbsp;</span>
  5884. <span class="cline-any cline-no">&nbsp;</span>
  5885. <span class="cline-any cline-no">&nbsp;</span>
  5886. <span class="cline-any cline-neutral">&nbsp;</span>
  5887. <span class="cline-any cline-no">&nbsp;</span>
  5888. <span class="cline-any cline-neutral">&nbsp;</span>
  5889. <span class="cline-any cline-neutral">&nbsp;</span>
  5890. <span class="cline-any cline-no">&nbsp;</span>
  5891. <span class="cline-any cline-no">&nbsp;</span>
  5892. <span class="cline-any cline-no">&nbsp;</span>
  5893. <span class="cline-any cline-neutral">&nbsp;</span>
  5894. <span class="cline-any cline-no">&nbsp;</span>
  5895. <span class="cline-any cline-no">&nbsp;</span>
  5896. <span class="cline-any cline-no">&nbsp;</span>
  5897. <span class="cline-any cline-no">&nbsp;</span>
  5898. <span class="cline-any cline-no">&nbsp;</span>
  5899. <span class="cline-any cline-no">&nbsp;</span>
  5900. <span class="cline-any cline-no">&nbsp;</span>
  5901. <span class="cline-any cline-no">&nbsp;</span>
  5902. <span class="cline-any cline-no">&nbsp;</span>
  5903. <span class="cline-any cline-no">&nbsp;</span>
  5904. <span class="cline-any cline-no">&nbsp;</span>
  5905. <span class="cline-any cline-no">&nbsp;</span>
  5906. <span class="cline-any cline-no">&nbsp;</span>
  5907. <span class="cline-any cline-neutral">&nbsp;</span>
  5908. <span class="cline-any cline-no">&nbsp;</span>
  5909. <span class="cline-any cline-no">&nbsp;</span>
  5910. <span class="cline-any cline-no">&nbsp;</span>
  5911. <span class="cline-any cline-no">&nbsp;</span>
  5912. <span class="cline-any cline-no">&nbsp;</span>
  5913. <span class="cline-any cline-no">&nbsp;</span>
  5914. <span class="cline-any cline-no">&nbsp;</span>
  5915. <span class="cline-any cline-no">&nbsp;</span>
  5916. <span class="cline-any cline-no">&nbsp;</span>
  5917. <span class="cline-any cline-no">&nbsp;</span>
  5918. <span class="cline-any cline-no">&nbsp;</span>
  5919. <span class="cline-any cline-neutral">&nbsp;</span>
  5920. <span class="cline-any cline-neutral">&nbsp;</span>
  5921. <span class="cline-any cline-neutral">&nbsp;</span>
  5922. <span class="cline-any cline-neutral">&nbsp;</span>
  5923. <span class="cline-any cline-neutral">&nbsp;</span>
  5924. <span class="cline-any cline-no">&nbsp;</span>
  5925. <span class="cline-any cline-no">&nbsp;</span>
  5926. <span class="cline-any cline-no">&nbsp;</span>
  5927. <span class="cline-any cline-no">&nbsp;</span>
  5928. <span class="cline-any cline-no">&nbsp;</span>
  5929. <span class="cline-any cline-no">&nbsp;</span>
  5930. <span class="cline-any cline-no">&nbsp;</span>
  5931. <span class="cline-any cline-no">&nbsp;</span>
  5932. <span class="cline-any cline-no">&nbsp;</span>
  5933. <span class="cline-any cline-neutral">&nbsp;</span>
  5934. <span class="cline-any cline-no">&nbsp;</span>
  5935. <span class="cline-any cline-neutral">&nbsp;</span>
  5936. <span class="cline-any cline-no">&nbsp;</span>
  5937. <span class="cline-any cline-no">&nbsp;</span>
  5938. <span class="cline-any cline-no">&nbsp;</span>
  5939. <span class="cline-any cline-no">&nbsp;</span>
  5940. <span class="cline-any cline-neutral">&nbsp;</span>
  5941. <span class="cline-any cline-no">&nbsp;</span>
  5942. <span class="cline-any cline-no">&nbsp;</span>
  5943. <span class="cline-any cline-no">&nbsp;</span>
  5944. <span class="cline-any cline-no">&nbsp;</span>
  5945. <span class="cline-any cline-no">&nbsp;</span>
  5946. <span class="cline-any cline-no">&nbsp;</span>
  5947. <span class="cline-any cline-neutral">&nbsp;</span>
  5948. <span class="cline-any cline-no">&nbsp;</span>
  5949. <span class="cline-any cline-no">&nbsp;</span>
  5950. <span class="cline-any cline-no">&nbsp;</span>
  5951. <span class="cline-any cline-no">&nbsp;</span>
  5952. <span class="cline-any cline-no">&nbsp;</span>
  5953. <span class="cline-any cline-no">&nbsp;</span>
  5954. <span class="cline-any cline-no">&nbsp;</span>
  5955. <span class="cline-any cline-neutral">&nbsp;</span>
  5956. <span class="cline-any cline-neutral">&nbsp;</span>
  5957. <span class="cline-any cline-no">&nbsp;</span>
  5958. <span class="cline-any cline-no">&nbsp;</span>
  5959. <span class="cline-any cline-no">&nbsp;</span>
  5960. <span class="cline-any cline-no">&nbsp;</span>
  5961. <span class="cline-any cline-no">&nbsp;</span>
  5962. <span class="cline-any cline-no">&nbsp;</span>
  5963. <span class="cline-any cline-no">&nbsp;</span>
  5964. <span class="cline-any cline-no">&nbsp;</span>
  5965. <span class="cline-any cline-no">&nbsp;</span>
  5966. <span class="cline-any cline-no">&nbsp;</span>
  5967. <span class="cline-any cline-neutral">&nbsp;</span>
  5968. <span class="cline-any cline-neutral">&nbsp;</span>
  5969. <span class="cline-any cline-neutral">&nbsp;</span>
  5970. <span class="cline-any cline-neutral">&nbsp;</span>
  5971. <span class="cline-any cline-neutral">&nbsp;</span>
  5972. <span class="cline-any cline-no">&nbsp;</span>
  5973. <span class="cline-any cline-no">&nbsp;</span>
  5974. <span class="cline-any cline-no">&nbsp;</span>
  5975. <span class="cline-any cline-no">&nbsp;</span>
  5976. <span class="cline-any cline-neutral">&nbsp;</span>
  5977. <span class="cline-any cline-no">&nbsp;</span>
  5978. <span class="cline-any cline-no">&nbsp;</span>
  5979. <span class="cline-any cline-no">&nbsp;</span>
  5980. <span class="cline-any cline-no">&nbsp;</span>
  5981. <span class="cline-any cline-no">&nbsp;</span>
  5982. <span class="cline-any cline-neutral">&nbsp;</span>
  5983. <span class="cline-any cline-no">&nbsp;</span>
  5984. <span class="cline-any cline-neutral">&nbsp;</span>
  5985. <span class="cline-any cline-no">&nbsp;</span>
  5986. <span class="cline-any cline-no">&nbsp;</span>
  5987. <span class="cline-any cline-no">&nbsp;</span>
  5988. <span class="cline-any cline-no">&nbsp;</span>
  5989. <span class="cline-any cline-neutral">&nbsp;</span>
  5990. <span class="cline-any cline-neutral">&nbsp;</span>
  5991. <span class="cline-any cline-no">&nbsp;</span>
  5992. <span class="cline-any cline-no">&nbsp;</span>
  5993. <span class="cline-any cline-neutral">&nbsp;</span>
  5994. <span class="cline-any cline-neutral">&nbsp;</span>
  5995. <span class="cline-any cline-no">&nbsp;</span>
  5996. <span class="cline-any cline-neutral">&nbsp;</span>
  5997. <span class="cline-any cline-neutral">&nbsp;</span>
  5998. <span class="cline-any cline-no">&nbsp;</span>
  5999. <span class="cline-any cline-no">&nbsp;</span>
  6000. <span class="cline-any cline-no">&nbsp;</span>
  6001. <span class="cline-any cline-no">&nbsp;</span>
  6002. <span class="cline-any cline-no">&nbsp;</span>
  6003. <span class="cline-any cline-no">&nbsp;</span>
  6004. <span class="cline-any cline-no">&nbsp;</span>
  6005. <span class="cline-any cline-no">&nbsp;</span>
  6006. <span class="cline-any cline-no">&nbsp;</span>
  6007. <span class="cline-any cline-no">&nbsp;</span>
  6008. <span class="cline-any cline-no">&nbsp;</span>
  6009. <span class="cline-any cline-no">&nbsp;</span>
  6010. <span class="cline-any cline-no">&nbsp;</span>
  6011. <span class="cline-any cline-no">&nbsp;</span>
  6012. <span class="cline-any cline-no">&nbsp;</span>
  6013. <span class="cline-any cline-no">&nbsp;</span>
  6014. <span class="cline-any cline-no">&nbsp;</span>
  6015. <span class="cline-any cline-neutral">&nbsp;</span>
  6016. <span class="cline-any cline-no">&nbsp;</span>
  6017. <span class="cline-any cline-no">&nbsp;</span>
  6018. <span class="cline-any cline-no">&nbsp;</span>
  6019. <span class="cline-any cline-no">&nbsp;</span>
  6020. <span class="cline-any cline-no">&nbsp;</span>
  6021. <span class="cline-any cline-no">&nbsp;</span>
  6022. <span class="cline-any cline-no">&nbsp;</span>
  6023. <span class="cline-any cline-no">&nbsp;</span>
  6024. <span class="cline-any cline-no">&nbsp;</span>
  6025. <span class="cline-any cline-neutral">&nbsp;</span>
  6026. <span class="cline-any cline-neutral">&nbsp;</span>
  6027. <span class="cline-any cline-no">&nbsp;</span>
  6028. <span class="cline-any cline-no">&nbsp;</span>
  6029. <span class="cline-any cline-no">&nbsp;</span>
  6030. <span class="cline-any cline-no">&nbsp;</span>
  6031. <span class="cline-any cline-neutral">&nbsp;</span>
  6032. <span class="cline-any cline-no">&nbsp;</span>
  6033. <span class="cline-any cline-no">&nbsp;</span>
  6034. <span class="cline-any cline-no">&nbsp;</span>
  6035. <span class="cline-any cline-no">&nbsp;</span>
  6036. <span class="cline-any cline-no">&nbsp;</span>
  6037. <span class="cline-any cline-no">&nbsp;</span>
  6038. <span class="cline-any cline-no">&nbsp;</span>
  6039. <span class="cline-any cline-no">&nbsp;</span>
  6040. <span class="cline-any cline-no">&nbsp;</span>
  6041. <span class="cline-any cline-no">&nbsp;</span>
  6042. <span class="cline-any cline-no">&nbsp;</span>
  6043. <span class="cline-any cline-neutral">&nbsp;</span>
  6044. <span class="cline-any cline-neutral">&nbsp;</span>
  6045. <span class="cline-any cline-neutral">&nbsp;</span>
  6046. <span class="cline-any cline-neutral">&nbsp;</span>
  6047. <span class="cline-any cline-neutral">&nbsp;</span>
  6048. <span class="cline-any cline-no">&nbsp;</span>
  6049. <span class="cline-any cline-no">&nbsp;</span>
  6050. <span class="cline-any cline-no">&nbsp;</span>
  6051. <span class="cline-any cline-no">&nbsp;</span>
  6052. <span class="cline-any cline-no">&nbsp;</span>
  6053. <span class="cline-any cline-no">&nbsp;</span>
  6054. <span class="cline-any cline-no">&nbsp;</span>
  6055. <span class="cline-any cline-no">&nbsp;</span>
  6056. <span class="cline-any cline-no">&nbsp;</span>
  6057. <span class="cline-any cline-neutral">&nbsp;</span>
  6058. <span class="cline-any cline-no">&nbsp;</span>
  6059. <span class="cline-any cline-neutral">&nbsp;</span>
  6060. <span class="cline-any cline-neutral">&nbsp;</span>
  6061. <span class="cline-any cline-no">&nbsp;</span>
  6062. <span class="cline-any cline-no">&nbsp;</span>
  6063. <span class="cline-any cline-no">&nbsp;</span>
  6064. <span class="cline-any cline-no">&nbsp;</span>
  6065. <span class="cline-any cline-no">&nbsp;</span>
  6066. <span class="cline-any cline-no">&nbsp;</span>
  6067. <span class="cline-any cline-no">&nbsp;</span>
  6068. <span class="cline-any cline-no">&nbsp;</span>
  6069. <span class="cline-any cline-neutral">&nbsp;</span>
  6070. <span class="cline-any cline-neutral">&nbsp;</span>
  6071. <span class="cline-any cline-no">&nbsp;</span>
  6072. <span class="cline-any cline-no">&nbsp;</span>
  6073. <span class="cline-any cline-no">&nbsp;</span>
  6074. <span class="cline-any cline-no">&nbsp;</span>
  6075. <span class="cline-any cline-no">&nbsp;</span>
  6076. <span class="cline-any cline-no">&nbsp;</span>
  6077. <span class="cline-any cline-no">&nbsp;</span>
  6078. <span class="cline-any cline-no">&nbsp;</span>
  6079. <span class="cline-any cline-no">&nbsp;</span>
  6080. <span class="cline-any cline-no">&nbsp;</span>
  6081. <span class="cline-any cline-no">&nbsp;</span>
  6082. <span class="cline-any cline-no">&nbsp;</span>
  6083. <span class="cline-any cline-no">&nbsp;</span>
  6084. <span class="cline-any cline-neutral">&nbsp;</span>
  6085. <span class="cline-any cline-no">&nbsp;</span>
  6086. <span class="cline-any cline-neutral">&nbsp;</span>
  6087. <span class="cline-any cline-neutral">&nbsp;</span>
  6088. <span class="cline-any cline-no">&nbsp;</span>
  6089. <span class="cline-any cline-no">&nbsp;</span>
  6090. <span class="cline-any cline-no">&nbsp;</span>
  6091. <span class="cline-any cline-no">&nbsp;</span>
  6092. <span class="cline-any cline-no">&nbsp;</span>
  6093. <span class="cline-any cline-no">&nbsp;</span>
  6094. <span class="cline-any cline-no">&nbsp;</span>
  6095. <span class="cline-any cline-no">&nbsp;</span>
  6096. <span class="cline-any cline-no">&nbsp;</span>
  6097. <span class="cline-any cline-no">&nbsp;</span>
  6098. <span class="cline-any cline-no">&nbsp;</span>
  6099. <span class="cline-any cline-neutral">&nbsp;</span>
  6100. <span class="cline-any cline-no">&nbsp;</span>
  6101. <span class="cline-any cline-no">&nbsp;</span>
  6102. <span class="cline-any cline-no">&nbsp;</span>
  6103. <span class="cline-any cline-no">&nbsp;</span>
  6104. <span class="cline-any cline-neutral">&nbsp;</span>
  6105. <span class="cline-any cline-no">&nbsp;</span>
  6106. <span class="cline-any cline-no">&nbsp;</span>
  6107. <span class="cline-any cline-no">&nbsp;</span>
  6108. <span class="cline-any cline-no">&nbsp;</span>
  6109. <span class="cline-any cline-no">&nbsp;</span>
  6110. <span class="cline-any cline-no">&nbsp;</span>
  6111. <span class="cline-any cline-no">&nbsp;</span>
  6112. <span class="cline-any cline-no">&nbsp;</span>
  6113. <span class="cline-any cline-no">&nbsp;</span>
  6114. <span class="cline-any cline-no">&nbsp;</span>
  6115. <span class="cline-any cline-no">&nbsp;</span>
  6116. <span class="cline-any cline-neutral">&nbsp;</span>
  6117. <span class="cline-any cline-neutral">&nbsp;</span>
  6118. <span class="cline-any cline-no">&nbsp;</span>
  6119. <span class="cline-any cline-no">&nbsp;</span>
  6120. <span class="cline-any cline-neutral">&nbsp;</span>
  6121. <span class="cline-any cline-neutral">&nbsp;</span>
  6122. <span class="cline-any cline-no">&nbsp;</span>
  6123. <span class="cline-any cline-no">&nbsp;</span>
  6124. <span class="cline-any cline-no">&nbsp;</span>
  6125. <span class="cline-any cline-neutral">&nbsp;</span>
  6126. <span class="cline-any cline-no">&nbsp;</span>
  6127. <span class="cline-any cline-no">&nbsp;</span>
  6128. <span class="cline-any cline-no">&nbsp;</span>
  6129. <span class="cline-any cline-no">&nbsp;</span>
  6130. <span class="cline-any cline-no">&nbsp;</span>
  6131. <span class="cline-any cline-no">&nbsp;</span>
  6132. <span class="cline-any cline-no">&nbsp;</span>
  6133. <span class="cline-any cline-no">&nbsp;</span>
  6134. <span class="cline-any cline-no">&nbsp;</span>
  6135. <span class="cline-any cline-no">&nbsp;</span>
  6136. <span class="cline-any cline-no">&nbsp;</span>
  6137. <span class="cline-any cline-no">&nbsp;</span>
  6138. <span class="cline-any cline-no">&nbsp;</span>
  6139. <span class="cline-any cline-no">&nbsp;</span>
  6140. <span class="cline-any cline-no">&nbsp;</span>
  6141. <span class="cline-any cline-no">&nbsp;</span>
  6142. <span class="cline-any cline-no">&nbsp;</span>
  6143. <span class="cline-any cline-no">&nbsp;</span>
  6144. <span class="cline-any cline-no">&nbsp;</span>
  6145. <span class="cline-any cline-no">&nbsp;</span>
  6146. <span class="cline-any cline-neutral">&nbsp;</span>
  6147. <span class="cline-any cline-no">&nbsp;</span>
  6148. <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
  6149. * LangGraph 书籍生成 - API 路由
  6150. * 支持书籍创建时的预估显示
  6151. */
  6152. &nbsp;
  6153. <span class="cstat-no" title="statement not covered" >import Router from '@koa/router';</span>
  6154. import { Context } from 'koa';
  6155. <span class="cstat-no" title="statement not covered" >import { langGraphGenerator, getScaleConfig, resolveGenLevel, mapBookTypeToGenLevel } from './index';</span>
  6156. <span class="cstat-no" title="statement not covered" >import { bookStore, cancelAudioGeneration } from './book-generator.store';</span>
  6157. <span class="cstat-no" title="statement not covered" >import { prisma } from '../../models';</span>
  6158. <span class="cstat-no" title="statement not covered" >import { estimateBookWords, estimateAudioMinutesFromWords, checkBookGenerationQuota, checkAudioQuota } from '../subscription/subscription.service';</span>
  6159. <span class="cstat-no" title="statement not covered" >import { optionalAuth } from '../../middleware/auth';</span>
  6160. <span class="cstat-no" title="statement not covered" >import { getAllBookTypes, getDetectableTypes, getBookTypeConfig, BOOK_TYPE_CONFIG, DETECTABLE_TYPES } from './book-type-config';</span>
  6161. <span class="cstat-no" title="statement not covered" >import { callLLMWithMessages, callLLM, ChatMessage } from '../../services/llm';</span>
  6162. <span class="cstat-no" title="statement not covered" >import { cleanLlmShortText, extractJsonFromResponse } from '../../services/llm/response-cleaner';</span>
  6163. <span class="cstat-no" title="statement not covered" >import { createVideoProjectFromBook, generateVideoForProject } from '../video-generator/video-generator.service';</span>
  6164. <span class="cstat-no" title="statement not covered" >import { mergeChapterAudios } from '../player/player.service';</span>
  6165. <span class="cstat-no" title="statement not covered" >import { exec } from 'child_process';</span>
  6166. <span class="cstat-no" title="statement not covered" >import { promisify } from 'util';</span>
  6167. <span class="cstat-no" title="statement not covered" >import fs from 'fs/promises';</span>
  6168. <span class="cstat-no" title="statement not covered" >import path from 'path';</span>
  6169. <span class="cstat-no" title="statement not covered" >import { advanceChapter, regenerateChapter } from './stage-manager';</span>
  6170. <span class="cstat-no" title="statement not covered" >import { deepPlanBookNode } from './nodes/deep-plan.node';</span>
  6171. <span class="cstat-no" title="statement not covered" >import { richOutlineNode } from './nodes/rich-outline.node';</span>
  6172. <span class="cstat-no" title="statement not covered" >import { writeChaptersParallelNode } from './nodes/content.node';</span>
  6173. <span class="cstat-no" title="statement not covered" >import { continuityEditNode } from './nodes/continuity-edit.node';</span>
  6174. import { GraphState } from './graph';
  6175. &nbsp;
  6176. <span class="cstat-no" title="statement not covered" >const execPromise = promisify(exec);</span>
  6177. &nbsp;
  6178. // 开发环境测试用户ID
  6179. <span class="cstat-no" title="statement not covered" >const TEST_USER_ID = '1';</span>
  6180. &nbsp;
  6181. <span class="cstat-no" title="statement not covered" >const router = new Router();</span>
  6182. &nbsp;
  6183. /**
  6184. * GET /api/book-generator/langgraph/estimate
  6185. * 获取书籍规模预估信息
  6186. */
  6187. <span class="cstat-no" title="statement not covered" >router.get('/estimate', async (ctx: Context) =&gt; {</span>
  6188. <span class="cstat-no" title="statement not covered" > const { scale, userId, bookType } = ctx.query as { scale?: string; userId?: string; bookType?: string };</span>
  6189. &nbsp;
  6190. <span class="cstat-no" title="statement not covered" > if (!scale) {</span>
  6191. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  6192. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '请提供书籍规模' };</span>
  6193. <span class="cstat-no" title="statement not covered" > return;</span>
  6194. <span class="cstat-no" title="statement not covered" > }</span>
  6195. &nbsp;
  6196. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(scale);</span>
  6197. <span class="cstat-no" title="statement not covered" > const totalWords = scaleConfig.totalWords;</span>
  6198. <span class="cstat-no" title="statement not covered" > const audioMinutes = estimateAudioMinutesFromWords(totalWords);</span>
  6199. &nbsp;
  6200. // 章节数
  6201. <span class="cstat-no" title="statement not covered" > const estimatedChapters = scaleConfig.isShortArticle ? 1 : scaleConfig.chapters;</span>
  6202. &nbsp;
  6203. // 大纲层级(优先使用书籍类型映射)
  6204. <span class="cstat-no" title="statement not covered" > const genLevel = bookType &amp;&amp; bookType !== 'auto'</span>
  6205. <span class="cstat-no" title="statement not covered" > ? mapBookTypeToGenLevel(bookType)</span>
  6206. <span class="cstat-no" title="statement not covered" > : resolveGenLevel(scale);</span>
  6207. <span class="cstat-no" title="statement not covered" > const genLevelDescriptions: Record&lt;number, { label: string; desc: string }&gt; = {</span>
  6208. <span class="cstat-no" title="statement not covered" > 1: { label: '仅章', desc: '无节和小节,适合短文、小说' },</span>
  6209. <span class="cstat-no" title="statement not covered" > 2: { label: '章→节', desc: '有节无小节,适合科普、商业书' },</span>
  6210. <span class="cstat-no" title="statement not covered" > 3: { label: '章→节→小节', desc: '完整三级结构,适合教材、技术书' },</span>
  6211. <span class="cstat-no" title="statement not covered" > };</span>
  6212. &nbsp;
  6213. <span class="cstat-no" title="statement not covered" > const result: any = {</span>
  6214. <span class="cstat-no" title="statement not covered" > scale,</span>
  6215. <span class="cstat-no" title="statement not covered" > scaleConfig,</span>
  6216. <span class="cstat-no" title="statement not covered" > audioMinutes: {</span>
  6217. <span class="cstat-no" title="statement not covered" > min: estimateAudioMinutesFromWords(Math.round(totalWords * 0.8)),</span>
  6218. <span class="cstat-no" title="statement not covered" > max: estimateAudioMinutesFromWords(Math.round(totalWords * 1.2)),</span>
  6219. <span class="cstat-no" title="statement not covered" > avg: audioMinutes</span>
  6220. <span class="cstat-no" title="statement not covered" > },</span>
  6221. <span class="cstat-no" title="statement not covered" > estimatedChapters,</span>
  6222. <span class="cstat-no" title="statement not covered" > defaultGenLevel: genLevel,</span>
  6223. <span class="cstat-no" title="statement not covered" > genLevelInfo: genLevelDescriptions[genLevel] || { label: '章→节', desc: '' },</span>
  6224. <span class="cstat-no" title="statement not covered" > };</span>
  6225. // 如果提供了 userId,同时检查用户配额
  6226. <span class="cstat-no" title="statement not covered" > if (userId) {</span>
  6227. <span class="cstat-no" title="statement not covered" > const quotaCheck = await checkBookGenerationQuota(parseInt(userId), scale);</span>
  6228. <span class="cstat-no" title="statement not covered" > result.quotaCheck = quotaCheck;</span>
  6229. <span class="cstat-no" title="statement not covered" > }</span>
  6230. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6231. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6232. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6233. <span class="cstat-no" title="statement not covered" > data: result</span>
  6234. <span class="cstat-no" title="statement not covered" > };</span>
  6235. <span class="cstat-no" title="statement not covered" >});</span>
  6236. &nbsp;
  6237. /**
  6238. * POST /api/book-generator/langgraph/detect-scale
  6239. * AI 预览检测书籍规模(创建前调用,让用户看到检测结果)
  6240. */
  6241. <span class="cstat-no" title="statement not covered" >router.post('/detect-scale', async (ctx) =&gt; {</span>
  6242. <span class="cstat-no" title="statement not covered" > const { description } = ctx.request.body as { description?: string };</span>
  6243. <span class="cstat-no" title="statement not covered" > if (!description) {</span>
  6244. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '缺少 description' };</span>
  6245. <span class="cstat-no" title="statement not covered" > return;</span>
  6246. <span class="cstat-no" title="statement not covered" > }</span>
  6247. <span class="cstat-no" title="statement not covered" > const scale = await autoDetectBookType('', description);</span>
  6248. <span class="cstat-no" title="statement not covered" > const config = getScaleConfig(scale);</span>
  6249. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6250. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6251. <span class="cstat-no" title="statement not covered" > data: {</span>
  6252. <span class="cstat-no" title="statement not covered" > bookScale: scale,</span>
  6253. <span class="cstat-no" title="statement not covered" > totalWords: config.totalWords,</span>
  6254. <span class="cstat-no" title="statement not covered" > chapters: config.chapters,</span>
  6255. <span class="cstat-no" title="statement not covered" > isShortArticle: config.isShortArticle,</span>
  6256. <span class="cstat-no" title="statement not covered" > },</span>
  6257. <span class="cstat-no" title="statement not covered" > };</span>
  6258. <span class="cstat-no" title="statement not covered" >});</span>
  6259. &nbsp;
  6260. /**
  6261. * GET /api/book-generator/langgraph/book-types
  6262. * 获取所有书籍类型配置(供前端显示)
  6263. */
  6264. <span class="cstat-no" title="statement not covered" >router.get('/book-types', async (ctx: Context) =&gt; {</span>
  6265. <span class="cstat-no" title="statement not covered" > const types = getAllBookTypes().map(t =&gt; ({</span>
  6266. <span class="cstat-no" title="statement not covered" > key: t.key,</span>
  6267. <span class="cstat-no" title="statement not covered" > label: t.label,</span>
  6268. <span class="cstat-no" title="statement not covered" > description: t.description,</span>
  6269. <span class="cstat-no" title="statement not covered" > chapters: t.chapters,</span>
  6270. <span class="cstat-no" title="statement not covered" > totalWords: t.totalWords,</span>
  6271. <span class="cstat-no" title="statement not covered" > audioMinutes: t.audioMinutes,</span>
  6272. <span class="cstat-no" title="statement not covered" > chapterWords: t.chapterWords,</span>
  6273. <span class="cstat-no" title="statement not covered" > structureFormat: t.structureFormat,</span>
  6274. <span class="cstat-no" title="statement not covered" > readingDifficulty: t.readingDifficulty,</span>
  6275. <span class="cstat-no" title="statement not covered" > isShortArticle: t.isShortArticle,</span>
  6276. <span class="cstat-no" title="statement not covered" > }));</span>
  6277. &nbsp;
  6278. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6279. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6280. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6281. <span class="cstat-no" title="statement not covered" > data: types,</span>
  6282. <span class="cstat-no" title="statement not covered" > };</span>
  6283. <span class="cstat-no" title="statement not covered" >});</span>
  6284. &nbsp;
  6285. /**
  6286. * POST /api/book-generator/langgraph/detect-book-type
  6287. * AI 自动检测书籍类型
  6288. */
  6289. <span class="cstat-no" title="statement not covered" >router.post('/detect-book-type', async (ctx: Context) =&gt; {</span>
  6290. <span class="cstat-no" title="statement not covered" > const { title, description } = ctx.request.body as {</span>
  6291. title?: string;
  6292. description?: string;
  6293. };
  6294. &nbsp;
  6295. <span class="cstat-no" title="statement not covered" > if (!title) {</span>
  6296. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  6297. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '请提供书籍标题' };</span>
  6298. <span class="cstat-no" title="statement not covered" > return;</span>
  6299. <span class="cstat-no" title="statement not covered" > }</span>
  6300. &nbsp;
  6301. <span class="cstat-no" title="statement not covered" > const detectableTypes = DETECTABLE_TYPES;</span>
  6302. &nbsp;
  6303. // 构建类型特征描述,帮助 AI 分类
  6304. <span class="cstat-no" title="statement not covered" > const typeDescriptions = detectableTypes.map(key =&gt; {</span>
  6305. <span class="cstat-no" title="statement not covered" > const t = BOOK_TYPE_CONFIG[key];</span>
  6306. <span class="cstat-no" title="statement not covered" > return `- ${t.key}: ${t.description},${t.chapters}章,总字数约${t.totalWords}字,每章约${t.chapterWords}字,结构形式:${t.structureFormat},阅读难度:${t.readingDifficulty}`;</span>
  6307. <span class="cstat-no" title="statement not covered" > }).join('\n');</span>
  6308. &nbsp;
  6309. <span class="cstat-no" title="statement not covered" > const messages: ChatMessage[] = [</span>
  6310. <span class="cstat-no" title="statement not covered" > {</span>
  6311. <span class="cstat-no" title="statement not covered" > role: 'system',</span>
  6312. <span class="cstat-no" title="statement not covered" > content: `你是一位专业的图书分类编辑。根据用户提供的标题和描述,判断这本书最可能属于以下哪种类型:</span>
  6313. &nbsp;
  6314. 可选类型:
  6315. <span class="cstat-no" title="statement not covered" >${typeDescriptions}</span>
  6316. &nbsp;
  6317. ## 分类规则
  6318. 1. 分析标题中的关键词(如"科普""青少年""专业""小说"等)
  6319. 2. 分析描述中的目标读者、写作风格、内容深度
  6320. 3. 匹配最符合的类型
  6321. &nbsp;
  6322. ## 输出格式
  6323. 必须返回 JSON,不要包含 markdown 代码块标记:
  6324. {
  6325. "detectedType": "类型 key",
  6326. "confidence": 0.85,
  6327. "reasoning": "分类理由,1-2句话"
  6328. }
  6329. &nbsp;
  6330. confidence 是 0-1 的数值,表示置信程度。`,
  6331. <span class="cstat-no" title="statement not covered" > },</span>
  6332. <span class="cstat-no" title="statement not covered" > {</span>
  6333. <span class="cstat-no" title="statement not covered" > role: 'user',</span>
  6334. <span class="cstat-no" title="statement not covered" > content: `标题:《${title}》\n描述:${description || '无'}`,</span>
  6335. <span class="cstat-no" title="statement not covered" > },</span>
  6336. <span class="cstat-no" title="statement not covered" > ];</span>
  6337. &nbsp;
  6338. <span class="cstat-no" title="statement not covered" > try {</span>
  6339. <span class="cstat-no" title="statement not covered" > const response = await callLLMWithMessages(messages);</span>
  6340. <span class="cstat-no" title="statement not covered" > const parsed = parseDetectResult(response);</span>
  6341. &nbsp;
  6342. <span class="cstat-no" title="statement not covered" > if (!parsed) {</span>
  6343. // 降级到关键词匹配
  6344. <span class="cstat-no" title="statement not covered" > const fallback = keywordFallback(title, description || '');</span>
  6345. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6346. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6347. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6348. <span class="cstat-no" title="statement not covered" > data: {</span>
  6349. <span class="cstat-no" title="statement not covered" > detectedType: fallback.detectedType,</span>
  6350. <span class="cstat-no" title="statement not covered" > confidence: 0.5,</span>
  6351. <span class="cstat-no" title="statement not covered" > reasoning: '基于关键词匹配(AI 解析失败,使用降级策略)',</span>
  6352. <span class="cstat-no" title="statement not covered" > config: getBookTypeConfig(fallback.detectedType),</span>
  6353. <span class="cstat-no" title="statement not covered" > },</span>
  6354. <span class="cstat-no" title="statement not covered" > };</span>
  6355. <span class="cstat-no" title="statement not covered" > return;</span>
  6356. <span class="cstat-no" title="statement not covered" > }</span>
  6357. &nbsp;
  6358. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6359. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6360. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6361. <span class="cstat-no" title="statement not covered" > data: {</span>
  6362. <span class="cstat-no" title="statement not covered" > detectedType: parsed.detectedType,</span>
  6363. <span class="cstat-no" title="statement not covered" > confidence: parsed.confidence,</span>
  6364. <span class="cstat-no" title="statement not covered" > reasoning: parsed.reasoning,</span>
  6365. <span class="cstat-no" title="statement not covered" > config: getBookTypeConfig(parsed.detectedType),</span>
  6366. <span class="cstat-no" title="statement not covered" > },</span>
  6367. <span class="cstat-no" title="statement not covered" > };</span>
  6368. <span class="cstat-no" title="statement not covered" > } catch (error: any) {</span>
  6369. // 最终降级:关键词匹配
  6370. <span class="cstat-no" title="statement not covered" > const fallback = keywordFallback(title, description || '');</span>
  6371. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6372. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6373. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6374. <span class="cstat-no" title="statement not covered" > data: {</span>
  6375. <span class="cstat-no" title="statement not covered" > detectedType: fallback.detectedType,</span>
  6376. <span class="cstat-no" title="statement not covered" > confidence: 0.3,</span>
  6377. <span class="cstat-no" title="statement not covered" > reasoning: 'LLM 调用失败,使用关键词匹配降级',</span>
  6378. <span class="cstat-no" title="statement not covered" > config: getBookTypeConfig(fallback.detectedType),</span>
  6379. <span class="cstat-no" title="statement not covered" > },</span>
  6380. <span class="cstat-no" title="statement not covered" > };</span>
  6381. <span class="cstat-no" title="statement not covered" > }</span>
  6382. <span class="cstat-no" title="statement not covered" >});</span>
  6383. &nbsp;
  6384. <span class="cstat-no" title="statement not covered" >function parseDetectResult(text: string): { detectedType: string; confidence: number; reasoning: string } | null {</span>
  6385. <span class="cstat-no" title="statement not covered" > try {</span>
  6386. <span class="cstat-no" title="statement not covered" > const match = text.match(/\{[\s\S]*\}/);</span>
  6387. <span class="cstat-no" title="statement not covered" > if (!match) return null;</span>
  6388. <span class="cstat-no" title="statement not covered" > const data = JSON.parse(match[0]);</span>
  6389. <span class="cstat-no" title="statement not covered" > if (!data.detectedType) return null;</span>
  6390. // 验证类型是否有效
  6391. <span class="cstat-no" title="statement not covered" > if (!DETECTABLE_TYPES.includes(data.detectedType)) {</span>
  6392. // 尝试模糊匹配
  6393. <span class="cstat-no" title="statement not covered" > const found = DETECTABLE_TYPES.find(t =&gt; data.detectedType.includes(t) || t.includes(data.detectedType));</span>
  6394. <span class="cstat-no" title="statement not covered" > if (!found) return null;</span>
  6395. <span class="cstat-no" title="statement not covered" > data.detectedType = found;</span>
  6396. <span class="cstat-no" title="statement not covered" > }</span>
  6397. <span class="cstat-no" title="statement not covered" > return {</span>
  6398. <span class="cstat-no" title="statement not covered" > detectedType: data.detectedType,</span>
  6399. <span class="cstat-no" title="statement not covered" > confidence: Math.min(1, Math.max(0, data.confidence || 0.5)),</span>
  6400. <span class="cstat-no" title="statement not covered" > reasoning: data.reasoning || '',</span>
  6401. <span class="cstat-no" title="statement not covered" > };</span>
  6402. <span class="cstat-no" title="statement not covered" > } catch {</span>
  6403. <span class="cstat-no" title="statement not covered" > return null;</span>
  6404. <span class="cstat-no" title="statement not covered" > }</span>
  6405. <span class="cstat-no" title="statement not covered" >}</span>
  6406. &nbsp;
  6407. <span class="cstat-no" title="statement not covered" >function keywordFallback(_title: string, _description: string): { detectedType: string } {</span>
  6408. // 完全由 AI 判断,fallback 只在 LLM 完全失败时作为最后保险
  6409. <span class="cstat-no" title="statement not covered" > return { detectedType: '1000' }; // 最小规模</span>
  6410. <span class="cstat-no" title="statement not covered" >}</span>
  6411. &nbsp;
  6412. /**
  6413. * AI 根据描述自动生成书名
  6414. */
  6415. <span class="cstat-no" title="statement not covered" >async function autoGenerateTitle(description: string): Promise&lt;string&gt; {</span>
  6416. <span class="cstat-no" title="statement not covered" > const prompt = `根据以下描述起一个书名。要求:中文不超过20字,英文不超过20个单词。只返回书名,不要任何解释、思考或前缀。</span>
  6417. &nbsp;
  6418. <span class="cstat-no" title="statement not covered" >描述:${description.substring(0, 200)}</span>
  6419. &nbsp;
  6420. 书名:`;
  6421. &nbsp;
  6422. <span class="cstat-no" title="statement not covered" > try {</span>
  6423. <span class="cstat-no" title="statement not covered" > const response = await callLLM(prompt);</span>
  6424. <span class="cstat-no" title="statement not covered" > const title = cleanLlmShortText(response, {</span>
  6425. <span class="cstat-no" title="statement not covered" > maxLength: 50,</span>
  6426. <span class="cstat-no" title="statement not covered" > maxChineseChars: 20,</span>
  6427. <span class="cstat-no" title="statement not covered" > maxEnglishWords: 20,</span>
  6428. <span class="cstat-no" title="statement not covered" > });</span>
  6429. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] AI 生成书名: "${title}"`);</span>
  6430. <span class="cstat-no" title="statement not covered" > return title || '未命名书籍';</span>
  6431. <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
  6432. <span class="cstat-no" title="statement not covered" > console.warn('[LangGraph] AI 自动生成书名失败,使用默认:', e);</span>
  6433. <span class="cstat-no" title="statement not covered" > return '未命名书籍';</span>
  6434. <span class="cstat-no" title="statement not covered" > }</span>
  6435. <span class="cstat-no" title="statement not covered" >}</span>
  6436. &nbsp;
  6437. /**
  6438. * AI 自动检测书籍规模(字数等级),后端静默调用
  6439. * AI 分析描述中的字数要求,以 JSON 格式返回,供程序提取
  6440. */
  6441. <span class="cstat-no" title="statement not covered" >async function autoDetectBookType(title: string, description: string): Promise&lt;string&gt; {</span>
  6442. <span class="cstat-no" title="statement not covered" > console.log(`[autoDetectBookType] 被调用: title="${title}", desc前50="${description?.substring(0, 50)}"`);</span>
  6443. <span class="cstat-no" title="statement not covered" > const messages: ChatMessage[] = [</span>
  6444. <span class="cstat-no" title="statement not covered" > {</span>
  6445. <span class="cstat-no" title="statement not covered" > role: 'system',</span>
  6446. <span class="cstat-no" title="statement not covered" > content: `你是一位专业的图书分类编辑。根据标题和描述,判断书籍适合的字数规模。</span>
  6447. &nbsp;
  6448. ## 判断规则
  6449. &nbsp;
  6450. **规则1 - 字数直接返回**:如果描述里有"X字"(如"200字""500字""几千字"),直接返回X作为bookScale值,不要映射到预定义规模。
  6451. - 描述含"200字"→返回200
  6452. - 描述含"500字"→返回500
  6453. - 描述含"几千字"→估计约3000,返回3000
  6454. - 描述含"上万字"→估计约10000,返回10000
  6455. &nbsp;
  6456. **规则2 - 无法判断**:描述中没有字数信息 → 返回1000
  6457. &nbsp;
  6458. ## 输出格式(必须严格JSON)
  6459. {"bookScale": 数字}
  6460. 只返回JSON,不要任何其他文字。`,
  6461. <span class="cstat-no" title="statement not covered" > },</span>
  6462. <span class="cstat-no" title="statement not covered" > {</span>
  6463. <span class="cstat-no" title="statement not covered" > role: 'user',</span>
  6464. <span class="cstat-no" title="statement not covered" > content: `标题:《${title}》\n描述:${description}`,</span>
  6465. <span class="cstat-no" title="statement not covered" > },</span>
  6466. <span class="cstat-no" title="statement not covered" > ];</span>
  6467. &nbsp;
  6468. <span class="cstat-no" title="statement not covered" > try {</span>
  6469. <span class="cstat-no" title="statement not covered" > const response = await callLLMWithMessages(messages);</span>
  6470. <span class="cstat-no" title="statement not covered" > const trimmed = response.trim();</span>
  6471. <span class="cstat-no" title="statement not covered" > console.log(`[autoDetectBookType] AI原始响应: ${trimmed.substring(0, 200)}`);</span>
  6472. &nbsp;
  6473. // 尝试解析 JSON,提取 bookScale(实际字数)
  6474. <span class="cstat-no" title="statement not covered" > const jsonMatch = trimmed.match(/\{[\s\S]*\}/);</span>
  6475. <span class="cstat-no" title="statement not covered" > if (jsonMatch) {</span>
  6476. <span class="cstat-no" title="statement not covered" > try {</span>
  6477. <span class="cstat-no" title="statement not covered" > const data = JSON.parse(jsonMatch[0]);</span>
  6478. <span class="cstat-no" title="statement not covered" > if (typeof data.bookScale === 'number') {</span>
  6479. <span class="cstat-no" title="statement not covered" > const wordCount = data.bookScale;</span>
  6480. <span class="cstat-no" title="statement not covered" > console.log(`[autoDetectBookType] AI返回: bookScale=${wordCount}`);</span>
  6481. // 直接返回实际字数,getBookTypeConfig 支持任意数字 key
  6482. <span class="cstat-no" title="statement not covered" > return String(wordCount);</span>
  6483. <span class="cstat-no" title="statement not covered" > }</span>
  6484. <span class="cstat-no" title="statement not covered" > } catch {</span>
  6485. // JSON解析失败,忽略
  6486. <span class="cstat-no" title="statement not covered" > }</span>
  6487. <span class="cstat-no" title="statement not covered" > }</span>
  6488. &nbsp;
  6489. // JSON解析失败 → 默认返回最小规模
  6490. <span class="cstat-no" title="statement not covered" > console.log(`[autoDetectBookType] AI响应无法解析,使用默认值1000`);</span>
  6491. <span class="cstat-no" title="statement not covered" > return '1000';</span>
  6492. <span class="cstat-no" title="statement not covered" > } catch (error: any) {</span>
  6493. <span class="cstat-no" title="statement not covered" > console.error(`[autoDetectBookType] AI调用异常:`, error?.message || error);</span>
  6494. <span class="cstat-no" title="statement not covered" > return '1000';</span>
  6495. <span class="cstat-no" title="statement not covered" > }</span>
  6496. <span class="cstat-no" title="statement not covered" >}</span>
  6497. &nbsp;
  6498. /**
  6499. * POST /api/book-generator/langgraph/smart-recommend
  6500. * 根据书籍描述智能推荐难度、人群、风格、领域
  6501. */
  6502. <span class="cstat-no" title="statement not covered" >router.post('/smart-recommend', async (ctx: Context) =&gt; {</span>
  6503. <span class="cstat-no" title="statement not covered" > try {</span>
  6504. <span class="cstat-no" title="statement not covered" > const { description, title } = ctx.request.body as { description: string; title?: string };</span>
  6505. &nbsp;
  6506. <span class="cstat-no" title="statement not covered" > if (!description || !description.trim()) {</span>
  6507. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  6508. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '描述不能为空' };</span>
  6509. <span class="cstat-no" title="statement not covered" > return;</span>
  6510. <span class="cstat-no" title="statement not covered" > }</span>
  6511. &nbsp;
  6512. // 默认推荐值
  6513. <span class="cstat-no" title="statement not covered" > const defaultResult = {</span>
  6514. <span class="cstat-no" title="statement not covered" > knowledgeLevel: '入门',</span>
  6515. <span class="cstat-no" title="statement not covered" > targetAudience: '通用',</span>
  6516. <span class="cstat-no" title="statement not covered" > style: '轻松幽默',</span>
  6517. <span class="cstat-no" title="statement not covered" > industry: '教育',</span>
  6518. <span class="cstat-no" title="statement not covered" > reason: '默认推荐',</span>
  6519. <span class="cstat-no" title="statement not covered" > };</span>
  6520. &nbsp;
  6521. <span class="cstat-no" title="statement not covered" > const prompt = `根据以下书籍描述,推荐合适的知识难度、目标人群、写作风格和行业领域。</span>
  6522. &nbsp;
  6523. <span class="cstat-no" title="statement not covered" >书名:${title || '未命名'}</span>
  6524. <span class="cstat-no" title="statement not covered" >描述:${description}</span>
  6525. &nbsp;
  6526. 请以 JSON 格式返回推荐结果,不要包含任何其他文字:
  6527. {
  6528. "knowledgeLevel": "入门|进阶|专业",
  6529. "targetAudience": "推荐的目标人群",
  6530. "style": "推荐风格",
  6531. "industry": "推荐行业领域",
  6532. "reason": "简要说明推荐理由"
  6533. }`;
  6534. &nbsp;
  6535. <span class="cstat-no" title="statement not covered" > const messages: ChatMessage[] = [</span>
  6536. <span class="cstat-no" title="statement not covered" > { role: 'system', content: '你是一位专业的图书策划编辑,擅长根据书籍内容推荐合适的定位。' },</span>
  6537. <span class="cstat-no" title="statement not covered" > { role: 'user', content: prompt },</span>
  6538. <span class="cstat-no" title="statement not covered" > ];</span>
  6539. &nbsp;
  6540. <span class="cstat-no" title="statement not covered" > const response = await callLLMWithMessages(messages);</span>
  6541. <span class="cstat-no" title="statement not covered" > const result = extractJsonFromResponse(response) || defaultResult;</span>
  6542. &nbsp;
  6543. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: 'success', data: result };</span>
  6544. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6545. <span class="cstat-no" title="statement not covered" > console.error('智能推荐失败:', error);</span>
  6546. // 返回默认值而不是错误
  6547. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6548. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6549. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6550. <span class="cstat-no" title="statement not covered" > data: {</span>
  6551. <span class="cstat-no" title="statement not covered" > knowledgeLevel: '入门',</span>
  6552. <span class="cstat-no" title="statement not covered" > targetAudience: '通用',</span>
  6553. <span class="cstat-no" title="statement not covered" > style: '轻松幽默',</span>
  6554. <span class="cstat-no" title="statement not covered" > industry: '教育',</span>
  6555. <span class="cstat-no" title="statement not covered" > reason: 'AI服务暂时不可用,使用默认推荐',</span>
  6556. <span class="cstat-no" title="statement not covered" > },</span>
  6557. <span class="cstat-no" title="statement not covered" > };</span>
  6558. <span class="cstat-no" title="statement not covered" > }</span>
  6559. <span class="cstat-no" title="statement not covered" >});</span>
  6560. &nbsp;
  6561. /**
  6562. * POST /api/book-generator/langgraph/books
  6563. * 使用 LangGraph 创建并生成书籍(异步,自动生成大纲和内容)
  6564. * AI 根据标题+描述自动判断书籍类型
  6565. *
  6566. * 优化策略:
  6567. * 1. 并行执行 autoGenerateTitle + autoDetectBookType(串行→并行,耗时减半)
  6568. * 2. 先创建书籍返回响应,AI 结果异步回填(用户无需等待 AI 完成即可看到书籍)
  6569. */
  6570. <span class="cstat-no" title="statement not covered" >router.post('/books', optionalAuth, async (ctx: Context) =&gt; {</span>
  6571. <span class="cstat-no" title="statement not covered" > try {</span>
  6572. <span class="cstat-no" title="statement not covered" > const body = ctx.request.body as {</span>
  6573. title: string;
  6574. description: string;
  6575. bookScale?: string;
  6576. bookType?: string;
  6577. genLevel?: number;
  6578. generateForeword?: boolean;
  6579. generateAfterword?: boolean;
  6580. immediateGenerate?: boolean;
  6581. };
  6582. &nbsp;
  6583. <span class="cstat-no" title="statement not covered" > if (!body.description) {</span>
  6584. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  6585. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '描述不能为空' };</span>
  6586. <span class="cstat-no" title="statement not covered" > return;</span>
  6587. <span class="cstat-no" title="statement not covered" > }</span>
  6588. &nbsp;
  6589. // 获取用户 ID(未登录时使用测试用户)
  6590. <span class="cstat-no" title="statement not covered" > const userId = ctx.state.user?.userId ? parseInt(ctx.state.user.userId as string) : parseInt(TEST_USER_ID);</span>
  6591. &nbsp;
  6592. <span class="cstat-no" title="statement not covered" > const providedTitle = body.title?.trim();</span>
  6593. // 只接受数字格式的 bookScale(如 '200', '1000', '130000'),非数字当作未提供
  6594. <span class="cstat-no" title="statement not covered" > const providedBookScale = body.bookScale &amp;&amp; /^\d+$/.test(body.bookScale) ? body.bookScale : undefined;</span>
  6595. &nbsp;
  6596. // ========== 快速路径:用户已提供 title 和 bookScale,无需 AI ==========
  6597. <span class="cstat-no" title="statement not covered" > if (providedTitle &amp;&amp; providedBookScale) {</span>
  6598. <span class="cstat-no" title="statement not covered" > const bookScale = providedBookScale;</span>
  6599. <span class="cstat-no" title="statement not covered" > const genLevel = body.genLevel !== undefined</span>
  6600. <span class="cstat-no" title="statement not covered" > ? resolveGenLevel(bookScale, body.genLevel)</span>
  6601. <span class="cstat-no" title="statement not covered" > : body.bookType &amp;&amp; body.bookType !== 'auto'</span>
  6602. <span class="cstat-no" title="statement not covered" > ? mapBookTypeToGenLevel(body.bookType)</span>
  6603. <span class="cstat-no" title="statement not covered" > : resolveGenLevel(bookScale);</span>
  6604. &nbsp;
  6605. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(bookScale);</span>
  6606. <span class="cstat-no" title="statement not covered" > const totalWords = scaleConfig.totalWords;</span>
  6607. <span class="cstat-no" title="statement not covered" > const audioQuota = await checkAudioQuota(userId, totalWords);</span>
  6608. <span class="cstat-no" title="statement not covered" > if (!audioQuota.allowed) {</span>
  6609. <span class="cstat-no" title="statement not covered" > ctx.status = 403;</span>
  6610. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: audioQuota.reason, data: { estimatedWords: totalWords, estimatedAudioMinutes: estimateAudioMinutesFromWords(totalWords), remainingMinutes: audioQuota.remainingMinutes, totalMinutes: audioQuota.totalMinutes } };</span>
  6611. <span class="cstat-no" title="statement not covered" > return;</span>
  6612. <span class="cstat-no" title="statement not covered" > }</span>
  6613. &nbsp;
  6614. <span class="cstat-no" title="statement not covered" > const book = await bookStore.create({</span>
  6615. <span class="cstat-no" title="statement not covered" > userId,</span>
  6616. <span class="cstat-no" title="statement not covered" > title: providedTitle,</span>
  6617. <span class="cstat-no" title="statement not covered" > description: body.description,</span>
  6618. <span class="cstat-no" title="statement not covered" > bookScale,</span>
  6619. <span class="cstat-no" title="statement not covered" > totalChapters: scaleConfig.isShortArticle ? 1 : scaleConfig.chapters,</span>
  6620. <span class="cstat-no" title="statement not covered" > estimatedWords: totalWords,</span>
  6621. <span class="cstat-no" title="statement not covered" > });</span>
  6622. &nbsp;
  6623. <span class="cstat-no" title="statement not covered" > if (body.immediateGenerate === false) {</span>
  6624. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: '书籍创建成功(交互模式)', data: { book, genStage: 'draft', mode: 'interactive' } };</span>
  6625. <span class="cstat-no" title="statement not covered" > return;</span>
  6626. <span class="cstat-no" title="statement not covered" > }</span>
  6627. &nbsp;
  6628. <span class="cstat-no" title="statement not covered" > await bookStore.update(book.id, { genStage: 'outlining' });</span>
  6629. <span class="cstat-no" title="statement not covered" > langGraphGenerator.generate(book.id.toString(), body.description, bookScale, genLevel)</span>
  6630. <span class="cstat-no" title="statement not covered" > .then(() =&gt; console.log(`[LangGraph] 生成完成: bookId=${book.id}`))</span>
  6631. <span class="cstat-no" title="statement not covered" > .catch(err =&gt; {</span>
  6632. <span class="cstat-no" title="statement not covered" > console.error(`[LangGraph] 生成失败: bookId=${book.id}`, err);</span>
  6633. <span class="cstat-no" title="statement not covered" > bookStore.update(book.id.toString(), { genStage: 'failed', errorMsg: err instanceof Error ? err.message : '生成失败', failedStage: 'outlining' });</span>
  6634. <span class="cstat-no" title="statement not covered" > });</span>
  6635. &nbsp;
  6636. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: '书籍创建成功,生成已开始', data: { book, genStage: 'outlining', mode: 'async' } };</span>
  6637. <span class="cstat-no" title="statement not covered" > return;</span>
  6638. <span class="cstat-no" title="statement not covered" > }</span>
  6639. &nbsp;
  6640. // ========== 需要 AI 辅助的路径:先创建书籍,再异步回填 ==========
  6641. // 使用临时标题/默认规模先创建书籍,立即返回给前端
  6642. // 规模会由 AI 异步回填
  6643. <span class="cstat-no" title="statement not covered" > const fallbackScale = providedBookScale || '1000';</span>
  6644. <span class="cstat-no" title="statement not covered" > const fallbackTitle = providedTitle || '正在生成标题...';</span>
  6645. <span class="cstat-no" title="statement not covered" > const fallbackConfig = getScaleConfig(fallbackScale);</span>
  6646. <span class="cstat-no" title="statement not covered" > const fallbackWords = fallbackConfig.totalWords;</span>
  6647. &nbsp;
  6648. // 配额预检查(使用默认规模估算,后续可能因 AI 检测结果调整)
  6649. <span class="cstat-no" title="statement not covered" > const audioQuota = await checkAudioQuota(userId, fallbackWords);</span>
  6650. <span class="cstat-no" title="statement not covered" > if (!audioQuota.allowed) {</span>
  6651. <span class="cstat-no" title="statement not covered" > ctx.status = 403;</span>
  6652. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: audioQuota.reason, data: { estimatedWords: fallbackWords, estimatedAudioMinutes: estimateAudioMinutesFromWords(fallbackWords), remainingMinutes: audioQuota.remainingMinutes, totalMinutes: audioQuota.totalMinutes } };</span>
  6653. <span class="cstat-no" title="statement not covered" > return;</span>
  6654. <span class="cstat-no" title="statement not covered" > }</span>
  6655. &nbsp;
  6656. // 先创建书籍,立即返回
  6657. <span class="cstat-no" title="statement not covered" > const book = await bookStore.create({</span>
  6658. <span class="cstat-no" title="statement not covered" > userId,</span>
  6659. <span class="cstat-no" title="statement not covered" > title: fallbackTitle,</span>
  6660. <span class="cstat-no" title="statement not covered" > description: body.description,</span>
  6661. <span class="cstat-no" title="statement not covered" > bookScale: fallbackScale,</span>
  6662. <span class="cstat-no" title="statement not covered" > totalChapters: fallbackConfig.isShortArticle ? 1 : fallbackConfig.chapters,</span>
  6663. <span class="cstat-no" title="statement not covered" > estimatedWords: fallbackWords,</span>
  6664. <span class="cstat-no" title="statement not covered" > });</span>
  6665. &nbsp;
  6666. // 标记为 AI 正在准备中
  6667. <span class="cstat-no" title="statement not covered" > const needTitle = !providedTitle;</span>
  6668. <span class="cstat-no" title="statement not covered" > const needScale = !providedBookScale;</span>
  6669. <span class="cstat-no" title="statement not covered" > const aiPreparing = needTitle || needScale;</span>
  6670. &nbsp;
  6671. <span class="cstat-no" title="statement not covered" > if (body.immediateGenerate === false) {</span>
  6672. // 交互模式:异步填充 AI 结果,但不需要启动生成
  6673. <span class="cstat-no" title="statement not covered" > if (aiPreparing) {</span>
  6674. <span class="cstat-no" title="statement not covered" > fillAiResultsAsync(book.id.toString(), body.description, providedTitle, providedBookScale);</span>
  6675. <span class="cstat-no" title="statement not covered" > }</span>
  6676. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: '书籍创建成功(交互模式)', data: { book, genStage: 'draft', mode: 'interactive', aiPreparing } };</span>
  6677. <span class="cstat-no" title="statement not covered" > return;</span>
  6678. <span class="cstat-no" title="statement not covered" > }</span>
  6679. &nbsp;
  6680. // 非交互模式:需要等 AI 完成后才能确定 bookScale/genLevel 启动生成
  6681. <span class="cstat-no" title="statement not covered" > await bookStore.update(book.id, { genStage: 'outlining' });</span>
  6682. &nbsp;
  6683. // 立即返回响应
  6684. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6685. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6686. <span class="cstat-no" title="statement not covered" > message: '书籍创建成功,AI 正在准备标题和规模...',</span>
  6687. <span class="cstat-no" title="statement not covered" > data: {</span>
  6688. <span class="cstat-no" title="statement not covered" > book,</span>
  6689. <span class="cstat-no" title="statement not covered" > genStage: 'outlining',</span>
  6690. <span class="cstat-no" title="statement not covered" > mode: 'async',</span>
  6691. <span class="cstat-no" title="statement not covered" > aiPreparing,</span>
  6692. <span class="cstat-no" title="statement not covered" > },</span>
  6693. <span class="cstat-no" title="statement not covered" > };</span>
  6694. &nbsp;
  6695. // 异步:并行执行 AI 生成标题 + 检测规模,然后启动内容生成
  6696. <span class="cstat-no" title="statement not covered" > (async () =&gt; {</span>
  6697. <span class="cstat-no" title="statement not covered" > try {</span>
  6698. <span class="cstat-no" title="statement not covered" > let title = providedTitle;</span>
  6699. <span class="cstat-no" title="statement not covered" > let bookScale = providedBookScale;</span>
  6700. &nbsp;
  6701. // 并行执行 AI 调用
  6702. <span class="cstat-no" title="statement not covered" > const aiPromises: Promise&lt;any&gt;[] = [];</span>
  6703. <span class="cstat-no" title="statement not covered" > const titleIdx = needTitle ? aiPromises.push(autoGenerateTitle(body.description)) - 1 : -1;</span>
  6704. <span class="cstat-no" title="statement not covered" > const scaleIdx = needScale ? aiPromises.push(autoDetectBookType(providedTitle || '', body.description)) - 1 : -1;</span>
  6705. &nbsp;
  6706. <span class="cstat-no" title="statement not covered" > if (aiPromises.length &gt; 0) {</span>
  6707. <span class="cstat-no" title="statement not covered" > const results = await Promise.all(aiPromises);</span>
  6708. <span class="cstat-no" title="statement not covered" > if (titleIdx &gt;= 0) {</span>
  6709. <span class="cstat-no" title="statement not covered" > title = results[titleIdx] as string;</span>
  6710. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] AI 自动生成书名: "${title}"`);</span>
  6711. <span class="cstat-no" title="statement not covered" > }</span>
  6712. <span class="cstat-no" title="statement not covered" > if (scaleIdx &gt;= 0) {</span>
  6713. <span class="cstat-no" title="statement not covered" > bookScale = results[scaleIdx] as string;</span>
  6714. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] AI 自动检测规模: ${title} -&gt; ${bookScale}`);</span>
  6715. <span class="cstat-no" title="statement not covered" > }</span>
  6716. <span class="cstat-no" title="statement not covered" > }</span>
  6717. &nbsp;
  6718. // 回填 AI 结果到数据库
  6719. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(bookScale!);</span>
  6720. <span class="cstat-no" title="statement not covered" > await bookStore.update(book.id.toString(), {</span>
  6721. <span class="cstat-no" title="statement not covered" > title: title!,</span>
  6722. <span class="cstat-no" title="statement not covered" > bookScale: bookScale!,</span>
  6723. <span class="cstat-no" title="statement not covered" > totalChapters: scaleConfig.isShortArticle ? 1 : scaleConfig.chapters,</span>
  6724. <span class="cstat-no" title="statement not covered" > estimatedWords: scaleConfig.totalWords,</span>
  6725. <span class="cstat-no" title="statement not covered" > });</span>
  6726. &nbsp;
  6727. // 确定生成层级并启动内容生成
  6728. <span class="cstat-no" title="statement not covered" > const genLevel = body.genLevel !== undefined</span>
  6729. <span class="cstat-no" title="statement not covered" > ? resolveGenLevel(bookScale!, body.genLevel)</span>
  6730. <span class="cstat-no" title="statement not covered" > : body.bookType &amp;&amp; body.bookType !== 'auto'</span>
  6731. <span class="cstat-no" title="statement not covered" > ? mapBookTypeToGenLevel(body.bookType)</span>
  6732. <span class="cstat-no" title="statement not covered" > : resolveGenLevel(bookScale!);</span>
  6733. &nbsp;
  6734. <span class="cstat-no" title="statement not covered" > await langGraphGenerator.generate(book.id.toString(), body.description, bookScale!, genLevel);</span>
  6735. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] 生成完成: bookId=${book.id}`);</span>
  6736. <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
  6737. <span class="cstat-no" title="statement not covered" > console.error(`[LangGraph] AI 准备或生成失败: bookId=${book.id}`, err);</span>
  6738. <span class="cstat-no" title="statement not covered" > bookStore.update(book.id.toString(), {</span>
  6739. <span class="cstat-no" title="statement not covered" > genStage: 'failed',</span>
  6740. <span class="cstat-no" title="statement not covered" > errorMsg: err instanceof Error ? err.message : '生成失败',</span>
  6741. <span class="cstat-no" title="statement not covered" > failedStage: 'outlining',</span>
  6742. <span class="cstat-no" title="statement not covered" > });</span>
  6743. <span class="cstat-no" title="statement not covered" > }</span>
  6744. <span class="cstat-no" title="statement not covered" > })();</span>
  6745. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6746. <span class="cstat-no" title="statement not covered" > console.error('启动失败:', error);</span>
  6747. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6748. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6749. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  6750. <span class="cstat-no" title="statement not covered" > message: error instanceof Error ? error.message : '启动失败',</span>
  6751. <span class="cstat-no" title="statement not covered" > };</span>
  6752. <span class="cstat-no" title="statement not covered" > }</span>
  6753. <span class="cstat-no" title="statement not covered" >});</span>
  6754. &nbsp;
  6755. /**
  6756. * 异步填充 AI 结果(交互模式使用,不启动生成)
  6757. */
  6758. <span class="cstat-no" title="statement not covered" >async function fillAiResultsAsync(</span>
  6759. <span class="cstat-no" title="statement not covered" > bookId: string,</span>
  6760. <span class="cstat-no" title="statement not covered" > description: string,</span>
  6761. <span class="cstat-no" title="statement not covered" > providedTitle?: string,</span>
  6762. <span class="cstat-no" title="statement not covered" > providedBookScale?: string,</span>
  6763. <span class="cstat-no" title="statement not covered" >): Promise&lt;void&gt; {</span>
  6764. <span class="cstat-no" title="statement not covered" > console.log(`[fillAiResultsAsync] 开始: bookId=${bookId}, providedTitle="${providedTitle}", providedBookScale="${providedBookScale}", desc前50字="${description?.substring(0, 50)}"`);</span>
  6765. <span class="cstat-no" title="statement not covered" > try {</span>
  6766. <span class="cstat-no" title="statement not covered" > let title = providedTitle;</span>
  6767. <span class="cstat-no" title="statement not covered" > let bookScale = providedBookScale;</span>
  6768. &nbsp;
  6769. <span class="cstat-no" title="statement not covered" > const needTitle = !title;</span>
  6770. <span class="cstat-no" title="statement not covered" > const needScale = !bookScale;</span>
  6771. &nbsp;
  6772. <span class="cstat-no" title="statement not covered" > const aiPromises: Promise&lt;any&gt;[] = [];</span>
  6773. <span class="cstat-no" title="statement not covered" > const titleIdx = needTitle ? aiPromises.push(autoGenerateTitle(description)) - 1 : -1;</span>
  6774. <span class="cstat-no" title="statement not covered" > const scaleIdx = needScale ? aiPromises.push(autoDetectBookType(title || '', description)) - 1 : -1;</span>
  6775. &nbsp;
  6776. <span class="cstat-no" title="statement not covered" > if (aiPromises.length &gt; 0) {</span>
  6777. <span class="cstat-no" title="statement not covered" > const results = await Promise.all(aiPromises);</span>
  6778. <span class="cstat-no" title="statement not covered" > if (titleIdx &gt;= 0) {</span>
  6779. <span class="cstat-no" title="statement not covered" > title = results[titleIdx] as string;</span>
  6780. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] AI 自动生成书名 (交互): "${title}"`);</span>
  6781. <span class="cstat-no" title="statement not covered" > }</span>
  6782. <span class="cstat-no" title="statement not covered" > if (scaleIdx &gt;= 0) {</span>
  6783. <span class="cstat-no" title="statement not covered" > bookScale = results[scaleIdx] as string;</span>
  6784. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] AI 自动检测规模 (交互): ${title} -&gt; ${bookScale}`);</span>
  6785. <span class="cstat-no" title="statement not covered" > }</span>
  6786. <span class="cstat-no" title="statement not covered" > }</span>
  6787. &nbsp;
  6788. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(bookScale!);</span>
  6789. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId.toString(), {</span>
  6790. <span class="cstat-no" title="statement not covered" > title: title!,</span>
  6791. <span class="cstat-no" title="statement not covered" > bookScale: bookScale!,</span>
  6792. <span class="cstat-no" title="statement not covered" > totalChapters: scaleConfig.isShortArticle ? 1 : scaleConfig.chapters,</span>
  6793. <span class="cstat-no" title="statement not covered" > estimatedWords: scaleConfig.totalWords,</span>
  6794. <span class="cstat-no" title="statement not covered" > });</span>
  6795. <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
  6796. <span class="cstat-no" title="statement not covered" > console.warn(`[LangGraph] AI 异步填充失败: bookId=${bookId}`, err);</span>
  6797. <span class="cstat-no" title="statement not covered" > }</span>
  6798. <span class="cstat-no" title="statement not covered" >}</span>
  6799. &nbsp;
  6800. /**
  6801. * GET /api/book-generator/langgraph/books
  6802. * 获取书籍列表
  6803. * 返回:公开的书籍(有公开音频)+ 当前用户自己的书籍
  6804. * 注意:此接口已废弃,请使用 /public-books 或 /my-books
  6805. */
  6806. <span class="cstat-no" title="statement not covered" >router.get('/books', optionalAuth, async (ctx: Context) =&gt; {</span>
  6807. <span class="cstat-no" title="statement not covered" > try {</span>
  6808. <span class="cstat-no" title="statement not covered" > const userId = ctx.state.user?.userId;</span>
  6809. <span class="cstat-no" title="statement not covered" > const userIdNum = userId ? parseInt(userId as string) : undefined;</span>
  6810. // 获取公开书籍(有公开音频的书籍)
  6811. <span class="cstat-no" title="statement not covered" > const publicBooks = await bookStore.getPublicBooks();</span>
  6812. // 如果用户已登录,获取用户自己的书籍
  6813. <span class="cstat-no" title="statement not covered" > let userBooks: any[] = [];</span>
  6814. <span class="cstat-no" title="statement not covered" > if (userIdNum) {</span>
  6815. <span class="cstat-no" title="statement not covered" > userBooks = await bookStore.getAllByUser(userIdNum, false);</span>
  6816. <span class="cstat-no" title="statement not covered" > }</span>
  6817. // 合并并去重(按 id)
  6818. <span class="cstat-no" title="statement not covered" > const bookMap = new Map&lt;string, any&gt;();</span>
  6819. <span class="cstat-no" title="statement not covered" > publicBooks.forEach(b =&gt; bookMap.set(b.id, b));</span>
  6820. <span class="cstat-no" title="statement not covered" > userBooks.forEach(b =&gt; {</span>
  6821. <span class="cstat-no" title="statement not covered" > if (!bookMap.has(b.id)) {</span>
  6822. <span class="cstat-no" title="statement not covered" > bookMap.set(b.id, b);</span>
  6823. <span class="cstat-no" title="statement not covered" > }</span>
  6824. <span class="cstat-no" title="statement not covered" > });</span>
  6825. <span class="cstat-no" title="statement not covered" > const books = Array.from(bookMap.values());</span>
  6826. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: 'success', data: { books } };</span>
  6827. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6828. <span class="cstat-no" title="statement not covered" > console.error('查询失败:', error);</span>
  6829. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6830. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '查询失败' };</span>
  6831. <span class="cstat-no" title="statement not covered" > }</span>
  6832. <span class="cstat-no" title="statement not covered" >});</span>
  6833. &nbsp;
  6834. /**
  6835. * GET /api/book-generator/langgraph/public-books
  6836. * 获取公开书籍列表(首页专用)
  6837. * 只返回有公开音频的书籍
  6838. */
  6839. <span class="cstat-no" title="statement not covered" >router.get('/public-books', async (ctx: Context) =&gt; {</span>
  6840. <span class="cstat-no" title="statement not covered" > try {</span>
  6841. <span class="cstat-no" title="statement not covered" > const publicBooks = await bookStore.getPublicBooks();</span>
  6842. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: 'success', data: { books: publicBooks } };</span>
  6843. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6844. <span class="cstat-no" title="statement not covered" > console.error('查询公开书籍失败:', error);</span>
  6845. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6846. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '查询失败' };</span>
  6847. <span class="cstat-no" title="statement not covered" > }</span>
  6848. <span class="cstat-no" title="statement not covered" >});</span>
  6849. &nbsp;
  6850. /**
  6851. * GET /api/book-generator/langgraph/my-books
  6852. * 获取当前用户自己的书籍列表(管理页专用)
  6853. * 只返回当前用户创建的书籍
  6854. */
  6855. <span class="cstat-no" title="statement not covered" >router.get('/my-books', optionalAuth, async (ctx: Context) =&gt; {</span>
  6856. <span class="cstat-no" title="statement not covered" > try {</span>
  6857. <span class="cstat-no" title="statement not covered" > const userId = ctx.state.user?.userId;</span>
  6858. <span class="cstat-no" title="statement not covered" > if (!userId) {</span>
  6859. <span class="cstat-no" title="statement not covered" > ctx.status = 401;</span>
  6860. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '请先登录' };</span>
  6861. <span class="cstat-no" title="statement not covered" > return;</span>
  6862. <span class="cstat-no" title="statement not covered" > }</span>
  6863. <span class="cstat-no" title="statement not covered" > const userBooks = await bookStore.getAllByUser(parseInt(userId as string), false);</span>
  6864. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: 'success', data: { books: userBooks } };</span>
  6865. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6866. <span class="cstat-no" title="statement not covered" > console.error('查询用户书籍失败:', error);</span>
  6867. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6868. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '查询失败' };</span>
  6869. <span class="cstat-no" title="statement not covered" > }</span>
  6870. <span class="cstat-no" title="statement not covered" >});</span>
  6871. &nbsp;
  6872. /**
  6873. * PUT /api/book-generator/langgraph/books/:id/publish
  6874. * 切换书籍公开状态
  6875. */
  6876. <span class="cstat-no" title="statement not covered" >router.put('/books/:id/publish', optionalAuth, async (ctx: Context) =&gt; {</span>
  6877. <span class="cstat-no" title="statement not covered" > try {</span>
  6878. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  6879. <span class="cstat-no" title="statement not covered" > const newStatus = await bookStore.togglePublish(bookId);</span>
  6880. <span class="cstat-no" title="statement not covered" > ctx.body = { </span>
  6881. <span class="cstat-no" title="statement not covered" > code: 0, </span>
  6882. <span class="cstat-no" title="statement not covered" > message: 'success', </span>
  6883. <span class="cstat-no" title="statement not covered" > data: { isPublished: newStatus } </span>
  6884. <span class="cstat-no" title="statement not covered" > };</span>
  6885. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6886. <span class="cstat-no" title="statement not covered" > console.error('切换发布状态失败:', error);</span>
  6887. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6888. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '操作失败' };</span>
  6889. <span class="cstat-no" title="statement not covered" > }</span>
  6890. <span class="cstat-no" title="statement not covered" >});</span>
  6891. &nbsp;
  6892. /**
  6893. * GET /api/book-generator/langgraph/books/:id
  6894. * 获取书籍详情
  6895. * 支持公开过滤:?filterPublic=true&amp;userId=1
  6896. */
  6897. <span class="cstat-no" title="statement not covered" >router.get('/books/:id', optionalAuth, async (ctx: Context) =&gt; {</span>
  6898. <span class="cstat-no" title="statement not covered" > try {</span>
  6899. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  6900. <span class="cstat-no" title="statement not covered" > const userId = ctx.state.user?.userId || TEST_USER_ID;</span>
  6901. <span class="cstat-no" title="statement not covered" > const filterPublic = ctx.query.filterPublic === 'true';</span>
  6902. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId, filterPublic, parseInt(userId as string));</span>
  6903. &nbsp;
  6904. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  6905. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  6906. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  6907. <span class="cstat-no" title="statement not covered" > return;</span>
  6908. <span class="cstat-no" title="statement not covered" > }</span>
  6909. &nbsp;
  6910. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: 'success', data: { book } };</span>
  6911. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6912. <span class="cstat-no" title="statement not covered" > console.error('查询失败:', error);</span>
  6913. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6914. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '查询失败' };</span>
  6915. <span class="cstat-no" title="statement not covered" > }</span>
  6916. <span class="cstat-no" title="statement not covered" >});</span>
  6917. &nbsp;
  6918. /**
  6919. * GET /api/book-generator/langgraph/books/:id/progress
  6920. * 获取书籍生成进度
  6921. */
  6922. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/progress', async (ctx: Context) =&gt; {</span>
  6923. <span class="cstat-no" title="statement not covered" > try {</span>
  6924. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  6925. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  6926. &nbsp;
  6927. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  6928. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  6929. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  6930. <span class="cstat-no" title="statement not covered" > return;</span>
  6931. <span class="cstat-no" title="statement not covered" > }</span>
  6932. &nbsp;
  6933. // 计算实际进度(基于章节完成情况)
  6934. <span class="cstat-no" title="statement not covered" > const completedChapters = book.chapters.filter((c) =&gt; c.genStage === 'video_completed').length;</span>
  6935. <span class="cstat-no" title="statement not covered" > const totalChapters = book.outline?.chapters?.length || book.totalChapters || 0;</span>
  6936. &nbsp;
  6937. // 查找当前正在生成的章节
  6938. <span class="cstat-no" title="statement not covered" > const currentGenerating = book.chapters.find(</span>
  6939. <span class="cstat-no" title="statement not covered" > (c) =&gt; c.genStage === 'content_generating' || c.genStage === 'audio_generating' || c.genStage === 'video_generating'</span>
  6940. <span class="cstat-no" title="statement not covered" > );</span>
  6941. <span class="cstat-no" title="statement not covered" > const currentChapter = currentGenerating</span>
  6942. <span class="cstat-no" title="statement not covered" > ? { number: currentGenerating.number, title: currentGenerating.title, level: currentGenerating.level }</span>
  6943. <span class="cstat-no" title="statement not covered" > : null;</span>
  6944. &nbsp;
  6945. // 如果有大纲,使用大纲章节数计算进度
  6946. <span class="cstat-no" title="statement not covered" > let progress = book.progress;</span>
  6947. <span class="cstat-no" title="statement not covered" > if (totalChapters &gt; 0 &amp;&amp; book.genStage !== 'video_completed') {</span>
  6948. <span class="cstat-no" title="statement not covered" > progress = Math.round((completedChapters / totalChapters) * 100);</span>
  6949. <span class="cstat-no" title="statement not covered" > }</span>
  6950. &nbsp;
  6951. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  6952. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  6953. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  6954. <span class="cstat-no" title="statement not covered" > data: {</span>
  6955. <span class="cstat-no" title="statement not covered" > bookId,</span>
  6956. <span class="cstat-no" title="statement not covered" > genStage: book.genStage,</span>
  6957. <span class="cstat-no" title="statement not covered" > progress,</span>
  6958. <span class="cstat-no" title="statement not covered" > completedChapters,</span>
  6959. <span class="cstat-no" title="statement not covered" > totalChapters,</span>
  6960. <span class="cstat-no" title="statement not covered" > currentChapter,</span>
  6961. <span class="cstat-no" title="statement not covered" > },</span>
  6962. <span class="cstat-no" title="statement not covered" > };</span>
  6963. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6964. <span class="cstat-no" title="statement not covered" > console.error('查询进度失败:', error);</span>
  6965. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6966. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '查询失败' };</span>
  6967. <span class="cstat-no" title="statement not covered" > }</span>
  6968. <span class="cstat-no" title="statement not covered" >});</span>
  6969. &nbsp;
  6970. /**
  6971. * DELETE /api/book-generator/langgraph/books/:id
  6972. * 删除书籍
  6973. */
  6974. <span class="cstat-no" title="statement not covered" >router.delete('/books/:id', async (ctx: Context) =&gt; {</span>
  6975. <span class="cstat-no" title="statement not covered" > try {</span>
  6976. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  6977. <span class="cstat-no" title="statement not covered" > await bookStore.delete(bookId);</span>
  6978. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: '删除成功' };</span>
  6979. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  6980. <span class="cstat-no" title="statement not covered" > console.error('删除失败:', error);</span>
  6981. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  6982. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '删除失败' };</span>
  6983. <span class="cstat-no" title="statement not covered" > }</span>
  6984. <span class="cstat-no" title="statement not covered" >});</span>
  6985. &nbsp;
  6986. /**
  6987. * POST /api/book-generator/langgraph/books/:id/generate
  6988. * 对已有书籍使用 LangGraph 生成
  6989. */
  6990. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/generate', optionalAuth, async (ctx: Context) =&gt; {</span>
  6991. <span class="cstat-no" title="statement not covered" > try {</span>
  6992. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  6993. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph Generate] 收到请求 bookId=${bookId}`);</span>
  6994. <span class="cstat-no" title="statement not covered" > const body = (ctx.request.body || {}) as { bookScale?: string; genLevel?: number };</span>
  6995. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  6996. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph Generate] book对象:`, book ? '存在' : 'null');</span>
  6997. &nbsp;
  6998. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  6999. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7000. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7001. <span class="cstat-no" title="statement not covered" > return;</span>
  7002. <span class="cstat-no" title="statement not covered" > }</span>
  7003. &nbsp;
  7004. // ========== 确定 bookScale ==========
  7005. // 优先级:
  7006. // 1) 请求显式指定(body.bookScale)→ 用户选的,直接用
  7007. // 2) AI 根据描述自动检测 → LLM 判断
  7008. // 3) 书籍已有规模 → 沿用
  7009. // 4) 兜底 → 1000(最小规模)
  7010. <span class="cstat-no" title="statement not covered" > let bookScale: string | undefined;</span>
  7011. &nbsp;
  7012. <span class="cstat-no" title="statement not covered" > if (body.bookScale &amp;&amp; BOOK_TYPE_CONFIG[body.bookScale]) {</span>
  7013. // 用户在当前请求中显式选了规模
  7014. <span class="cstat-no" title="statement not covered" > bookScale = body.bookScale;</span>
  7015. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph Generate] 使用请求指定的 bookScale=${bookScale}`);</span>
  7016. <span class="cstat-no" title="statement not covered" > } else {</span>
  7017. // 未显式选择 → 让 AI 根据描述判断
  7018. <span class="cstat-no" title="statement not covered" > const desc = book.description || '';</span>
  7019. <span class="cstat-no" title="statement not covered" > try {</span>
  7020. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph Generate] AI 自动检测规模...`);</span>
  7021. <span class="cstat-no" title="statement not covered" > bookScale = await autoDetectBookType(book.title || '', desc);</span>
  7022. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph Generate] AI 检测结果 → bookScale=${bookScale}`);</span>
  7023. <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
  7024. <span class="cstat-no" title="statement not covered" > console.warn(`[LangGraph Generate] AI 检测失败,回退:`, e);</span>
  7025. <span class="cstat-no" title="statement not covered" > }</span>
  7026. &nbsp;
  7027. // AI 失败或返回无效值 → 用书籍已保存的
  7028. <span class="cstat-no" title="statement not covered" > if (!bookScale || !BOOK_TYPE_CONFIG[bookScale]) {</span>
  7029. <span class="cstat-no" title="statement not covered" > bookScale = book.bookScale &amp;&amp; BOOK_TYPE_CONFIG[book.bookScale] ? book.bookScale : undefined;</span>
  7030. <span class="cstat-no" title="statement not covered" > }</span>
  7031. <span class="cstat-no" title="statement not covered" > }</span>
  7032. &nbsp;
  7033. // 最终兜底:用最小规模(1000字),避免误判生成大量无用内容
  7034. <span class="cstat-no" title="statement not covered" > bookScale = bookScale &amp;&amp; BOOK_TYPE_CONFIG[bookScale] ? bookScale : '1000';</span>
  7035. &nbsp;
  7036. // 持久化检测结果
  7037. <span class="cstat-no" title="statement not covered" > if (bookScale !== book.bookScale) {</span>
  7038. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId, { bookScale });</span>
  7039. <span class="cstat-no" title="statement not covered" > }</span>
  7040. <span class="cstat-no" title="statement not covered" > const genLevel = resolveGenLevel(bookScale, body.genLevel, book.description);</span>
  7041. &nbsp;
  7042. // ========== 生成前配额检查 ==========
  7043. <span class="cstat-no" title="statement not covered" > const userId = ctx.state.user?.userId ? parseInt(ctx.state.user.userId as string) : (book.userId || parseInt(TEST_USER_ID));</span>
  7044. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(bookScale);</span>
  7045. <span class="cstat-no" title="statement not covered" > const totalWords = scaleConfig.totalWords;</span>
  7046. <span class="cstat-no" title="statement not covered" > const audioQuota = await checkAudioQuota(userId, totalWords);</span>
  7047. <span class="cstat-no" title="statement not covered" > if (!audioQuota.allowed) {</span>
  7048. <span class="cstat-no" title="statement not covered" > ctx.status = 403;</span>
  7049. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7050. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  7051. <span class="cstat-no" title="statement not covered" > message: audioQuota.reason,</span>
  7052. <span class="cstat-no" title="statement not covered" > data: {</span>
  7053. <span class="cstat-no" title="statement not covered" > estimatedWords: totalWords,</span>
  7054. <span class="cstat-no" title="statement not covered" > estimatedAudioMinutes: estimateAudioMinutesFromWords(totalWords),</span>
  7055. <span class="cstat-no" title="statement not covered" > remainingMinutes: audioQuota.remainingMinutes,</span>
  7056. <span class="cstat-no" title="statement not covered" > totalMinutes: audioQuota.totalMinutes,</span>
  7057. <span class="cstat-no" title="statement not covered" > }</span>
  7058. <span class="cstat-no" title="statement not covered" > };</span>
  7059. <span class="cstat-no" title="statement not covered" > return;</span>
  7060. <span class="cstat-no" title="statement not covered" > }</span>
  7061. &nbsp;
  7062. // 防止重复生成:如果书籍正在生成中,拒绝请求
  7063. <span class="cstat-no" title="statement not covered" > if (book.genStage === 'content_generating' || book.genStage === 'audio_generating' || book.genStage === 'video_generating') {</span>
  7064. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph Generate] 书籍正在生成中,拒绝重复请求 bookId=${bookId}`);</span>
  7065. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  7066. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7067. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  7068. <span class="cstat-no" title="statement not covered" > message: '书籍正在生成中,请勿重复提交',</span>
  7069. <span class="cstat-no" title="statement not covered" > data: {</span>
  7070. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7071. <span class="cstat-no" title="statement not covered" > genStage: book.genStage,</span>
  7072. <span class="cstat-no" title="statement not covered" > progress: book.progress,</span>
  7073. <span class="cstat-no" title="statement not covered" > }</span>
  7074. <span class="cstat-no" title="statement not covered" > };</span>
  7075. <span class="cstat-no" title="statement not covered" > return;</span>
  7076. <span class="cstat-no" title="statement not covered" > }</span>
  7077. &nbsp;
  7078. // 异步生成(跳过队列,开发环境下队列不可靠)
  7079. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId, { genStage: 'outlining' });</span>
  7080. &nbsp;
  7081. <span class="cstat-no" title="statement not covered" > langGraphGenerator.generate(bookId, book.description, bookScale, genLevel)</span>
  7082. <span class="cstat-no" title="statement not covered" > .then(() =&gt; {</span>
  7083. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] 生成完成: bookId=${bookId}`);</span>
  7084. <span class="cstat-no" title="statement not covered" > })</span>
  7085. <span class="cstat-no" title="statement not covered" > .catch(err =&gt; {</span>
  7086. <span class="cstat-no" title="statement not covered" > console.error(`[LangGraph] 生成失败: bookId=${bookId}`, err);</span>
  7087. <span class="cstat-no" title="statement not covered" > bookStore.update(bookId, {</span>
  7088. <span class="cstat-no" title="statement not covered" > genStage: 'failed', failedStage: 'outlining',</span>
  7089. <span class="cstat-no" title="statement not covered" > errorMsg: err instanceof Error ? err.message : '生成失败',</span>
  7090. <span class="cstat-no" title="statement not covered" > });</span>
  7091. <span class="cstat-no" title="statement not covered" > });</span>
  7092. &nbsp;
  7093. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7094. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7095. <span class="cstat-no" title="statement not covered" > message: 'LangGraph 生成任务已启动',</span>
  7096. <span class="cstat-no" title="statement not covered" > data: { bookId, genStage: 'outlining', mode: 'async' },</span>
  7097. <span class="cstat-no" title="statement not covered" > };</span>
  7098. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7099. <span class="cstat-no" title="statement not covered" > console.error('启动失败:', error);</span>
  7100. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7101. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7102. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  7103. <span class="cstat-no" title="statement not covered" > message: error instanceof Error ? error.message : '启动失败',</span>
  7104. <span class="cstat-no" title="statement not covered" > };</span>
  7105. <span class="cstat-no" title="statement not covered" > }</span>
  7106. <span class="cstat-no" title="statement not covered" >});</span>
  7107. &nbsp;
  7108. /**
  7109. * POST /api/book-generator/langgraph/books/:id/audio
  7110. * 批量生成书籍所有小节的音频
  7111. */
  7112. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/audio', async (ctx: Context) =&gt; {</span>
  7113. <span class="cstat-no" title="statement not covered" > try {</span>
  7114. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7115. <span class="cstat-no" title="statement not covered" > const { voiceId = 'longyingling_v3' } = ctx.request.body as { voiceId?: string };</span>
  7116. &nbsp;
  7117. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7118. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7119. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7120. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7121. <span class="cstat-no" title="statement not covered" > return;</span>
  7122. <span class="cstat-no" title="statement not covered" > }</span>
  7123. &nbsp;
  7124. // 获取章节树
  7125. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7126. &nbsp;
  7127. // 动态获取叶节点层级(最大level值)
  7128. <span class="cstat-no" title="statement not covered" > const maxLevel = chapters.length &gt; 0</span>
  7129. <span class="cstat-no" title="statement not covered" > ? Math.max(...chapters.map((c: any) =&gt; c.level || 0))</span>
  7130. <span class="cstat-no" title="statement not covered" > : 0;</span>
  7131. &nbsp;
  7132. <span class="cstat-no" title="statement not covered" > if (maxLevel === 0) {</span>
  7133. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '没有章节' };</span>
  7134. <span class="cstat-no" title="statement not covered" > return;</span>
  7135. <span class="cstat-no" title="statement not covered" > }</span>
  7136. &nbsp;
  7137. // 获取叶节点(最大level的所有节点)
  7138. <span class="cstat-no" title="statement not covered" > const leafNodes = chapters.filter((c: any) =&gt; c.level === maxLevel);</span>
  7139. &nbsp;
  7140. // 检查内容状态 - 叶节点必须有content且genStage为content_completed
  7141. <span class="cstat-no" title="statement not covered" > const leafNodesWithContent = leafNodes.filter((c: any) =&gt; c.content &amp;&amp; c.genStage === 'content_completed');</span>
  7142. &nbsp;
  7143. <span class="cstat-no" title="statement not covered" > if (leafNodes.length === 0) {</span>
  7144. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: `没有${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'}` };</span>
  7145. <span class="cstat-no" title="statement not covered" > return;</span>
  7146. <span class="cstat-no" title="statement not covered" > }</span>
  7147. &nbsp;
  7148. <span class="cstat-no" title="statement not covered" > if (leafNodesWithContent.length === 0) {</span>
  7149. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7150. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  7151. <span class="cstat-no" title="statement not covered" > message: `没有内容生成完成的${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'},请先生成内容`,</span>
  7152. <span class="cstat-no" title="statement not covered" > data: {</span>
  7153. <span class="cstat-no" title="statement not covered" > totalSubsections: leafNodes.length,</span>
  7154. <span class="cstat-no" title="statement not covered" > completedSubsections: 0,</span>
  7155. <span class="cstat-no" title="statement not covered" > }</span>
  7156. <span class="cstat-no" title="statement not covered" > };</span>
  7157. <span class="cstat-no" title="statement not covered" > return;</span>
  7158. <span class="cstat-no" title="statement not covered" > }</span>
  7159. &nbsp;
  7160. <span class="cstat-no" title="statement not covered" > console.log(`[Audio] 书籍 ${bookId} 共有 ${leafNodes.length} 个${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'},其中 ${leafNodesWithContent.length} 个内容已生成完成`);</span>
  7161. &nbsp;
  7162. // 异步生成所有叶节点音频
  7163. <span class="cstat-no" title="statement not covered" > for (const sub of leafNodesWithContent) {</span>
  7164. <span class="cstat-no" title="statement not covered" > bookStore.generateChapterAudioById(sub.id, book.userId || 1).catch(err =&gt; {</span>
  7165. <span class="cstat-no" title="statement not covered" > console.error(`[Audio] ${maxLevel === 3 ? '小节' : '节'}${sub.number}音频生成失败:`, err);</span>
  7166. <span class="cstat-no" title="statement not covered" > });</span>
  7167. <span class="cstat-no" title="statement not covered" > }</span>
  7168. &nbsp;
  7169. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7170. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7171. <span class="cstat-no" title="statement not covered" > message: '音频生成任务已启动',</span>
  7172. <span class="cstat-no" title="statement not covered" > data: {</span>
  7173. <span class="cstat-no" title="statement not covered" > totalSubsections: leafNodesWithContent.length,</span>
  7174. <span class="cstat-no" title="statement not covered" > taskId: `audio_${bookId}_${Date.now()}`,</span>
  7175. <span class="cstat-no" title="statement not covered" > },</span>
  7176. <span class="cstat-no" title="statement not covered" > };</span>
  7177. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7178. <span class="cstat-no" title="statement not covered" > console.error('音频生成失败:', error);</span>
  7179. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7180. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '音频生成失败' };</span>
  7181. <span class="cstat-no" title="statement not covered" > }</span>
  7182. <span class="cstat-no" title="statement not covered" >});</span>
  7183. &nbsp;
  7184. /**
  7185. * POST /api/book-generator/langgraph/books/:id/audio/cancel
  7186. * 取消书籍所有章节的音频生成
  7187. */
  7188. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/audio/cancel', async (ctx: Context) =&gt; {</span>
  7189. <span class="cstat-no" title="statement not covered" > try {</span>
  7190. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7191. &nbsp;
  7192. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7193. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7194. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7195. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7196. <span class="cstat-no" title="statement not covered" > return;</span>
  7197. <span class="cstat-no" title="statement not covered" > }</span>
  7198. &nbsp;
  7199. <span class="cstat-no" title="statement not covered" > const result = await cancelAudioGeneration(bookId);</span>
  7200. &nbsp;
  7201. <span class="cstat-no" title="statement not covered" > if (result.cancelledCount === 0) {</span>
  7202. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7203. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7204. <span class="cstat-no" title="statement not covered" > message: '没有正在运行的音频生成任务',</span>
  7205. <span class="cstat-no" title="statement not covered" > data: result,</span>
  7206. <span class="cstat-no" title="statement not covered" > };</span>
  7207. <span class="cstat-no" title="statement not covered" > return;</span>
  7208. <span class="cstat-no" title="statement not covered" > }</span>
  7209. &nbsp;
  7210. <span class="cstat-no" title="statement not covered" > console.log(`[Audio] 书籍 ${bookId} 取消音频生成,已取消 ${result.cancelledCount} 个任务,回退 ${result.rolledBackChapters.length} 个章节`);</span>
  7211. &nbsp;
  7212. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7213. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7214. <span class="cstat-no" title="statement not covered" > message: `已取消 ${result.cancelledCount} 个音频生成任务`,</span>
  7215. <span class="cstat-no" title="statement not covered" > data: result,</span>
  7216. <span class="cstat-no" title="statement not covered" > };</span>
  7217. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7218. <span class="cstat-no" title="statement not covered" > console.error('取消音频生成失败:', error);</span>
  7219. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7220. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '取消失败' };</span>
  7221. <span class="cstat-no" title="statement not covered" > }</span>
  7222. <span class="cstat-no" title="statement not covered" >});</span>
  7223. &nbsp;
  7224. /**
  7225. * GET /api/book-generator/langgraph/books/:id/video-status
  7226. * 获取书籍视频生成状态(用于前端轮询)
  7227. */
  7228. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/video-status', async (ctx: Context) =&gt; {</span>
  7229. <span class="cstat-no" title="statement not covered" > try {</span>
  7230. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7231. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7232. &nbsp;
  7233. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7234. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7235. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7236. <span class="cstat-no" title="statement not covered" > return;</span>
  7237. <span class="cstat-no" title="statement not covered" > }</span>
  7238. &nbsp;
  7239. // 获取章节树
  7240. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7241. &nbsp;
  7242. // 动态获取叶节点层级
  7243. <span class="cstat-no" title="statement not covered" > const maxLevel = chapters.length &gt; 0</span>
  7244. <span class="cstat-no" title="statement not covered" > ? Math.max(...chapters.map((c: any) =&gt; c.level || 0))</span>
  7245. <span class="cstat-no" title="statement not covered" > : 0;</span>
  7246. &nbsp;
  7247. // 获取叶节点
  7248. <span class="cstat-no" title="statement not covered" > const leafNodes = chapters.filter((c: any) =&gt; c.level === maxLevel);</span>
  7249. &nbsp;
  7250. // 统计视频状态
  7251. <span class="cstat-no" title="statement not covered" > const total = leafNodes.length;</span>
  7252. <span class="cstat-no" title="statement not covered" > const completed = leafNodes.filter((c: any) =&gt; c.videoUrl &amp;&amp; c.videoUrl !== '').length;</span>
  7253. <span class="cstat-no" title="statement not covered" > const pending = leafNodes.filter((c: any) =&gt; !c.videoUrl || c.videoUrl === '').length;</span>
  7254. &nbsp;
  7255. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7256. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7257. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  7258. <span class="cstat-no" title="statement not covered" > data: {</span>
  7259. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7260. <span class="cstat-no" title="statement not covered" > total,</span>
  7261. <span class="cstat-no" title="statement not covered" > completed,</span>
  7262. <span class="cstat-no" title="statement not covered" > pending,</span>
  7263. <span class="cstat-no" title="statement not covered" > allCompleted: completed &gt;= total &amp;&amp; total &gt; 0,</span>
  7264. <span class="cstat-no" title="statement not covered" > },</span>
  7265. <span class="cstat-no" title="statement not covered" > };</span>
  7266. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7267. <span class="cstat-no" title="statement not covered" > console.error('获取视频状态失败:', error);</span>
  7268. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7269. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '获取失败' };</span>
  7270. <span class="cstat-no" title="statement not covered" > }</span>
  7271. <span class="cstat-no" title="statement not covered" >});</span>
  7272. &nbsp;
  7273. /**
  7274. * GET /api/book-generator/langgraph/books/:id/audio-status
  7275. * 获取书籍音频生成状态(用于前端轮询)
  7276. */
  7277. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/audio-status', async (ctx: Context) =&gt; {</span>
  7278. <span class="cstat-no" title="statement not covered" > try {</span>
  7279. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7280. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7281. &nbsp;
  7282. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7283. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7284. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7285. <span class="cstat-no" title="statement not covered" > return;</span>
  7286. <span class="cstat-no" title="statement not covered" > }</span>
  7287. &nbsp;
  7288. // 获取章节树
  7289. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7290. &nbsp;
  7291. // 动态获取叶节点层级
  7292. <span class="cstat-no" title="statement not covered" > const maxLevel = chapters.length &gt; 0</span>
  7293. <span class="cstat-no" title="statement not covered" > ? Math.max(...chapters.map((c: any) =&gt; c.level || 0))</span>
  7294. <span class="cstat-no" title="statement not covered" > : 0;</span>
  7295. &nbsp;
  7296. // 获取叶节点
  7297. <span class="cstat-no" title="statement not covered" > const leafNodes = chapters.filter((c: any) =&gt; c.level === maxLevel);</span>
  7298. &nbsp;
  7299. // 统计音频状态
  7300. <span class="cstat-no" title="statement not covered" > const total = leafNodes.length;</span>
  7301. <span class="cstat-no" title="statement not covered" > const completed = leafNodes.filter((c: any) =&gt; c.audioUrl &amp;&amp; c.audioUrl !== '').length;</span>
  7302. <span class="cstat-no" title="statement not covered" > const pending = leafNodes.filter((c: any) =&gt; !c.audioUrl || c.audioUrl === '').length;</span>
  7303. &nbsp;
  7304. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7305. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7306. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  7307. <span class="cstat-no" title="statement not covered" > data: {</span>
  7308. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7309. <span class="cstat-no" title="statement not covered" > total,</span>
  7310. <span class="cstat-no" title="statement not covered" > completed,</span>
  7311. <span class="cstat-no" title="statement not covered" > pending,</span>
  7312. <span class="cstat-no" title="statement not covered" > allCompleted: completed &gt;= total &amp;&amp; total &gt; 0,</span>
  7313. <span class="cstat-no" title="statement not covered" > },</span>
  7314. <span class="cstat-no" title="statement not covered" > };</span>
  7315. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7316. <span class="cstat-no" title="statement not covered" > console.error('获取音频状态失败:', error);</span>
  7317. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7318. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '获取失败' };</span>
  7319. <span class="cstat-no" title="statement not covered" > }</span>
  7320. <span class="cstat-no" title="statement not covered" >});</span>
  7321. &nbsp;
  7322. /**
  7323. * GET /api/book-generator/langgraph/books/:id/failed-chapters
  7324. * 获取生成失败的小节列表
  7325. */
  7326. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/failed-chapters', async (ctx: Context) =&gt; {</span>
  7327. <span class="cstat-no" title="statement not covered" > try {</span>
  7328. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7329. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7330. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7331. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7332. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7333. <span class="cstat-no" title="statement not covered" > return;</span>
  7334. <span class="cstat-no" title="statement not covered" > }</span>
  7335. &nbsp;
  7336. // 获取所有失败的小节
  7337. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7338. <span class="cstat-no" title="statement not covered" > const failedSubsections = chapters.filter(c =&gt; c.genStage === 'failed');</span>
  7339. &nbsp;
  7340. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7341. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7342. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  7343. <span class="cstat-no" title="statement not covered" > data: {</span>
  7344. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7345. <span class="cstat-no" title="statement not covered" > failedCount: failedSubsections.length,</span>
  7346. <span class="cstat-no" title="statement not covered" > failedChapters: failedSubsections.map(c =&gt; ({</span>
  7347. <span class="cstat-no" title="statement not covered" > id: c.id,</span>
  7348. <span class="cstat-no" title="statement not covered" > number: c.number,</span>
  7349. <span class="cstat-no" title="statement not covered" > title: c.title,</span>
  7350. <span class="cstat-no" title="statement not covered" > level: c.level,</span>
  7351. <span class="cstat-no" title="statement not covered" > errorMsg: c.errorMsg,</span>
  7352. <span class="cstat-no" title="statement not covered" > parentId: c.parentId,</span>
  7353. <span class="cstat-no" title="statement not covered" > })),</span>
  7354. <span class="cstat-no" title="statement not covered" > },</span>
  7355. <span class="cstat-no" title="statement not covered" > };</span>
  7356. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7357. <span class="cstat-no" title="statement not covered" > console.error('获取失败小节失败:', error);</span>
  7358. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7359. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '获取失败' };</span>
  7360. <span class="cstat-no" title="statement not covered" > }</span>
  7361. <span class="cstat-no" title="statement not covered" >});</span>
  7362. &nbsp;
  7363. /**
  7364. * POST /api/book-generator/langgraph/books/:id/resume
  7365. * 从断点处继续生成(重试失败的小节)
  7366. */
  7367. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/resume', async (ctx: Context) =&gt; {</span>
  7368. <span class="cstat-no" title="statement not covered" > try {</span>
  7369. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7370. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7371. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7372. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7373. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7374. <span class="cstat-no" title="statement not covered" > return;</span>
  7375. <span class="cstat-no" title="statement not covered" > }</span>
  7376. &nbsp;
  7377. <span class="cstat-no" title="statement not covered" > if (book.genStage === 'video_completed') {</span>
  7378. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍已生成完成,无需继续' };</span>
  7379. <span class="cstat-no" title="statement not covered" > return;</span>
  7380. <span class="cstat-no" title="statement not covered" > }</span>
  7381. &nbsp;
  7382. // 获取失败的小节
  7383. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7384. <span class="cstat-no" title="statement not covered" > const failedSubsections = chapters.filter(c =&gt; c.genStage === 'failed');</span>
  7385. &nbsp;
  7386. <span class="cstat-no" title="statement not covered" > if (failedSubsections.length === 0) {</span>
  7387. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '没有失败的小节需要重试' };</span>
  7388. <span class="cstat-no" title="statement not covered" > return;</span>
  7389. <span class="cstat-no" title="statement not covered" > }</span>
  7390. &nbsp;
  7391. // 重置失败小节的状态为 pending
  7392. <span class="cstat-no" title="statement not covered" > for (const sub of failedSubsections) {</span>
  7393. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(sub.id, {</span>
  7394. <span class="cstat-no" title="statement not covered" > genStage: 'idle',</span>
  7395. <span class="cstat-no" title="statement not covered" > errorMsg: null,</span>
  7396. <span class="cstat-no" title="statement not covered" > content: null,</span>
  7397. <span class="cstat-no" title="statement not covered" > });</span>
  7398. <span class="cstat-no" title="statement not covered" > }</span>
  7399. &nbsp;
  7400. // 直接重新生成(跳过队列)
  7401. <span class="cstat-no" title="statement not covered" > const { langGraphGenerator } = await import('./index.js');</span>
  7402. <span class="cstat-no" title="statement not covered" > langGraphGenerator.generate(</span>
  7403. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7404. <span class="cstat-no" title="statement not covered" > book.description || book.title,</span>
  7405. <span class="cstat-no" title="statement not covered" > book.bookScale || '1000'</span>
  7406. <span class="cstat-no" title="statement not covered" > ).then(() =&gt; {</span>
  7407. <span class="cstat-no" title="statement not covered" > console.log(`[LangGraph] 续生成完成: bookId=${bookId}`);</span>
  7408. <span class="cstat-no" title="statement not covered" > }).catch(err =&gt; {</span>
  7409. <span class="cstat-no" title="statement not covered" > console.error(`[LangGraph] 续生成失败: bookId=${bookId}`, err);</span>
  7410. <span class="cstat-no" title="statement not covered" > });</span>
  7411. &nbsp;
  7412. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7413. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7414. <span class="cstat-no" title="statement not covered" > message: `已重启生成,将重试 ${failedSubsections.length} 个失败的小节`,</span>
  7415. <span class="cstat-no" title="statement not covered" > data: {</span>
  7416. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7417. <span class="cstat-no" title="statement not covered" > retryCount: failedSubsections.length,</span>
  7418. <span class="cstat-no" title="statement not covered" > genStage: 'resuming',</span>
  7419. <span class="cstat-no" title="statement not covered" > },</span>
  7420. <span class="cstat-no" title="statement not covered" > };</span>
  7421. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7422. <span class="cstat-no" title="statement not covered" > console.error('继续生成失败:', error);</span>
  7423. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7424. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '继续生成失败' };</span>
  7425. <span class="cstat-no" title="statement not covered" > }</span>
  7426. <span class="cstat-no" title="statement not covered" >});</span>
  7427. &nbsp;
  7428. /**
  7429. * POST /api/book-generator/langgraph/books/:id/retry-chapter
  7430. * 单独重试某个失败的小节
  7431. */
  7432. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/retry-chapter', async (ctx: Context) =&gt; {</span>
  7433. <span class="cstat-no" title="statement not covered" > try {</span>
  7434. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7435. <span class="cstat-no" title="statement not covered" > const { chapterId } = ctx.request.body as { chapterId: number };</span>
  7436. &nbsp;
  7437. <span class="cstat-no" title="statement not covered" > if (!chapterId) {</span>
  7438. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  7439. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '请提供章节 ID' };</span>
  7440. <span class="cstat-no" title="statement not covered" > return;</span>
  7441. <span class="cstat-no" title="statement not covered" > }</span>
  7442. &nbsp;
  7443. // 获取所有章节查找指定的章节
  7444. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7445. <span class="cstat-no" title="statement not covered" > const chapter = chapters.find(c =&gt; c.id === chapterId);</span>
  7446. <span class="cstat-no" title="statement not covered" > if (!chapter) {</span>
  7447. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7448. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不存在' };</span>
  7449. <span class="cstat-no" title="statement not covered" > return;</span>
  7450. <span class="cstat-no" title="statement not covered" > }</span>
  7451. &nbsp;
  7452. // 重置章节状态
  7453. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(chapterId, {</span>
  7454. <span class="cstat-no" title="statement not covered" > genStage: 'idle',</span>
  7455. <span class="cstat-no" title="statement not covered" > errorMsg: null,</span>
  7456. <span class="cstat-no" title="statement not covered" > content: null,</span>
  7457. <span class="cstat-no" title="statement not covered" > });</span>
  7458. &nbsp;
  7459. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7460. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7461. <span class="cstat-no" title="statement not covered" > message: '章节已重置为待生成状态',</span>
  7462. <span class="cstat-no" title="statement not covered" > data: { chapterId },</span>
  7463. <span class="cstat-no" title="statement not covered" > };</span>
  7464. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7465. <span class="cstat-no" title="statement not covered" > console.error('重试章节失败:', error);</span>
  7466. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7467. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '重试失败' };</span>
  7468. <span class="cstat-no" title="statement not covered" > }</span>
  7469. <span class="cstat-no" title="statement not covered" >});</span>
  7470. &nbsp;
  7471. /**
  7472. * GET /api/book-generator/langgraph/books/:id/full-content
  7473. * 获取完整书籍内容(所有章节内容合并)
  7474. */
  7475. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/full-content', async (ctx: Context) =&gt; {</span>
  7476. <span class="cstat-no" title="statement not covered" > try {</span>
  7477. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7478. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7479. &nbsp;
  7480. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7481. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7482. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7483. <span class="cstat-no" title="statement not covered" > return;</span>
  7484. <span class="cstat-no" title="statement not covered" > }</span>
  7485. &nbsp;
  7486. // 获取章节树
  7487. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7488. &nbsp;
  7489. // 按层级和顺序构建内容
  7490. <span class="cstat-no" title="statement not covered" > let fullContent = `# ${book.title}\n\n`;</span>
  7491. <span class="cstat-no" title="statement not covered" > if (book.description) {</span>
  7492. <span class="cstat-no" title="statement not covered" > fullContent += `## 简介\n${book.description}\n\n`;</span>
  7493. <span class="cstat-no" title="statement not covered" > }</span>
  7494. &nbsp;
  7495. // 递归添加章节内容
  7496. <span class="cstat-no" title="statement not covered" > const addChapterContent = (chapter: any, indent: string = '') =&gt; {</span>
  7497. <span class="cstat-no" title="statement not covered" > if (chapter.content &amp;&amp; chapter.genStage === 'content_completed') {</span>
  7498. <span class="cstat-no" title="statement not covered" > fullContent += `${indent}${chapter.number}. ${chapter.title}\n\n`;</span>
  7499. <span class="cstat-no" title="statement not covered" > fullContent += chapter.content + '\n\n';</span>
  7500. <span class="cstat-no" title="statement not covered" > }</span>
  7501. // 处理子章节
  7502. <span class="cstat-no" title="statement not covered" > const children = chapters.filter((c: any) =&gt; c.parentId === chapter.id);</span>
  7503. <span class="cstat-no" title="statement not covered" > children.forEach(child =&gt; {</span>
  7504. <span class="cstat-no" title="statement not covered" > addChapterContent(child, indent + ' ');</span>
  7505. <span class="cstat-no" title="statement not covered" > });</span>
  7506. <span class="cstat-no" title="statement not covered" > };</span>
  7507. &nbsp;
  7508. // 添加一级章节
  7509. <span class="cstat-no" title="statement not covered" > const level1Chapters = chapters.filter((c: any) =&gt; c.level === 1);</span>
  7510. <span class="cstat-no" title="statement not covered" > level1Chapters.forEach(chapter =&gt; addChapterContent(chapter));</span>
  7511. &nbsp;
  7512. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7513. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7514. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  7515. <span class="cstat-no" title="statement not covered" > data: {</span>
  7516. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7517. <span class="cstat-no" title="statement not covered" > title: book.title,</span>
  7518. <span class="cstat-no" title="statement not covered" > totalChapters: level1Chapters.length,</span>
  7519. <span class="cstat-no" title="statement not covered" > content: fullContent,</span>
  7520. <span class="cstat-no" title="statement not covered" > wordCount: book.estimatedWords,</span>
  7521. <span class="cstat-no" title="statement not covered" > },</span>
  7522. <span class="cstat-no" title="statement not covered" > };</span>
  7523. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7524. <span class="cstat-no" title="statement not covered" > console.error('获取完整内容失败:', error);</span>
  7525. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7526. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '获取失败' };</span>
  7527. <span class="cstat-no" title="statement not covered" > }</span>
  7528. <span class="cstat-no" title="statement not covered" >});</span>
  7529. &nbsp;
  7530. /**
  7531. * POST /api/book-generator/langgraph/books/:id/outline
  7532. * 生成书籍大纲
  7533. */
  7534. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/outline', async (ctx: Context) =&gt; {</span>
  7535. <span class="cstat-no" title="statement not covered" > try {</span>
  7536. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7537. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7538. &nbsp;
  7539. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7540. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7541. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7542. <span class="cstat-no" title="statement not covered" > return;</span>
  7543. <span class="cstat-no" title="statement not covered" > }</span>
  7544. &nbsp;
  7545. // 检查是否已经有大纲
  7546. <span class="cstat-no" title="statement not covered" > if (book.outline &amp;&amp; book.outline.chapters &amp;&amp; book.outline.chapters.length &gt; 0) {</span>
  7547. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7548. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7549. <span class="cstat-no" title="statement not covered" > message: '大纲已存在,无需重复生成',</span>
  7550. <span class="cstat-no" title="statement not covered" > data: { outline: book.outline },</span>
  7551. <span class="cstat-no" title="statement not covered" > };</span>
  7552. <span class="cstat-no" title="statement not covered" > return;</span>
  7553. <span class="cstat-no" title="statement not covered" > }</span>
  7554. &nbsp;
  7555. // 获取书籍类型配置
  7556. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(book.bookScale || '1000');</span>
  7557. &nbsp;
  7558. // 调用AI生成大纲
  7559. <span class="cstat-no" title="statement not covered" > const { generateOutline } = await import('./index.js');</span>
  7560. <span class="cstat-no" title="statement not covered" > const outline = await generateOutline(bookId, book.description, book.bookScale || '1000');</span>
  7561. &nbsp;
  7562. // 更新书籍的大纲
  7563. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId, { outline });</span>
  7564. &nbsp;
  7565. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7566. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7567. <span class="cstat-no" title="statement not covered" > message: '大纲生成成功',</span>
  7568. <span class="cstat-no" title="statement not covered" > data: { outline },</span>
  7569. <span class="cstat-no" title="statement not covered" > };</span>
  7570. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7571. <span class="cstat-no" title="statement not covered" > console.error('生成大纲失败:', error);</span>
  7572. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7573. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '生成大纲失败' };</span>
  7574. <span class="cstat-no" title="statement not covered" > }</span>
  7575. <span class="cstat-no" title="statement not covered" >});</span>
  7576. &nbsp;
  7577. /**
  7578. * POST /api/book-generator/langgraph/books/:id/chapters
  7579. * 生成单个章节(或全部章节,取决于参数)
  7580. * body: { chapterNumber?: number } - 如果不传chapterNumber,则生成全部
  7581. */
  7582. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters', async (ctx: Context) =&gt; {</span>
  7583. <span class="cstat-no" title="statement not covered" > try {</span>
  7584. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7585. <span class="cstat-no" title="statement not covered" > const body = ctx.request.body as { chapterNumber?: number };</span>
  7586. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7587. &nbsp;
  7588. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7589. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7590. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7591. <span class="cstat-no" title="statement not covered" > return;</span>
  7592. <span class="cstat-no" title="statement not covered" > }</span>
  7593. &nbsp;
  7594. // 如果指定了章节号,只生成单个章节
  7595. <span class="cstat-no" title="statement not covered" > if (body.chapterNumber) {</span>
  7596. // 检查章节是否存在
  7597. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7598. <span class="cstat-no" title="statement not covered" > const targetChapter = chapters.find((c: any) =&gt; c.number === body.chapterNumber);</span>
  7599. &nbsp;
  7600. <span class="cstat-no" title="statement not covered" > if (!targetChapter) {</span>
  7601. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7602. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: `章节 ${body.chapterNumber} 不存在` };</span>
  7603. <span class="cstat-no" title="statement not covered" > return;</span>
  7604. <span class="cstat-no" title="statement not covered" > }</span>
  7605. &nbsp;
  7606. // 异步生成章节内容
  7607. <span class="cstat-no" title="statement not covered" > bookStore.generateSingleChapterContent(bookId, targetChapter.id).catch(err =&gt; {</span>
  7608. <span class="cstat-no" title="statement not covered" > console.error(`[Generate Chapter] 章节${body.chapterNumber}生成失败:`, err);</span>
  7609. <span class="cstat-no" title="statement not covered" > });</span>
  7610. &nbsp;
  7611. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7612. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7613. <span class="cstat-no" title="statement not covered" > message: `章节 ${body.chapterNumber} 生成任务已启动`,</span>
  7614. <span class="cstat-no" title="statement not covered" > data: { chapterId: targetChapter.id, chapterNumber: body.chapterNumber },</span>
  7615. <span class="cstat-no" title="statement not covered" > };</span>
  7616. <span class="cstat-no" title="statement not covered" > } else {</span>
  7617. // 没有指定章节号,触发整本书生成
  7618. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7619. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7620. <span class="cstat-no" title="statement not covered" > message: '请使用 /generate 接口生成整本书',</span>
  7621. <span class="cstat-no" title="statement not covered" > data: { hint: '使用 POST /books/:id/generate' },</span>
  7622. <span class="cstat-no" title="statement not covered" > };</span>
  7623. <span class="cstat-no" title="statement not covered" > }</span>
  7624. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7625. <span class="cstat-no" title="statement not covered" > console.error('生成章节失败:', error);</span>
  7626. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7627. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '生成章节失败' };</span>
  7628. <span class="cstat-no" title="statement not covered" > }</span>
  7629. <span class="cstat-no" title="statement not covered" >});</span>
  7630. &nbsp;
  7631. /**
  7632. * POST /api/book-generator/langgraph/books/:id/foreword
  7633. * 生成前言
  7634. */
  7635. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/foreword', async (ctx: Context) =&gt; {</span>
  7636. <span class="cstat-no" title="statement not covered" > try {</span>
  7637. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7638. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7639. &nbsp;
  7640. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7641. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7642. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7643. <span class="cstat-no" title="statement not covered" > return;</span>
  7644. <span class="cstat-no" title="statement not covered" > }</span>
  7645. &nbsp;
  7646. // 调用LLM生成前言
  7647. <span class="cstat-no" title="statement not covered" > const messages: ChatMessage[] = [</span>
  7648. <span class="cstat-no" title="statement not covered" > {</span>
  7649. <span class="cstat-no" title="statement not covered" > role: 'system',</span>
  7650. <span class="cstat-no" title="statement not covered" > content: `你是一位专业的图书作者。请根据以下信息为书籍生成前言(前言通常介绍写作背景、目标读者、内容概要)。</span>
  7651. 要求:
  7652. 1. 字数控制在300-500字
  7653. 2. 语言正式但亲切
  7654. 3. 不要使用 markdown 格式,直接输出纯文本
  7655. &nbsp;
  7656. 输出格式:
  7657. 直接输出前言内容,不要包含任何标记。`,
  7658. <span class="cstat-no" title="statement not covered" > },</span>
  7659. <span class="cstat-no" title="statement not covered" > {</span>
  7660. <span class="cstat-no" title="statement not covered" > role: 'user',</span>
  7661. <span class="cstat-no" title="statement not covered" > content: `书籍信息:</span>
  7662. <span class="cstat-no" title="statement not covered" >- 书名:${book.title}</span>
  7663. <span class="cstat-no" title="statement not covered" >- 描述:${book.description}</span>
  7664. <span class="cstat-no" title="statement not covered" >- 目标读者:${book.targetAudience || '普通读者'}</span>
  7665. <span class="cstat-no" title="statement not covered" >- 风格:${book.style || '专业'}</span>
  7666. &nbsp;
  7667. 请生成这本书的前言。`,
  7668. <span class="cstat-no" title="statement not covered" > },</span>
  7669. <span class="cstat-no" title="statement not covered" > ];</span>
  7670. &nbsp;
  7671. <span class="cstat-no" title="statement not covered" > const foreword = await callLLMWithMessages(messages);</span>
  7672. &nbsp;
  7673. // 更新书籍前言字段
  7674. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId, { foreword });</span>
  7675. &nbsp;
  7676. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7677. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7678. <span class="cstat-no" title="statement not covered" > message: '前言生成成功',</span>
  7679. <span class="cstat-no" title="statement not covered" > data: { foreword },</span>
  7680. <span class="cstat-no" title="statement not covered" > };</span>
  7681. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7682. <span class="cstat-no" title="statement not covered" > console.error('生成前言失败:', error);</span>
  7683. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7684. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '生成前言失败' };</span>
  7685. <span class="cstat-no" title="statement not covered" > }</span>
  7686. <span class="cstat-no" title="statement not covered" >});</span>
  7687. &nbsp;
  7688. /**
  7689. * POST /api/book-generator/langgraph/books/:id/afterword
  7690. * 生成后记
  7691. */
  7692. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/afterword', async (ctx: Context) =&gt; {</span>
  7693. <span class="cstat-no" title="statement not covered" > try {</span>
  7694. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  7695. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7696. &nbsp;
  7697. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7698. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7699. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7700. <span class="cstat-no" title="statement not covered" > return;</span>
  7701. <span class="cstat-no" title="statement not covered" > }</span>
  7702. &nbsp;
  7703. // 调用LLM生成后记
  7704. <span class="cstat-no" title="statement not covered" > const messages: ChatMessage[] = [</span>
  7705. <span class="cstat-no" title="statement not covered" > {</span>
  7706. <span class="cstat-no" title="statement not covered" > role: 'system',</span>
  7707. <span class="cstat-no" title="statement not covered" > content: `你是一位专业的图书作者。请为书籍生成后记(后记通常总结全书核心观点、分享写作心得、感谢读者)。</span>
  7708. 要求:
  7709. 1. 字数控制在300-500字
  7710. 2. 语言真挚、诚恳
  7711. 3. 不要使用 markdown 格式,直接输出纯文本
  7712. &nbsp;
  7713. 输出格式:
  7714. 直接输出后记内容,不要包含任何标记。`,
  7715. <span class="cstat-no" title="statement not covered" > },</span>
  7716. <span class="cstat-no" title="statement not covered" > {</span>
  7717. <span class="cstat-no" title="statement not covered" > role: 'user',</span>
  7718. <span class="cstat-no" title="statement not covered" > content: `书籍信息:</span>
  7719. <span class="cstat-no" title="statement not covered" >- 书名:${book.title}</span>
  7720. <span class="cstat-no" title="statement not covered" >- 描述:${book.description}</span>
  7721. <span class="cstat-no" title="statement not covered" >- 章节数:${book.totalChapters}</span>
  7722. <span class="cstat-no" title="statement not covered" >- 总字数:约${book.estimatedWords}字</span>
  7723. &nbsp;
  7724. 请生成这本书的后记。`,
  7725. <span class="cstat-no" title="statement not covered" > },</span>
  7726. <span class="cstat-no" title="statement not covered" > ];</span>
  7727. &nbsp;
  7728. <span class="cstat-no" title="statement not covered" > const afterword = await callLLMWithMessages(messages);</span>
  7729. &nbsp;
  7730. // 更新书籍后记字段
  7731. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId, { afterword });</span>
  7732. &nbsp;
  7733. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7734. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7735. <span class="cstat-no" title="statement not covered" > message: '后记生成成功',</span>
  7736. <span class="cstat-no" title="statement not covered" > data: { afterword },</span>
  7737. <span class="cstat-no" title="statement not covered" > };</span>
  7738. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7739. <span class="cstat-no" title="statement not covered" > console.error('生成后记失败:', error);</span>
  7740. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7741. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '生成后记失败' };</span>
  7742. <span class="cstat-no" title="statement not covered" > }</span>
  7743. <span class="cstat-no" title="statement not covered" >});</span>
  7744. &nbsp;
  7745. /**
  7746. * GET /api/book-generator/langgraph/workflow/:bookId
  7747. * 获取书籍生成工作流状态
  7748. */
  7749. <span class="cstat-no" title="statement not covered" >router.get('/workflow/:bookId', async (ctx: Context) =&gt; {</span>
  7750. <span class="cstat-no" title="statement not covered" > try {</span>
  7751. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.bookId as string;</span>
  7752. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7753. &nbsp;
  7754. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7755. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7756. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7757. <span class="cstat-no" title="statement not covered" > return;</span>
  7758. <span class="cstat-no" title="statement not covered" > }</span>
  7759. &nbsp;
  7760. // 获取章节树
  7761. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  7762. &nbsp;
  7763. // 分析工作流状态
  7764. <span class="cstat-no" title="statement not covered" > const completedChapters = chapters.filter((c: any) =&gt; ['content_completed', 'audio_completed', 'video_completed'].includes(c.genStage)).length;</span>
  7765. <span class="cstat-no" title="statement not covered" > const failedChapters = chapters.filter((c: any) =&gt; c.genStage === 'failed').length;</span>
  7766. <span class="cstat-no" title="statement not covered" > const pendingChapters = chapters.filter((c: any) =&gt; c.genStage === 'idle' || !c.genStage).length;</span>
  7767. <span class="cstat-no" title="statement not covered" > const generatingChapters = chapters.filter((c: any) =&gt; ['content_generating', 'audio_generating', 'video_generating'].includes(c.genStage)).length;</span>
  7768. &nbsp;
  7769. // 确定当前阶段
  7770. <span class="cstat-no" title="statement not covered" > let phase: 'planning' | 'writing' | 'supplement' | 'done' = 'planning';</span>
  7771. <span class="cstat-no" title="statement not covered" > if (['content_generating', 'audio_generating', 'video_generating'].includes(book.genStage)) {</span>
  7772. <span class="cstat-no" title="statement not covered" > phase = 'writing';</span>
  7773. <span class="cstat-no" title="statement not covered" > } else if (completedChapters &gt; 0 &amp;&amp; failedChapters === 0) {</span>
  7774. <span class="cstat-no" title="statement not covered" > phase = 'done';</span>
  7775. <span class="cstat-no" title="statement not covered" > } else if (failedChapters &gt; 0) {</span>
  7776. <span class="cstat-no" title="statement not covered" > phase = 'supplement';</span>
  7777. <span class="cstat-no" title="statement not covered" > }</span>
  7778. &nbsp;
  7779. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7780. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7781. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  7782. <span class="cstat-no" title="statement not covered" > data: {</span>
  7783. <span class="cstat-no" title="statement not covered" > bookId,</span>
  7784. <span class="cstat-no" title="statement not covered" > genStage: book.genStage,</span>
  7785. <span class="cstat-no" title="statement not covered" > phase,</span>
  7786. <span class="cstat-no" title="statement not covered" > progress: book.progress || 0,</span>
  7787. <span class="cstat-no" title="statement not covered" > completedChapters,</span>
  7788. <span class="cstat-no" title="statement not covered" > failedChapters,</span>
  7789. <span class="cstat-no" title="statement not covered" > pendingChapters,</span>
  7790. <span class="cstat-no" title="statement not covered" > generatingChapters,</span>
  7791. <span class="cstat-no" title="statement not covered" > totalChapters: chapters.length,</span>
  7792. <span class="cstat-no" title="statement not covered" > failedChapterIds: chapters.filter((c: any) =&gt; c.genStage === 'failed').map((c: any) =&gt; c.id),</span>
  7793. <span class="cstat-no" title="statement not covered" > },</span>
  7794. <span class="cstat-no" title="statement not covered" > };</span>
  7795. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7796. <span class="cstat-no" title="statement not covered" > console.error('获取工作流状态失败:', error);</span>
  7797. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7798. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '获取失败' };</span>
  7799. <span class="cstat-no" title="statement not covered" > }</span>
  7800. <span class="cstat-no" title="statement not covered" >});</span>
  7801. &nbsp;
  7802. /**
  7803. * GET /api/book-generator/langgraph/books/:id/chapters/:chapterId/content
  7804. * 获取指定章节的内容
  7805. */
  7806. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/chapters/:chapterId/content', optionalAuth, async (ctx: Context) =&gt; {</span>
  7807. <span class="cstat-no" title="statement not covered" > try {</span>
  7808. <span class="cstat-no" title="statement not covered" > const { id: bookId, chapterId } = ctx.params as { id: string; chapterId: string };</span>
  7809. <span class="cstat-no" title="statement not covered" > const chapterIdNum = parseInt(chapterId);</span>
  7810. &nbsp;
  7811. // 获取书籍
  7812. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7813. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7814. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7815. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7816. <span class="cstat-no" title="statement not covered" > return;</span>
  7817. <span class="cstat-no" title="statement not covered" > }</span>
  7818. &nbsp;
  7819. // 获取章节
  7820. <span class="cstat-no" title="statement not covered" > const chapter = await prisma.bookChapter.findUnique({</span>
  7821. <span class="cstat-no" title="statement not covered" > where: { id: chapterIdNum },</span>
  7822. <span class="cstat-no" title="statement not covered" > });</span>
  7823. <span class="cstat-no" title="statement not covered" > if (!chapter) {</span>
  7824. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7825. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不存在' };</span>
  7826. <span class="cstat-no" title="statement not covered" > return;</span>
  7827. <span class="cstat-no" title="statement not covered" > }</span>
  7828. &nbsp;
  7829. // 检查是否属于该书籍
  7830. <span class="cstat-no" title="statement not covered" > if (chapter.bookId !== parseInt(bookId)) {</span>
  7831. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7832. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不属于该书籍' };</span>
  7833. <span class="cstat-no" title="statement not covered" > return;</span>
  7834. <span class="cstat-no" title="statement not covered" > }</span>
  7835. &nbsp;
  7836. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7837. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7838. <span class="cstat-no" title="statement not covered" > message: 'success',</span>
  7839. <span class="cstat-no" title="statement not covered" > data: {</span>
  7840. <span class="cstat-no" title="statement not covered" > id: chapter.id,</span>
  7841. <span class="cstat-no" title="statement not covered" > bookId: chapter.bookId,</span>
  7842. <span class="cstat-no" title="statement not covered" > number: chapter.number,</span>
  7843. <span class="cstat-no" title="statement not covered" > title: chapter.title,</span>
  7844. <span class="cstat-no" title="statement not covered" > content: chapter.content || '',</span>
  7845. <span class="cstat-no" title="statement not covered" > wordCount: chapter.wordCount || 0,</span>
  7846. <span class="cstat-no" title="statement not covered" > genStage: chapter.genStage || null,</span>
  7847. <span class="cstat-no" title="statement not covered" > level: chapter.level,</span>
  7848. <span class="cstat-no" title="statement not covered" > parentId: chapter.parentId,</span>
  7849. <span class="cstat-no" title="statement not covered" > summary: chapter.summary || '',</span>
  7850. <span class="cstat-no" title="statement not covered" > keyPoints: chapter.keyPoints ? JSON.parse(chapter.keyPoints) : [],</span>
  7851. <span class="cstat-no" title="statement not covered" > audioUrl: chapter.audioUrl || '',</span>
  7852. <span class="cstat-no" title="statement not covered" > videoUrl: chapter.videoUrl || '',</span>
  7853. <span class="cstat-no" title="statement not covered" > isPublic: chapter.isPublic || false,</span>
  7854. <span class="cstat-no" title="statement not covered" > },</span>
  7855. <span class="cstat-no" title="statement not covered" > };</span>
  7856. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7857. <span class="cstat-no" title="statement not covered" > console.error('获取章节内容失败:', error);</span>
  7858. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7859. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '获取章节内容失败' };</span>
  7860. <span class="cstat-no" title="statement not covered" > }</span>
  7861. <span class="cstat-no" title="statement not covered" >});</span>
  7862. &nbsp;
  7863. /**
  7864. * POST /api/book-generator/langgraph/books/:id/chapters/:chapterId/content
  7865. * 保存章节内容(手工编辑后保存)
  7866. */
  7867. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters/:chapterId/content', optionalAuth, async (ctx: Context) =&gt; {</span>
  7868. <span class="cstat-no" title="statement not covered" > try {</span>
  7869. <span class="cstat-no" title="statement not covered" > const { id: bookId, chapterId } = ctx.params as { id: string; chapterId: string };</span>
  7870. <span class="cstat-no" title="statement not covered" > const chapterIdNum = parseInt(chapterId);</span>
  7871. <span class="cstat-no" title="statement not covered" > const { content } = ctx.request.body as { content: string };</span>
  7872. &nbsp;
  7873. <span class="cstat-no" title="statement not covered" > if (content === undefined) {</span>
  7874. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  7875. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '内容不能为空' };</span>
  7876. <span class="cstat-no" title="statement not covered" > return;</span>
  7877. <span class="cstat-no" title="statement not covered" > }</span>
  7878. &nbsp;
  7879. // 获取章节
  7880. <span class="cstat-no" title="statement not covered" > const chapter = await prisma.bookChapter.findUnique({</span>
  7881. <span class="cstat-no" title="statement not covered" > where: { id: chapterIdNum },</span>
  7882. <span class="cstat-no" title="statement not covered" > });</span>
  7883. <span class="cstat-no" title="statement not covered" > if (!chapter) {</span>
  7884. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7885. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不存在' };</span>
  7886. <span class="cstat-no" title="statement not covered" > return;</span>
  7887. <span class="cstat-no" title="statement not covered" > }</span>
  7888. &nbsp;
  7889. // 检查是否属于该书籍
  7890. <span class="cstat-no" title="statement not covered" > if (chapter.bookId !== parseInt(bookId)) {</span>
  7891. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7892. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不属于该书籍' };</span>
  7893. <span class="cstat-no" title="statement not covered" > return;</span>
  7894. <span class="cstat-no" title="statement not covered" > }</span>
  7895. &nbsp;
  7896. // 计算字数
  7897. <span class="cstat-no" title="statement not covered" > const wordCount = content.replace(/&lt;[^&gt;]*&gt;/g, '').length;</span>
  7898. &nbsp;
  7899. // 更新章节内容
  7900. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(chapterIdNum, {</span>
  7901. <span class="cstat-no" title="statement not covered" > content,</span>
  7902. <span class="cstat-no" title="statement not covered" > wordCount,</span>
  7903. <span class="cstat-no" title="statement not covered" > });</span>
  7904. &nbsp;
  7905. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7906. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7907. <span class="cstat-no" title="statement not covered" > message: '保存成功',</span>
  7908. <span class="cstat-no" title="statement not covered" > data: { chapterId: chapterIdNum, wordCount },</span>
  7909. <span class="cstat-no" title="statement not covered" > };</span>
  7910. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7911. <span class="cstat-no" title="statement not covered" > console.error('保存章节内容失败:', error);</span>
  7912. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7913. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '保存章节内容失败' };</span>
  7914. <span class="cstat-no" title="statement not covered" > }</span>
  7915. <span class="cstat-no" title="statement not covered" >});</span>
  7916. &nbsp;
  7917. /**
  7918. * POST /api/book-generator/langgraph/books/:id/chapters/batch-regenerate
  7919. * 批量重新生成章节内容
  7920. */
  7921. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters/batch-regenerate', optionalAuth, async (ctx: Context) =&gt; {</span>
  7922. <span class="cstat-no" title="statement not covered" > try {</span>
  7923. <span class="cstat-no" title="statement not covered" > const { id: bookId } = ctx.params as { id: string };</span>
  7924. <span class="cstat-no" title="statement not covered" > const { chapterIds } = ctx.request.body as { chapterIds: number[] };</span>
  7925. &nbsp;
  7926. <span class="cstat-no" title="statement not covered" > if (!chapterIds || !Array.isArray(chapterIds) || chapterIds.length === 0) {</span>
  7927. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  7928. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '请选择要重新生成的章节' };</span>
  7929. <span class="cstat-no" title="statement not covered" > return;</span>
  7930. <span class="cstat-no" title="statement not covered" > }</span>
  7931. &nbsp;
  7932. // 获取书籍
  7933. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7934. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7935. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7936. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7937. <span class="cstat-no" title="statement not covered" > return;</span>
  7938. <span class="cstat-no" title="statement not covered" > }</span>
  7939. &nbsp;
  7940. // 更新书籍状态为 content_generating,让前端能正确追踪轮询
  7941. <span class="cstat-no" title="statement not covered" > await bookStore.update(bookId, { genStage: 'content_generating' });</span>
  7942. &nbsp;
  7943. // 重置并触发每个选中章节的重新生成
  7944. <span class="cstat-no" title="statement not covered" > for (const chapterId of chapterIds) {</span>
  7945. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(chapterId, {</span>
  7946. <span class="cstat-no" title="statement not covered" > genStage: 'idle',</span>
  7947. <span class="cstat-no" title="statement not covered" > content: null,</span>
  7948. <span class="cstat-no" title="statement not covered" > });</span>
  7949. // 后台异步执行
  7950. <span class="cstat-no" title="statement not covered" > bookStore.generateSingleChapterContent(bookId, chapterId).catch(err =&gt; {</span>
  7951. <span class="cstat-no" title="statement not covered" > console.error(`[BatchRegenerate] 章节${chapterId}内容生成失败:`, err);</span>
  7952. <span class="cstat-no" title="statement not covered" > });</span>
  7953. <span class="cstat-no" title="statement not covered" > }</span>
  7954. &nbsp;
  7955. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  7956. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  7957. <span class="cstat-no" title="statement not covered" > message: `已提交 ${chapterIds.length} 个章节的重新生成任务`,</span>
  7958. <span class="cstat-no" title="statement not covered" > data: { count: chapterIds.length },</span>
  7959. <span class="cstat-no" title="statement not covered" > };</span>
  7960. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  7961. <span class="cstat-no" title="statement not covered" > console.error('批量重新生成章节失败:', error);</span>
  7962. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  7963. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '批量重新生成失败' };</span>
  7964. <span class="cstat-no" title="statement not covered" > }</span>
  7965. <span class="cstat-no" title="statement not covered" >});</span>
  7966. &nbsp;
  7967. /**
  7968. * POST /api/book-generator/langgraph/books/:id/chapters/batch-delete
  7969. * 批量删除章节
  7970. */
  7971. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters/batch-delete', optionalAuth, async (ctx: Context) =&gt; {</span>
  7972. <span class="cstat-no" title="statement not covered" > try {</span>
  7973. <span class="cstat-no" title="statement not covered" > const { id: bookId } = ctx.params as { id: string };</span>
  7974. <span class="cstat-no" title="statement not covered" > const { chapterIds } = ctx.request.body as { chapterIds: number[] };</span>
  7975. &nbsp;
  7976. <span class="cstat-no" title="statement not covered" > if (!chapterIds || !Array.isArray(chapterIds) || chapterIds.length === 0) {</span>
  7977. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  7978. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '请选择要删除的章节' };</span>
  7979. <span class="cstat-no" title="statement not covered" > return;</span>
  7980. <span class="cstat-no" title="statement not covered" > }</span>
  7981. &nbsp;
  7982. // 获取书籍
  7983. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  7984. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  7985. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  7986. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  7987. <span class="cstat-no" title="statement not covered" > return;</span>
  7988. <span class="cstat-no" title="statement not covered" > }</span>
  7989. &nbsp;
  7990. // 删除章节(同时会删除子章节,因为没有设置级联删除,需要手动处理)
  7991. // 对于每个要删除的章节,先删除其所有子节点,再删除自身
  7992. <span class="cstat-no" title="statement not covered" > for (const chapterId of chapterIds) {</span>
  7993. // 删除子章节(level &gt; 当前章节)
  7994. <span class="cstat-no" title="statement not covered" > await prisma.bookChapter.deleteMany({</span>
  7995. <span class="cstat-no" title="statement not covered" > where: {</span>
  7996. <span class="cstat-no" title="statement not covered" > bookId: parseInt(bookId),</span>
  7997. <span class="cstat-no" title="statement not covered" > parentId: chapterId,</span>
  7998. <span class="cstat-no" title="statement not covered" > },</span>
  7999. <span class="cstat-no" title="statement not covered" > });</span>
  8000. // 删除自身
  8001. <span class="cstat-no" title="statement not covered" > await prisma.bookChapter.deleteMany({</span>
  8002. <span class="cstat-no" title="statement not covered" > where: {</span>
  8003. <span class="cstat-no" title="statement not covered" > id: chapterId,</span>
  8004. <span class="cstat-no" title="statement not covered" > bookId: parseInt(bookId),</span>
  8005. <span class="cstat-no" title="statement not covered" > },</span>
  8006. <span class="cstat-no" title="statement not covered" > });</span>
  8007. <span class="cstat-no" title="statement not covered" > }</span>
  8008. &nbsp;
  8009. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8010. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8011. <span class="cstat-no" title="statement not covered" > message: `已删除 ${chapterIds.length} 个章节`,</span>
  8012. <span class="cstat-no" title="statement not covered" > data: { count: chapterIds.length },</span>
  8013. <span class="cstat-no" title="statement not covered" > };</span>
  8014. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8015. <span class="cstat-no" title="statement not covered" > console.error('批量删除章节失败:', error);</span>
  8016. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8017. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '批量删除失败' };</span>
  8018. <span class="cstat-no" title="statement not covered" > }</span>
  8019. <span class="cstat-no" title="statement not covered" >});</span>
  8020. &nbsp;
  8021. /**
  8022. * POST /api/book-generator/langgraph/books/:id/chapters/:chapterId/regenerate
  8023. * 重新生成指定章节的内容(仅叶节点允许)
  8024. */
  8025. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters/:chapterId/regenerate', async (ctx: Context) =&gt; {</span>
  8026. <span class="cstat-no" title="statement not covered" > try {</span>
  8027. <span class="cstat-no" title="statement not covered" > const { id: bookId, chapterId } = ctx.params as { id: string; chapterId: string };</span>
  8028. <span class="cstat-no" title="statement not covered" > const chapterIdNum = parseInt(chapterId);</span>
  8029. &nbsp;
  8030. // 获取书籍
  8031. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  8032. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8033. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8034. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8035. <span class="cstat-no" title="statement not covered" > return;</span>
  8036. <span class="cstat-no" title="statement not covered" > }</span>
  8037. &nbsp;
  8038. // 获取章节
  8039. <span class="cstat-no" title="statement not covered" > const chapter = await prisma.bookChapter.findUnique({</span>
  8040. <span class="cstat-no" title="statement not covered" > where: { id: chapterIdNum },</span>
  8041. <span class="cstat-no" title="statement not covered" > });</span>
  8042. <span class="cstat-no" title="statement not covered" > if (!chapter) {</span>
  8043. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8044. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不存在' };</span>
  8045. <span class="cstat-no" title="statement not covered" > return;</span>
  8046. <span class="cstat-no" title="statement not covered" > }</span>
  8047. &nbsp;
  8048. // 检查是否为叶节点(没有子节点的节点)
  8049. <span class="cstat-no" title="statement not covered" > const childChapters = await prisma.bookChapter.findMany({</span>
  8050. <span class="cstat-no" title="statement not covered" > where: { parentId: chapterIdNum },</span>
  8051. <span class="cstat-no" title="statement not covered" > });</span>
  8052. <span class="cstat-no" title="statement not covered" > if (childChapters.length &gt; 0) {</span>
  8053. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8054. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '只有叶节点(小节)才允许重新生成内容' };</span>
  8055. <span class="cstat-no" title="statement not covered" > return;</span>
  8056. <span class="cstat-no" title="statement not covered" > }</span>
  8057. &nbsp;
  8058. // 重置章节状态和内容
  8059. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(chapterIdNum, {</span>
  8060. <span class="cstat-no" title="statement not covered" > genStage: 'idle',</span>
  8061. <span class="cstat-no" title="statement not covered" > errorMsg: null,</span>
  8062. <span class="cstat-no" title="statement not covered" > content: null,</span>
  8063. <span class="cstat-no" title="statement not covered" > });</span>
  8064. &nbsp;
  8065. // 直接调用单个章节内容生成(不触发整个书籍生成流程)
  8066. // 在后台异步执行
  8067. <span class="cstat-no" title="statement not covered" > bookStore.generateSingleChapterContent(bookId, chapterIdNum).catch(err =&gt; {</span>
  8068. <span class="cstat-no" title="statement not covered" > console.error(`[Regenerate] 章节${chapterIdNum}内容生成失败:`, err);</span>
  8069. <span class="cstat-no" title="statement not covered" > });</span>
  8070. &nbsp;
  8071. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8072. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8073. <span class="cstat-no" title="statement not covered" > message: '章节内容重新生成任务已启动',</span>
  8074. <span class="cstat-no" title="statement not covered" > data: { chapterId: chapterIdNum },</span>
  8075. <span class="cstat-no" title="statement not covered" > };</span>
  8076. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8077. <span class="cstat-no" title="statement not covered" > console.error('重新生成章节失败:', error);</span>
  8078. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8079. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '重新生成失败' };</span>
  8080. <span class="cstat-no" title="statement not covered" > }</span>
  8081. <span class="cstat-no" title="statement not covered" >});</span>
  8082. &nbsp;
  8083. /**
  8084. * POST /api/book-generator/langgraph/books/:id/chapters/:chapterId/regenerate-audio
  8085. * 重新生成章节音频(仅叶节点)
  8086. */
  8087. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters/:chapterId/regenerate-audio', async (ctx: Context) =&gt; {</span>
  8088. <span class="cstat-no" title="statement not covered" > try {</span>
  8089. <span class="cstat-no" title="statement not covered" > const { id: bookId, chapterId } = ctx.params as { id: string; chapterId: string };</span>
  8090. <span class="cstat-no" title="statement not covered" > const chapterIdNum = parseInt(chapterId);</span>
  8091. &nbsp;
  8092. // 获取书籍
  8093. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  8094. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8095. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8096. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8097. <span class="cstat-no" title="statement not covered" > return;</span>
  8098. <span class="cstat-no" title="statement not covered" > }</span>
  8099. &nbsp;
  8100. // 获取章节
  8101. <span class="cstat-no" title="statement not covered" > const chapter = await prisma.bookChapter.findUnique({</span>
  8102. <span class="cstat-no" title="statement not covered" > where: { id: chapterIdNum },</span>
  8103. <span class="cstat-no" title="statement not covered" > });</span>
  8104. <span class="cstat-no" title="statement not covered" > if (!chapter) {</span>
  8105. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8106. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不存在' };</span>
  8107. <span class="cstat-no" title="statement not covered" > return;</span>
  8108. <span class="cstat-no" title="statement not covered" > }</span>
  8109. &nbsp;
  8110. // 检查是否为叶节点
  8111. <span class="cstat-no" title="statement not covered" > const childChapters = await prisma.bookChapter.findMany({</span>
  8112. <span class="cstat-no" title="statement not covered" > where: { parentId: chapterIdNum },</span>
  8113. <span class="cstat-no" title="statement not covered" > });</span>
  8114. <span class="cstat-no" title="statement not covered" > if (childChapters.length &gt; 0) {</span>
  8115. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8116. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '只有叶节点(小节)才允许重新生成音频' };</span>
  8117. <span class="cstat-no" title="statement not covered" > return;</span>
  8118. <span class="cstat-no" title="statement not covered" > }</span>
  8119. &nbsp;
  8120. // 检查内容是否已完成(有内容即可重生成音频,content_generating 但 content 已存在也允许)
  8121. <span class="cstat-no" title="statement not covered" > if (!chapter.content || chapter.genStage === 'idle') {</span>
  8122. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8123. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节内容未生成完成,无法生成音频' };</span>
  8124. <span class="cstat-no" title="statement not covered" > return;</span>
  8125. <span class="cstat-no" title="statement not covered" > }</span>
  8126. &nbsp;
  8127. // 清空现有音频并回退状态
  8128. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(chapterIdNum, {</span>
  8129. <span class="cstat-no" title="statement not covered" > audioUrl: '',</span>
  8130. <span class="cstat-no" title="statement not covered" > audioDuration: 0,</span>
  8131. <span class="cstat-no" title="statement not covered" > lrcLyrics: null,</span>
  8132. <span class="cstat-no" title="statement not covered" > genStage: 'content_completed',</span>
  8133. <span class="cstat-no" title="statement not covered" > });</span>
  8134. &nbsp;
  8135. // 同时清空父章节的合并音频(因为子节音频变了,合并音频也需要重新生成)
  8136. <span class="cstat-no" title="statement not covered" > if (chapter.parentId) {</span>
  8137. <span class="cstat-no" title="statement not covered" > const parentChapter = await prisma.bookChapter.findUnique({</span>
  8138. <span class="cstat-no" title="statement not covered" > where: { id: chapter.parentId },</span>
  8139. <span class="cstat-no" title="statement not covered" > });</span>
  8140. <span class="cstat-no" title="statement not covered" > if (parentChapter?.audioUrl?.includes('_merged')) {</span>
  8141. <span class="cstat-no" title="statement not covered" > console.log(`[RegenerateAudio] 清除父章节 ${parentChapter.id} 的合并音频(子节${chapterIdNum}已重新生成)`);</span>
  8142. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(parentChapter.id, {</span>
  8143. <span class="cstat-no" title="statement not covered" > audioUrl: '',</span>
  8144. <span class="cstat-no" title="statement not covered" > audioDuration: 0,</span>
  8145. <span class="cstat-no" title="statement not covered" > });</span>
  8146. // 如果父章节之上还有更高级的合并音频,也一并清除
  8147. <span class="cstat-no" title="statement not covered" > if (parentChapter.parentId) {</span>
  8148. <span class="cstat-no" title="statement not covered" > const grandParent = await prisma.bookChapter.findUnique({</span>
  8149. <span class="cstat-no" title="statement not covered" > where: { id: parentChapter.parentId },</span>
  8150. <span class="cstat-no" title="statement not covered" > });</span>
  8151. <span class="cstat-no" title="statement not covered" > if (grandParent?.audioUrl?.includes('_merged')) {</span>
  8152. <span class="cstat-no" title="statement not covered" > console.log(`[RegenerateAudio] 清除祖父章节 ${grandParent.id} 的合并音频`);</span>
  8153. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(grandParent.id, {</span>
  8154. <span class="cstat-no" title="statement not covered" > audioUrl: '',</span>
  8155. <span class="cstat-no" title="statement not covered" > audioDuration: 0,</span>
  8156. <span class="cstat-no" title="statement not covered" > });</span>
  8157. <span class="cstat-no" title="statement not covered" > }</span>
  8158. <span class="cstat-no" title="statement not covered" > }</span>
  8159. <span class="cstat-no" title="statement not covered" > }</span>
  8160. <span class="cstat-no" title="statement not covered" > }</span>
  8161. &nbsp;
  8162. // 异步生成新音频
  8163. <span class="cstat-no" title="statement not covered" > bookStore.generateChapterAudioById(chapterIdNum, book.userId || 1);</span>
  8164. &nbsp;
  8165. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8166. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8167. <span class="cstat-no" title="statement not covered" > message: '音频重新生成任务已启动',</span>
  8168. <span class="cstat-no" title="statement not covered" > data: { chapterId: chapterIdNum },</span>
  8169. <span class="cstat-no" title="statement not covered" > };</span>
  8170. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8171. <span class="cstat-no" title="statement not covered" > console.error('重新生成音频失败:', error);</span>
  8172. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8173. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '重新生成音频失败' };</span>
  8174. <span class="cstat-no" title="statement not covered" > }</span>
  8175. <span class="cstat-no" title="statement not covered" >});</span>
  8176. &nbsp;
  8177. /**
  8178. * POST /api/book-generator/langgraph/books/:id/chapters/:chapterId/video
  8179. * 生成单个章节视频
  8180. */
  8181. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/chapters/:chapterId/video', async (ctx: Context) =&gt; {</span>
  8182. <span class="cstat-no" title="statement not covered" > try {</span>
  8183. <span class="cstat-no" title="statement not covered" > const { id: bookId, chapterId } = ctx.params as { id: string; chapterId: string };</span>
  8184. <span class="cstat-no" title="statement not covered" > const chapterIdNum = parseInt(chapterId);</span>
  8185. &nbsp;
  8186. <span class="cstat-no" title="statement not covered" > const chapter = await prisma.bookChapter.findUnique({</span>
  8187. <span class="cstat-no" title="statement not covered" > where: { id: chapterIdNum },</span>
  8188. <span class="cstat-no" title="statement not covered" > });</span>
  8189. <span class="cstat-no" title="statement not covered" > if (!chapter) {</span>
  8190. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8191. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '章节不存在' };</span>
  8192. <span class="cstat-no" title="statement not covered" > return;</span>
  8193. <span class="cstat-no" title="statement not covered" > }</span>
  8194. &nbsp;
  8195. // 检查章节是否有音频
  8196. <span class="cstat-no" title="statement not covered" > if (!chapter.audioUrl) {</span>
  8197. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8198. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '该章节没有音频,请先生成音频' };</span>
  8199. <span class="cstat-no" title="statement not covered" > return;</span>
  8200. <span class="cstat-no" title="statement not covered" > }</span>
  8201. &nbsp;
  8202. // 设置视频状态为生成中
  8203. <span class="cstat-no" title="statement not covered" > await advanceChapter(chapterIdNum, 'video_generating');</span>
  8204. &nbsp;
  8205. // 调用视频服务创建视频项目
  8206. <span class="cstat-no" title="statement not covered" > const project = await createVideoProjectFromBook(parseInt(bookId), chapterIdNum);</span>
  8207. &nbsp;
  8208. <span class="cstat-no" title="statement not covered" > if (!project) {</span>
  8209. <span class="cstat-no" title="statement not covered" > await regenerateChapter(chapterIdNum, 'failed');</span>
  8210. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8211. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '创建视频项目失败' };</span>
  8212. <span class="cstat-no" title="statement not covered" > return;</span>
  8213. <span class="cstat-no" title="statement not covered" > }</span>
  8214. &nbsp;
  8215. // 异步生成视频
  8216. <span class="cstat-no" title="statement not covered" > generateVideoForProject(project.id)</span>
  8217. <span class="cstat-no" title="statement not covered" > .then(async (result) =&gt; {</span>
  8218. <span class="cstat-no" title="statement not covered" > if (result.success) {</span>
  8219. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(chapterIdNum, {</span>
  8220. <span class="cstat-no" title="statement not covered" > videoUrl: result.outputUrl,</span>
  8221. <span class="cstat-no" title="statement not covered" > videoDuration: result.duration,</span>
  8222. <span class="cstat-no" title="statement not covered" > });</span>
  8223. <span class="cstat-no" title="statement not covered" > await advanceChapter(chapterIdNum, 'video_completed');</span>
  8224. <span class="cstat-no" title="statement not covered" > } else {</span>
  8225. <span class="cstat-no" title="statement not covered" > await regenerateChapter(chapterIdNum, 'failed');</span>
  8226. <span class="cstat-no" title="statement not covered" > }</span>
  8227. <span class="cstat-no" title="statement not covered" > })</span>
  8228. <span class="cstat-no" title="statement not covered" > .catch(async (err) =&gt; {</span>
  8229. <span class="cstat-no" title="statement not covered" > console.error(`[Video] 章节${chapter.number}视频生成失败:`, err);</span>
  8230. <span class="cstat-no" title="statement not covered" > await regenerateChapter(chapterIdNum, 'failed');</span>
  8231. <span class="cstat-no" title="statement not covered" > });</span>
  8232. &nbsp;
  8233. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8234. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8235. <span class="cstat-no" title="statement not covered" > message: '视频生成任务已启动',</span>
  8236. <span class="cstat-no" title="statement not covered" > data: {</span>
  8237. <span class="cstat-no" title="statement not covered" > projectId: project.id,</span>
  8238. <span class="cstat-no" title="statement not covered" > chapterId: String(chapterId),</span>
  8239. <span class="cstat-no" title="statement not covered" > },</span>
  8240. <span class="cstat-no" title="statement not covered" > };</span>
  8241. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8242. <span class="cstat-no" title="statement not covered" > console.error('视频生成失败:', error);</span>
  8243. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8244. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '视频生成失败' };</span>
  8245. <span class="cstat-no" title="statement not covered" > }</span>
  8246. <span class="cstat-no" title="statement not covered" >});</span>
  8247. &nbsp;
  8248. /**
  8249. * POST /api/book-generator/langgraph/books/:id/videos
  8250. * 批量生成书籍所有章节视频
  8251. */
  8252. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/videos', async (ctx: Context) =&gt; {</span>
  8253. <span class="cstat-no" title="statement not covered" > try {</span>
  8254. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  8255. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  8256. &nbsp;
  8257. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8258. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8259. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8260. <span class="cstat-no" title="statement not covered" > return;</span>
  8261. <span class="cstat-no" title="statement not covered" > }</span>
  8262. &nbsp;
  8263. // 获取章节树
  8264. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  8265. &nbsp;
  8266. // 动态获取叶节点层级(最大level值)
  8267. <span class="cstat-no" title="statement not covered" > const maxLevel = chapters.length &gt; 0</span>
  8268. <span class="cstat-no" title="statement not covered" > ? Math.max(...chapters.map((c: any) =&gt; c.level || 0))</span>
  8269. <span class="cstat-no" title="statement not covered" > : 0;</span>
  8270. &nbsp;
  8271. <span class="cstat-no" title="statement not covered" > if (maxLevel === 0) {</span>
  8272. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '没有章节' };</span>
  8273. <span class="cstat-no" title="statement not covered" > return;</span>
  8274. <span class="cstat-no" title="statement not covered" > }</span>
  8275. &nbsp;
  8276. // 获取叶节点(最大level的所有节点)
  8277. <span class="cstat-no" title="statement not covered" > const leafNodes = chapters.filter((c: any) =&gt; c.level === maxLevel);</span>
  8278. &nbsp;
  8279. // 过滤出有音频的叶节点
  8280. <span class="cstat-no" title="statement not covered" > const leafNodesWithAudio = leafNodes.filter((c: any) =&gt; c.audioUrl &amp;&amp; c.audioUrl !== '');</span>
  8281. &nbsp;
  8282. <span class="cstat-no" title="statement not covered" > const leafTypeName = maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节';</span>
  8283. &nbsp;
  8284. <span class="cstat-no" title="statement not covered" > if (leafNodes.length === 0) {</span>
  8285. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: `没有${leafTypeName}` };</span>
  8286. <span class="cstat-no" title="statement not covered" > return;</span>
  8287. <span class="cstat-no" title="statement not covered" > }</span>
  8288. &nbsp;
  8289. <span class="cstat-no" title="statement not covered" > if (leafNodesWithAudio.length === 0) {</span>
  8290. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8291. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  8292. <span class="cstat-no" title="statement not covered" > message: `没有音频生成完成的${leafTypeName},请先生成音频`,</span>
  8293. <span class="cstat-no" title="statement not covered" > data: {</span>
  8294. <span class="cstat-no" title="statement not covered" > totalSubsections: leafNodes.length,</span>
  8295. <span class="cstat-no" title="statement not covered" > audioCompletedSubsections: 0,</span>
  8296. <span class="cstat-no" title="statement not covered" > }</span>
  8297. <span class="cstat-no" title="statement not covered" > };</span>
  8298. <span class="cstat-no" title="statement not covered" > return;</span>
  8299. <span class="cstat-no" title="statement not covered" > }</span>
  8300. &nbsp;
  8301. <span class="cstat-no" title="statement not covered" > console.log(`[Video] 书籍 ${bookId} 共有 ${leafNodes.length} 个${leafTypeName},其中 ${leafNodesWithAudio.length} 个音频已生成完成`);</span>
  8302. &nbsp;
  8303. // 异步生成所有叶节点视频
  8304. <span class="cstat-no" title="statement not covered" > const taskId = `video_${bookId}_${Date.now()}`;</span>
  8305. <span class="cstat-no" title="statement not covered" > console.log(`[Video] 开始批量生成视频: bookId=${bookId}, taskId=${taskId}, 总数=${leafNodesWithAudio.length}`);</span>
  8306. &nbsp;
  8307. <span class="cstat-no" title="statement not covered" > for (const sub of leafNodesWithAudio) {</span>
  8308. // 设置视频状态为生成中
  8309. <span class="cstat-no" title="statement not covered" > await advanceChapter(sub.id, 'video_generating').catch(() =&gt; {});</span>
  8310. &nbsp;
  8311. // 异步处理每个章节的视频生成
  8312. <span class="cstat-no" title="statement not covered" > (async () =&gt; {</span>
  8313. <span class="cstat-no" title="statement not covered" > try {</span>
  8314. <span class="cstat-no" title="statement not covered" > console.log(`[Video] 开始生成章节 ${sub.number} 的视频: ${sub.title}`);</span>
  8315. &nbsp;
  8316. // 从书籍章节创建视频项目
  8317. <span class="cstat-no" title="statement not covered" > const project = await createVideoProjectFromBook(</span>
  8318. <span class="cstat-no" title="statement not covered" > parseInt(bookId),</span>
  8319. <span class="cstat-no" title="statement not covered" > sub.id,</span>
  8320. <span class="cstat-no" title="statement not covered" > book.userId || 1</span>
  8321. <span class="cstat-no" title="statement not covered" > );</span>
  8322. &nbsp;
  8323. <span class="cstat-no" title="statement not covered" > if (!project) {</span>
  8324. <span class="cstat-no" title="statement not covered" > console.error(`[Video] 章节 ${sub.number} 视频项目创建失败`);</span>
  8325. <span class="cstat-no" title="statement not covered" > await regenerateChapter(sub.id, 'failed').catch(() =&gt; {});</span>
  8326. <span class="cstat-no" title="statement not covered" > return;</span>
  8327. <span class="cstat-no" title="statement not covered" > }</span>
  8328. &nbsp;
  8329. <span class="cstat-no" title="statement not covered" > console.log(`[Video] 章节 ${sub.number} 视频项目创建成功: projectId=${project.id}`);</span>
  8330. &nbsp;
  8331. // 生成视频
  8332. <span class="cstat-no" title="statement not covered" > const result = await generateVideoForProject(project.id);</span>
  8333. &nbsp;
  8334. <span class="cstat-no" title="statement not covered" > if (result.success &amp;&amp; result.outputUrl) {</span>
  8335. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(sub.id, {</span>
  8336. <span class="cstat-no" title="statement not covered" > videoUrl: result.outputUrl,</span>
  8337. <span class="cstat-no" title="statement not covered" > videoDuration: result.duration,</span>
  8338. <span class="cstat-no" title="statement not covered" > });</span>
  8339. <span class="cstat-no" title="statement not covered" > await advanceChapter(sub.id, 'video_completed');</span>
  8340. <span class="cstat-no" title="statement not covered" > } else {</span>
  8341. <span class="cstat-no" title="statement not covered" > await regenerateChapter(sub.id, 'failed');</span>
  8342. <span class="cstat-no" title="statement not covered" > }</span>
  8343. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8344. <span class="cstat-no" title="statement not covered" > console.error(`[Video] 章节 ${sub.number} 视频生成异常:`, error);</span>
  8345. <span class="cstat-no" title="statement not covered" > await regenerateChapter(sub.id, 'failed');</span>
  8346. <span class="cstat-no" title="statement not covered" > }</span>
  8347. <span class="cstat-no" title="statement not covered" > })();</span>
  8348. <span class="cstat-no" title="statement not covered" > }</span>
  8349. &nbsp;
  8350. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8351. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8352. <span class="cstat-no" title="statement not covered" > message: '视频生成任务已启动',</span>
  8353. <span class="cstat-no" title="statement not covered" > data: {</span>
  8354. <span class="cstat-no" title="statement not covered" > taskId,</span>
  8355. <span class="cstat-no" title="statement not covered" > totalChapters: leafNodesWithAudio.length,</span>
  8356. <span class="cstat-no" title="statement not covered" > totalSubsections: leafNodes.length,</span>
  8357. <span class="cstat-no" title="statement not covered" > },</span>
  8358. <span class="cstat-no" title="statement not covered" > };</span>
  8359. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8360. <span class="cstat-no" title="statement not covered" > console.error('批量生成视频失败:', error);</span>
  8361. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8362. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '批量生成视频失败' };</span>
  8363. <span class="cstat-no" title="statement not covered" > }</span>
  8364. <span class="cstat-no" title="statement not covered" >});</span>
  8365. &nbsp;
  8366. /**
  8367. * POST /api/book-generator/langgraph/books/:id/merge-audio
  8368. * 合并叶节点音频到上级章节
  8369. */
  8370. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/merge-audio', async (ctx: Context) =&gt; {</span>
  8371. <span class="cstat-no" title="statement not covered" > try {</span>
  8372. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  8373. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  8374. &nbsp;
  8375. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8376. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8377. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8378. <span class="cstat-no" title="statement not covered" > return;</span>
  8379. <span class="cstat-no" title="statement not covered" > }</span>
  8380. &nbsp;
  8381. // 获取章节树
  8382. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  8383. &nbsp;
  8384. // 动态获取叶节点层级(最大level值)
  8385. <span class="cstat-no" title="statement not covered" > const maxLevel = chapters.length &gt; 0</span>
  8386. <span class="cstat-no" title="statement not covered" > ? Math.max(...chapters.map((c: any) =&gt; c.level || 0))</span>
  8387. <span class="cstat-no" title="statement not covered" > : 0;</span>
  8388. &nbsp;
  8389. <span class="cstat-no" title="statement not covered" > if (maxLevel &lt;= 1) {</span>
  8390. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍层级不足,无法合并音频' };</span>
  8391. <span class="cstat-no" title="statement not covered" > return;</span>
  8392. <span class="cstat-no" title="statement not covered" > }</span>
  8393. &nbsp;
  8394. // 获取叶节点(最大level的所有节点)
  8395. <span class="cstat-no" title="statement not covered" > const leafNodes = chapters.filter((c: any) =&gt; c.level === maxLevel);</span>
  8396. &nbsp;
  8397. // 检查所有叶节点是否都有音频
  8398. <span class="cstat-no" title="statement not covered" > const leafNodesWithAudio = leafNodes.filter((c: any) =&gt; c.audioUrl &amp;&amp; c.audioUrl !== '');</span>
  8399. &nbsp;
  8400. <span class="cstat-no" title="statement not covered" > if (leafNodes.length === 0) {</span>
  8401. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: `没有${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'}` };</span>
  8402. <span class="cstat-no" title="statement not covered" > return;</span>
  8403. <span class="cstat-no" title="statement not covered" > }</span>
  8404. &nbsp;
  8405. <span class="cstat-no" title="statement not covered" > if (leafNodesWithAudio.length !== leafNodes.length) {</span>
  8406. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8407. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  8408. <span class="cstat-no" title="statement not covered" > message: `并非所有${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'}都已完成音频生成,无法合并`,</span>
  8409. <span class="cstat-no" title="statement not covered" > data: {</span>
  8410. <span class="cstat-no" title="statement not covered" > totalLeafNodes: leafNodes.length,</span>
  8411. <span class="cstat-no" title="statement not covered" > completedAudioNodes: leafNodesWithAudio.length,</span>
  8412. <span class="cstat-no" title="statement not covered" > }</span>
  8413. <span class="cstat-no" title="statement not covered" > };</span>
  8414. <span class="cstat-no" title="statement not covered" > return;</span>
  8415. <span class="cstat-no" title="statement not covered" > }</span>
  8416. &nbsp;
  8417. // 构建 sectionId → chapterId 映射(3层树需要,2层树直接 parentId 就是 chapterId)
  8418. <span class="cstat-no" title="statement not covered" > const sectionToChapter = new Map&lt;number, number&gt;();</span>
  8419. <span class="cstat-no" title="statement not covered" > if (maxLevel &gt;= 3) {</span>
  8420. <span class="cstat-no" title="statement not covered" > const sections = chapters.filter((c: any) =&gt; c.level === 2);</span>
  8421. <span class="cstat-no" title="statement not covered" > for (const sec of sections) {</span>
  8422. <span class="cstat-no" title="statement not covered" > if (sec.parentId) {</span>
  8423. <span class="cstat-no" title="statement not covered" > sectionToChapter.set(sec.id, sec.parentId);</span>
  8424. <span class="cstat-no" title="statement not covered" > }</span>
  8425. <span class="cstat-no" title="statement not covered" > }</span>
  8426. <span class="cstat-no" title="statement not covered" > }</span>
  8427. &nbsp;
  8428. // 按章(level=1)分组叶节点
  8429. <span class="cstat-no" title="statement not covered" > const groupedByChapter: { [key: number]: any[] } = {};</span>
  8430. <span class="cstat-no" title="statement not covered" > const chapterMeta: { [key: number]: any } = {}; // 章的基本信息</span>
  8431. <span class="cstat-no" title="statement not covered" > leafNodesWithAudio.forEach(node =&gt; {</span>
  8432. // 找到该叶节点所属的1级章ID
  8433. <span class="cstat-no" title="statement not covered" > let chapterId: number | null = null;</span>
  8434. <span class="cstat-no" title="statement not covered" > if (maxLevel === 2) {</span>
  8435. <span class="cstat-no" title="statement not covered" > chapterId = node.parentId; // level=2叶节点的parentId就是章</span>
  8436. <span class="cstat-no" title="statement not covered" > } else if (maxLevel === 3 &amp;&amp; node.parentId) {</span>
  8437. <span class="cstat-no" title="statement not covered" > chapterId = sectionToChapter.get(node.parentId) || null; // 通过节→章映射</span>
  8438. <span class="cstat-no" title="statement not covered" > }</span>
  8439. &nbsp;
  8440. <span class="cstat-no" title="statement not covered" > if (chapterId) {</span>
  8441. <span class="cstat-no" title="statement not covered" > if (!groupedByChapter[chapterId]) {</span>
  8442. <span class="cstat-no" title="statement not covered" > groupedByChapter[chapterId] = [];</span>
  8443. <span class="cstat-no" title="statement not covered" > }</span>
  8444. <span class="cstat-no" title="statement not covered" > groupedByChapter[chapterId].push(node);</span>
  8445. <span class="cstat-no" title="statement not covered" > }</span>
  8446. <span class="cstat-no" title="statement not covered" > });</span>
  8447. &nbsp;
  8448. // 收集各章的元信息
  8449. <span class="cstat-no" title="statement not covered" > for (const ch of chapters) {</span>
  8450. <span class="cstat-no" title="statement not covered" > if (ch.level === 1) {</span>
  8451. <span class="cstat-no" title="statement not covered" > chapterMeta[ch.id] = ch;</span>
  8452. <span class="cstat-no" title="statement not covered" > }</span>
  8453. <span class="cstat-no" title="statement not covered" > }</span>
  8454. &nbsp;
  8455. <span class="cstat-no" title="statement not covered" > const chapterIds = Object.keys(groupedByChapter);</span>
  8456. &nbsp;
  8457. // 对每个章下的叶节点音频进行合并
  8458. <span class="cstat-no" title="statement not covered" > for (const chapterId of chapterIds) {</span>
  8459. <span class="cstat-no" title="statement not covered" > const chId = parseInt(chapterId);</span>
  8460. <span class="cstat-no" title="statement not covered" > const childNodes = groupedByChapter[chId];</span>
  8461. <span class="cstat-no" title="statement not covered" > const chInfo = chapterMeta[chId];</span>
  8462. &nbsp;
  8463. <span class="cstat-no" title="statement not covered" > if (childNodes.length &gt; 0) {</span>
  8464. <span class="cstat-no" title="statement not covered" > try {</span>
  8465. <span class="cstat-no" title="statement not covered" > const mergedAudioUrl = await mergeChapterAudios(chId);</span>
  8466. &nbsp;
  8467. <span class="cstat-no" title="statement not covered" > if (mergedAudioUrl) {</span>
  8468. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Audio] 章 ${chInfo?.number || chId}(${chInfo?.title || ''}) 音频合并完成: ${mergedAudioUrl}`);</span>
  8469. <span class="cstat-no" title="statement not covered" > }</span>
  8470. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8471. <span class="cstat-no" title="statement not covered" > console.error(`[Merge Audio] 章 ${chInfo?.number || chId}(${chInfo?.title || ''}) 音频合并失败:`, error);</span>
  8472. <span class="cstat-no" title="statement not covered" > }</span>
  8473. <span class="cstat-no" title="statement not covered" > }</span>
  8474. <span class="cstat-no" title="statement not covered" > }</span>
  8475. &nbsp;
  8476. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8477. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8478. <span class="cstat-no" title="statement not covered" > message: `音频合并任务已启动,共处理 ${chapterIds.length} 个章`,</span>
  8479. <span class="cstat-no" title="statement not covered" > data: {</span>
  8480. <span class="cstat-no" title="statement not covered" > processedParents: chapterIds.length,</span>
  8481. <span class="cstat-no" title="statement not covered" > totalLeafNodes: leafNodes.length,</span>
  8482. <span class="cstat-no" title="statement not covered" > },</span>
  8483. <span class="cstat-no" title="statement not covered" > };</span>
  8484. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8485. <span class="cstat-no" title="statement not covered" > console.error('合并音频失败:', error);</span>
  8486. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8487. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '合并音频失败' };</span>
  8488. <span class="cstat-no" title="statement not covered" > }</span>
  8489. <span class="cstat-no" title="statement not covered" >});</span>
  8490. &nbsp;
  8491. /**
  8492. * POST /api/book-generator/langgraph/books/:id/merge-video
  8493. * 合并叶节点视频到上级章节
  8494. */
  8495. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/merge-video', async (ctx: Context) =&gt; {</span>
  8496. <span class="cstat-no" title="statement not covered" > try {</span>
  8497. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id as string;</span>
  8498. <span class="cstat-no" title="statement not covered" > const book = await bookStore.getById(bookId);</span>
  8499. &nbsp;
  8500. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8501. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8502. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8503. <span class="cstat-no" title="statement not covered" > return;</span>
  8504. <span class="cstat-no" title="statement not covered" > }</span>
  8505. &nbsp;
  8506. // 获取章节树
  8507. <span class="cstat-no" title="statement not covered" > const chapters = await bookStore.getChapterTree(bookId);</span>
  8508. &nbsp;
  8509. // 动态获取叶节点层级(最大level值)
  8510. <span class="cstat-no" title="statement not covered" > const maxLevel = chapters.length &gt; 0</span>
  8511. <span class="cstat-no" title="statement not covered" > ? Math.max(...chapters.map((c: any) =&gt; c.level || 0))</span>
  8512. <span class="cstat-no" title="statement not covered" > : 0;</span>
  8513. &nbsp;
  8514. <span class="cstat-no" title="statement not covered" > if (maxLevel &lt;= 1) {</span>
  8515. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍层级不足,无法合并视频' };</span>
  8516. <span class="cstat-no" title="statement not covered" > return;</span>
  8517. <span class="cstat-no" title="statement not covered" > }</span>
  8518. &nbsp;
  8519. // 获取叶节点(最大level的所有节点)
  8520. <span class="cstat-no" title="statement not covered" > const leafNodes = chapters.filter((c: any) =&gt; c.level === maxLevel);</span>
  8521. &nbsp;
  8522. // 检查所有叶节点是否都有视频
  8523. <span class="cstat-no" title="statement not covered" > const leafNodesWithVideo = leafNodes.filter((c: any) =&gt; c.videoUrl &amp;&amp; c.videoUrl !== '');</span>
  8524. &nbsp;
  8525. <span class="cstat-no" title="statement not covered" > if (leafNodes.length === 0) {</span>
  8526. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: `没有${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'}` };</span>
  8527. <span class="cstat-no" title="statement not covered" > return;</span>
  8528. <span class="cstat-no" title="statement not covered" > }</span>
  8529. &nbsp;
  8530. <span class="cstat-no" title="statement not covered" > if (leafNodesWithVideo.length !== leafNodes.length) {</span>
  8531. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8532. <span class="cstat-no" title="statement not covered" > code: 1,</span>
  8533. <span class="cstat-no" title="statement not covered" > message: `并非所有${maxLevel === 3 ? '小节' : maxLevel === 2 ? '节' : '章节'}都已完成视频生成,无法合并`,</span>
  8534. <span class="cstat-no" title="statement not covered" > data: {</span>
  8535. <span class="cstat-no" title="statement not covered" > totalLeafNodes: leafNodes.length,</span>
  8536. <span class="cstat-no" title="statement not covered" > completedVideoNodes: leafNodesWithVideo.length,</span>
  8537. <span class="cstat-no" title="statement not covered" > }</span>
  8538. <span class="cstat-no" title="statement not covered" > };</span>
  8539. <span class="cstat-no" title="statement not covered" > return;</span>
  8540. <span class="cstat-no" title="statement not covered" > }</span>
  8541. &nbsp;
  8542. // 按父节点分组叶节点(通常是1级章节)
  8543. <span class="cstat-no" title="statement not covered" > const groupedByParent: { [key: number]: any[] } = {};</span>
  8544. <span class="cstat-no" title="statement not covered" > leafNodesWithVideo.forEach(node =&gt; {</span>
  8545. <span class="cstat-no" title="statement not covered" > if (node.parentId) {</span>
  8546. <span class="cstat-no" title="statement not covered" > if (!groupedByParent[node.parentId]) {</span>
  8547. <span class="cstat-no" title="statement not covered" > groupedByParent[node.parentId] = [];</span>
  8548. <span class="cstat-no" title="statement not covered" > }</span>
  8549. <span class="cstat-no" title="statement not covered" > groupedByParent[node.parentId].push(node);</span>
  8550. <span class="cstat-no" title="statement not covered" > }</span>
  8551. <span class="cstat-no" title="statement not covered" > });</span>
  8552. &nbsp;
  8553. // 对每个父节点下的叶节点视频进行合并
  8554. <span class="cstat-no" title="statement not covered" > let totalProcessedParents = 0;</span>
  8555. <span class="cstat-no" title="statement not covered" > for (const parentId in groupedByParent) {</span>
  8556. <span class="cstat-no" title="statement not covered" > const childNodes = groupedByParent[parentId];</span>
  8557. <span class="cstat-no" title="statement not covered" > if (childNodes.length &gt; 0) {</span>
  8558. // 获取父章节信息
  8559. <span class="cstat-no" title="statement not covered" > const parentChapter = chapters.find((c: any) =&gt; c.id === parseInt(parentId));</span>
  8560. &nbsp;
  8561. <span class="cstat-no" title="statement not covered" > if (parentChapter) {</span>
  8562. <span class="cstat-no" title="statement not covered" > try {</span>
  8563. // 调用合并函数
  8564. <span class="cstat-no" title="statement not covered" > const mergedVideoUrl = await mergeChapterVideos(</span>
  8565. <span class="cstat-no" title="statement not covered" > parentChapter,</span>
  8566. <span class="cstat-no" title="statement not covered" > childNodes,</span>
  8567. <span class="cstat-no" title="statement not covered" > book.userId || 1</span>
  8568. <span class="cstat-no" title="statement not covered" > );</span>
  8569. &nbsp;
  8570. <span class="cstat-no" title="statement not covered" > if (mergedVideoUrl) {</span>
  8571. // 更新父章节的视频URL
  8572. <span class="cstat-no" title="statement not covered" > await bookStore.updateChapterById(parentChapter.id, {</span>
  8573. <span class="cstat-no" title="statement not covered" > videoUrl: mergedVideoUrl,</span>
  8574. <span class="cstat-no" title="statement not covered" > });</span>
  8575. &nbsp;
  8576. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] 章节 ${parentChapter.number}(${parentChapter.title}) 视频合并完成: ${mergedVideoUrl}`);</span>
  8577. <span class="cstat-no" title="statement not covered" > totalProcessedParents++;</span>
  8578. <span class="cstat-no" title="statement not covered" > }</span>
  8579. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8580. <span class="cstat-no" title="statement not covered" > console.error(`[Merge Video] 章节 ${parentChapter.number}(${parentChapter.title}) 视频合并失败:`, error);</span>
  8581. // 不抛出异常,继续处理其他章节
  8582. <span class="cstat-no" title="statement not covered" > }</span>
  8583. <span class="cstat-no" title="statement not covered" > }</span>
  8584. <span class="cstat-no" title="statement not covered" > }</span>
  8585. <span class="cstat-no" title="statement not covered" > }</span>
  8586. &nbsp;
  8587. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8588. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8589. <span class="cstat-no" title="statement not covered" > message: `视频合并任务已完成,共处理 ${totalProcessedParents} 个上级章节`,</span>
  8590. <span class="cstat-no" title="statement not covered" > data: {</span>
  8591. <span class="cstat-no" title="statement not covered" > processedParents: totalProcessedParents,</span>
  8592. <span class="cstat-no" title="statement not covered" > totalLeafNodes: leafNodes.length,</span>
  8593. <span class="cstat-no" title="statement not covered" > },</span>
  8594. <span class="cstat-no" title="statement not covered" > };</span>
  8595. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8596. <span class="cstat-no" title="statement not covered" > console.error('合并视频失败:', error);</span>
  8597. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8598. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '合并视频失败' };</span>
  8599. <span class="cstat-no" title="statement not covered" > }</span>
  8600. <span class="cstat-no" title="statement not covered" >});</span>
  8601. &nbsp;
  8602. /**
  8603. * 合并章节视频的辅助函数
  8604. */
  8605. <span class="cstat-no" title="statement not covered" >async function mergeChapterVideos(parentChapter: any, childChapters: any[], userId: number) {</span>
  8606. <span class="cstat-no" title="statement not covered" > try {</span>
  8607. // 获取项目根目录(假设视频文件存储在特定目录下)
  8608. <span class="cstat-no" title="statement not covered" > const videoDir = path.join(__dirname, '../../../../../../uploads/video');</span>
  8609. <span class="cstat-no" title="statement not covered" > const outputDir = path.join(videoDir, 'merged');</span>
  8610. &nbsp;
  8611. // 确保输出目录存在
  8612. <span class="cstat-no" title="statement not covered" > await fs.mkdir(outputDir, { recursive: true });</span>
  8613. &nbsp;
  8614. // 创建合并文件列表
  8615. <span class="cstat-no" title="statement not covered" > const fileListPath = path.join(videoDir, `merge_list_${parentChapter.id}.txt`);</span>
  8616. <span class="cstat-no" title="statement not covered" > const outputPath = path.join(outputDir, `merged_chapter_${parentChapter.id}_${Date.now()}.mp4`);</span>
  8617. &nbsp;
  8618. // 准备要合并的视频文件路径
  8619. <span class="cstat-no" title="statement not covered" > const videoPaths = [];</span>
  8620. <span class="cstat-no" title="statement not covered" > for (const child of childChapters) {</span>
  8621. <span class="cstat-no" title="statement not covered" > if (child.videoUrl) {</span>
  8622. // 从URL提取文件名
  8623. <span class="cstat-no" title="statement not covered" > const fileName = path.basename(child.videoUrl);</span>
  8624. <span class="cstat-no" title="statement not covered" > const fullPath = path.join(videoDir, fileName);</span>
  8625. &nbsp;
  8626. // 检查文件是否存在
  8627. <span class="cstat-no" title="statement not covered" > try {</span>
  8628. <span class="cstat-no" title="statement not covered" > await fs.access(fullPath);</span>
  8629. <span class="cstat-no" title="statement not covered" > videoPaths.push(fullPath);</span>
  8630. <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
  8631. <span class="cstat-no" title="statement not covered" > console.error(`[Merge Video] 文件不存在: ${fullPath}`, err);</span>
  8632. <span class="cstat-no" title="statement not covered" > continue; // 跳过不存在的文件</span>
  8633. <span class="cstat-no" title="statement not covered" > }</span>
  8634. <span class="cstat-no" title="statement not covered" > }</span>
  8635. <span class="cstat-no" title="statement not covered" > }</span>
  8636. &nbsp;
  8637. <span class="cstat-no" title="statement not covered" > if (videoPaths.length === 0) {</span>
  8638. <span class="cstat-no" title="statement not covered" > throw new Error('没有找到有效的视频文件');</span>
  8639. <span class="cstat-no" title="statement not covered" > }</span>
  8640. &nbsp;
  8641. <span class="cstat-no" title="statement not covered" > if (videoPaths.length === 1) {</span>
  8642. // 如果只有一个视频,检查格式是否一致
  8643. <span class="cstat-no" title="statement not covered" > const srcExt = videoPaths[0].split('.').pop()?.toLowerCase();</span>
  8644. <span class="cstat-no" title="statement not covered" > const dstExt = outputPath.split('.').pop()?.toLowerCase();</span>
  8645. <span class="cstat-no" title="statement not covered" > if (srcExt !== dstExt) {</span>
  8646. // 格式不同,用 FFmpeg 转码
  8647. <span class="cstat-no" title="statement not covered" > const cmd = `ffmpeg -i "${videoPaths[0]}" -c copy -y "${outputPath}"`;</span>
  8648. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] 格式不同,转码: ${cmd}`);</span>
  8649. <span class="cstat-no" title="statement not covered" > await execPromise(cmd);</span>
  8650. <span class="cstat-no" title="statement not covered" > } else {</span>
  8651. <span class="cstat-no" title="statement not covered" > await fs.copyFile(videoPaths[0], outputPath);</span>
  8652. <span class="cstat-no" title="statement not covered" > }</span>
  8653. <span class="cstat-no" title="statement not covered" > const relativePath = outputPath.replace(videoDir, '/uploads/video').replace(/\\/g, '/');</span>
  8654. <span class="cstat-no" title="statement not covered" > return relativePath;</span>
  8655. <span class="cstat-no" title="statement not covered" > }</span>
  8656. &nbsp;
  8657. // 创建FFmpeg输入列表 - 使用concat协议来合并视频
  8658. <span class="cstat-no" title="statement not covered" > const inputLines = videoPaths.map(videoPath =&gt; `file '${videoPath}'`).join('\n');</span>
  8659. <span class="cstat-no" title="statement not covered" > await fs.writeFile(fileListPath, inputLines);</span>
  8660. &nbsp;
  8661. // 使用FFmpeg合并视频 - 更安全的方式,避免编码问题
  8662. // 先尝试简单的copy方式
  8663. <span class="cstat-no" title="statement not covered" > const cmd = `ffmpeg -f concat -safe 0 -i "${fileListPath}" -c copy -avoid_negative_ts make_zero "${outputPath}"`;</span>
  8664. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] 执行命令: ${cmd}`);</span>
  8665. &nbsp;
  8666. <span class="cstat-no" title="statement not covered" > let result;</span>
  8667. <span class="cstat-no" title="statement not covered" > try {</span>
  8668. <span class="cstat-no" title="statement not covered" > result = await execPromise(cmd);</span>
  8669. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] FFmpeg stdout:`, result.stdout);</span>
  8670. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] FFmpeg stderr:`, result.stderr);</span>
  8671. <span class="cstat-no" title="statement not covered" > } catch (execErr: any) {</span>
  8672. <span class="cstat-no" title="statement not covered" > console.warn(`[Merge Video] copy模式失败,尝试重新编码:`, execErr.message);</span>
  8673. // 如果简单copy失败,尝试重新编码
  8674. <span class="cstat-no" title="statement not covered" > const reencodeCmd = `ffmpeg -f concat -safe 0 -i "${fileListPath}" -c:v libx264 -c:a aac -avoid_negative_ts make_zero "${outputPath}"`;</span>
  8675. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] 执行重新编码命令: ${reencodeCmd}`);</span>
  8676. <span class="cstat-no" title="statement not covered" > result = await execPromise(reencodeCmd);</span>
  8677. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] FFmpeg reencode stdout:`, result.stdout);</span>
  8678. <span class="cstat-no" title="statement not covered" > console.log(`[Merge Video] FFmpeg reencode stderr:`, result.stderr);</span>
  8679. <span class="cstat-no" title="statement not covered" > }</span>
  8680. &nbsp;
  8681. // 清理临时文件
  8682. <span class="cstat-no" title="statement not covered" > await fs.unlink(fileListPath).catch(() =&gt; {});</span>
  8683. &nbsp;
  8684. // 检查输出文件是否成功创建
  8685. <span class="cstat-no" title="statement not covered" > try {</span>
  8686. <span class="cstat-no" title="statement not covered" > await fs.access(outputPath);</span>
  8687. <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
  8688. <span class="cstat-no" title="statement not covered" > throw new Error('视频合并后文件未生成');</span>
  8689. <span class="cstat-no" title="statement not covered" > }</span>
  8690. &nbsp;
  8691. // 返回相对路径(相对于上传目录)
  8692. <span class="cstat-no" title="statement not covered" > const relativePath = outputPath.replace(videoDir, '/uploads/video').replace(/\\/g, '/');</span>
  8693. <span class="cstat-no" title="statement not covered" > return relativePath;</span>
  8694. &nbsp;
  8695. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8696. <span class="cstat-no" title="statement not covered" > console.error('[Merge Video] 合并过程中出错:', error);</span>
  8697. <span class="cstat-no" title="statement not covered" > throw error;</span>
  8698. <span class="cstat-no" title="statement not covered" > }</span>
  8699. <span class="cstat-no" title="statement not covered" >}</span>
  8700. &nbsp;
  8701. /**
  8702. * DEBUG: 手动触发章节音频生成(强制从content_completed重新开始)
  8703. * POST /api/book-generator/debug/trigger-audio
  8704. */
  8705. <span class="cstat-no" title="statement not covered" >router.post('/debug/trigger-audio', async (ctx: Context) =&gt; {</span>
  8706. <span class="cstat-no" title="statement not covered" > try {</span>
  8707. <span class="cstat-no" title="statement not covered" > const { chapterId } = ctx.request.body as { chapterId?: number };</span>
  8708. <span class="cstat-no" title="statement not covered" > if (!chapterId) {</span>
  8709. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8710. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '缺少 chapterId' };</span>
  8711. <span class="cstat-no" title="statement not covered" > return;</span>
  8712. <span class="cstat-no" title="statement not covered" > }</span>
  8713. &nbsp;
  8714. // 先检查chapter状态,如果是audio_generating但没有audioUrl,说明之前的生成卡住了
  8715. <span class="cstat-no" title="statement not covered" > const chapter = await prisma.bookChapter.findUnique({ where: { id: chapterId } });</span>
  8716. <span class="cstat-no" title="statement not covered" > if (chapter?.genStage === 'audio_generating' &amp;&amp; !chapter?.audioUrl) {</span>
  8717. <span class="cstat-no" title="statement not covered" > console.log(`[DEBUG] 章节${chapterId}卡在audio_generating无audioUrl,重置到content_completed重新生成`);</span>
  8718. <span class="cstat-no" title="statement not covered" > await prisma.bookChapter.update({ where: { id: chapterId }, data: { genStage: 'content_completed' } });</span>
  8719. <span class="cstat-no" title="statement not covered" > }</span>
  8720. &nbsp;
  8721. <span class="cstat-no" title="statement not covered" > console.log(`[DEBUG] 手动触发章节${chapterId}音频生成`);</span>
  8722. <span class="cstat-no" title="statement not covered" > await bookStore.generateChapterAudioById(chapterId);</span>
  8723. &nbsp;
  8724. <span class="cstat-no" title="statement not covered" > const updated = await prisma.bookChapter.findUnique({ where: { id: chapterId } });</span>
  8725. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8726. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8727. <span class="cstat-no" title="statement not covered" > message: '音频生成已触发',</span>
  8728. <span class="cstat-no" title="statement not covered" > data: { chapterId, genStage: updated?.genStage, audioUrl: updated?.audioUrl },</span>
  8729. <span class="cstat-no" title="statement not covered" > };</span>
  8730. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8731. <span class="cstat-no" title="statement not covered" > console.error('[DEBUG] 触发音频失败:', error);</span>
  8732. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8733. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '触发失败' };</span>
  8734. <span class="cstat-no" title="statement not covered" > }</span>
  8735. <span class="cstat-no" title="statement not covered" >});</span>
  8736. &nbsp;
  8737. &nbsp;
  8738. // ============ 交互式生成 API ============
  8739. &nbsp;
  8740. /**
  8741. * POST /api/book-generator/langgraph/books/:id/interactive/plan
  8742. * 异步启动深度规划,前端通过 GET 同名接口轮询结果
  8743. */
  8744. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/interactive/plan', optionalAuth, async (ctx: Context) =&gt; {</span>
  8745. <span class="cstat-no" title="statement not covered" > try {</span>
  8746. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  8747. <span class="cstat-no" title="statement not covered" > const idNum = parseInt(bookId);</span>
  8748. <span class="cstat-no" title="statement not covered" > const book = await prisma.book.findUnique({ where: { id: idNum } });</span>
  8749. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8750. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8751. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8752. <span class="cstat-no" title="statement not covered" > return;</span>
  8753. <span class="cstat-no" title="statement not covered" > }</span>
  8754. &nbsp;
  8755. // 标记为生成中,立即返回
  8756. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8757. <span class="cstat-no" title="statement not covered" > where: { id: idNum },</span>
  8758. <span class="cstat-no" title="statement not covered" > data: { genStage: 'plan_generating' },</span>
  8759. <span class="cstat-no" title="statement not covered" > });</span>
  8760. &nbsp;
  8761. // 构造 minimal state
  8762. <span class="cstat-no" title="statement not covered" > const body = (ctx.request as any).body || {};</span>
  8763. <span class="cstat-no" title="statement not covered" > const userFeedback = body.feedback || '';</span>
  8764. <span class="cstat-no" title="statement not covered" > const initState: any = {</span>
  8765. <span class="cstat-no" title="statement not covered" > bookId,</span>
  8766. <span class="cstat-no" title="statement not covered" > topic: book.description,</span>
  8767. <span class="cstat-no" title="statement not covered" > bookScale: book.bookScale || '1000',</span>
  8768. <span class="cstat-no" title="statement not covered" > genLevel: (book as any).genLevel || 2,</span>
  8769. <span class="cstat-no" title="statement not covered" > description: book.description,</span>
  8770. <span class="cstat-no" title="statement not covered" > title: book.title,</span>
  8771. <span class="cstat-no" title="statement not covered" > userId: book.userId,</span>
  8772. <span class="cstat-no" title="statement not covered" > completedChapters: [],</span>
  8773. <span class="cstat-no" title="statement not covered" > failedChapters: [],</span>
  8774. <span class="cstat-no" title="statement not covered" > userFeedback,</span>
  8775. <span class="cstat-no" title="statement not covered" > };</span>
  8776. &nbsp;
  8777. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 深度规划已启动(异步): bookId=${bookId}${userFeedback ? ', 含用户反馈' : ''}`);</span>
  8778. &nbsp;
  8779. // 异步执行 AI 调用,不阻塞响应
  8780. <span class="cstat-no" title="statement not covered" > setImmediate(async () =&gt; {</span>
  8781. <span class="cstat-no" title="statement not covered" > try {</span>
  8782. <span class="cstat-no" title="statement not covered" > const result = await deepPlanBookNode(initState);</span>
  8783. <span class="cstat-no" title="statement not covered" > const bookPlan = result.bookPlan || '';</span>
  8784. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8785. <span class="cstat-no" title="statement not covered" > where: { id: idNum },</span>
  8786. <span class="cstat-no" title="statement not covered" > data: { bookAnalysis: bookPlan, genStage: 'plan_ready' },</span>
  8787. <span class="cstat-no" title="statement not covered" > });</span>
  8788. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 深度规划完成: bookId=${bookId}`);</span>
  8789. <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
  8790. <span class="cstat-no" title="statement not covered" > console.error(`[Interactive] 深度规划失败: bookId=${bookId}`, err);</span>
  8791. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8792. <span class="cstat-no" title="statement not covered" > where: { id: idNum },</span>
  8793. <span class="cstat-no" title="statement not covered" > data: { genStage: 'plan_failed', errorMsg: err instanceof Error ? err.message : '规划失败' },</span>
  8794. <span class="cstat-no" title="statement not covered" > });</span>
  8795. <span class="cstat-no" title="statement not covered" > }</span>
  8796. <span class="cstat-no" title="statement not covered" > });</span>
  8797. &nbsp;
  8798. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8799. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8800. <span class="cstat-no" title="statement not covered" > message: '规划已启动',</span>
  8801. <span class="cstat-no" title="statement not covered" > data: { genStage: 'plan_generating' },</span>
  8802. <span class="cstat-no" title="statement not covered" > };</span>
  8803. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8804. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] plan 启动失败:', error);</span>
  8805. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8806. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '启动失败' };</span>
  8807. <span class="cstat-no" title="statement not covered" > }</span>
  8808. <span class="cstat-no" title="statement not covered" >});</span>
  8809. &nbsp;
  8810. /**
  8811. * GET /api/book-generator/langgraph/books/:id/interactive/plan
  8812. * 轮询获取深度规划结果
  8813. */
  8814. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/interactive/plan', optionalAuth, async (ctx: Context) =&gt; {</span>
  8815. <span class="cstat-no" title="statement not covered" > try {</span>
  8816. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  8817. <span class="cstat-no" title="statement not covered" > const book = await prisma.book.findUnique({ where: { id: parseInt(bookId) } });</span>
  8818. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8819. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8820. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8821. <span class="cstat-no" title="statement not covered" > return;</span>
  8822. <span class="cstat-no" title="statement not covered" > }</span>
  8823. &nbsp;
  8824. <span class="cstat-no" title="statement not covered" > const stage = (book as any).genStage || '';</span>
  8825. &nbsp;
  8826. <span class="cstat-no" title="statement not covered" > if (stage === 'plan_failed') {</span>
  8827. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, data: { genStage: 'plan_failed', error: (book as any).errorMsg || '规划失败' } };</span>
  8828. <span class="cstat-no" title="statement not covered" > return;</span>
  8829. <span class="cstat-no" title="statement not covered" > }</span>
  8830. &nbsp;
  8831. <span class="cstat-no" title="statement not covered" > if (stage === 'plan_ready' || book.bookAnalysis) {</span>
  8832. <span class="cstat-no" title="statement not covered" > const bookPlan = book.bookAnalysis || '';</span>
  8833. <span class="cstat-no" title="statement not covered" > let planData: any = null;</span>
  8834. <span class="cstat-no" title="statement not covered" > try {</span>
  8835. <span class="cstat-no" title="statement not covered" > const fixed_json = bookPlan.replace(/\\u000a/g, '\\n').replace(/\\\\/g, '\\');</span>
  8836. <span class="cstat-no" title="statement not covered" > const match = fixed_json.match(/\{[\s\S]*\}/);</span>
  8837. <span class="cstat-no" title="statement not covered" > if (match) planData = JSON.parse(match[0]);</span>
  8838. <span class="cstat-no" title="statement not covered" > } catch (e) { /* ignore */ }</span>
  8839. &nbsp;
  8840. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8841. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8842. <span class="cstat-no" title="statement not covered" > message: '规划完成',</span>
  8843. <span class="cstat-no" title="statement not covered" > data: { rawPlan: bookPlan, planData, genStage: 'plan_ready' },</span>
  8844. <span class="cstat-no" title="statement not covered" > };</span>
  8845. <span class="cstat-no" title="statement not covered" > return;</span>
  8846. <span class="cstat-no" title="statement not covered" > }</span>
  8847. &nbsp;
  8848. // 还在生成中
  8849. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8850. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8851. <span class="cstat-no" title="statement not covered" > data: { genStage: stage || 'plan_generating' },</span>
  8852. <span class="cstat-no" title="statement not covered" > };</span>
  8853. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8854. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] 查询 plan 失败:', error);</span>
  8855. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8856. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '查询失败' };</span>
  8857. <span class="cstat-no" title="statement not covered" > }</span>
  8858. <span class="cstat-no" title="statement not covered" >});</span>
  8859. &nbsp;
  8860. /**
  8861. * PUT /api/book-generator/langgraph/books/:id/interactive/plan
  8862. * 保存用户修改后的 plan
  8863. */
  8864. <span class="cstat-no" title="statement not covered" >router.put('/books/:id/interactive/plan', optionalAuth, async (ctx: Context) =&gt; {</span>
  8865. <span class="cstat-no" title="statement not covered" > try {</span>
  8866. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  8867. <span class="cstat-no" title="statement not covered" > const { plan } = ctx.request.body as { plan: string };</span>
  8868. &nbsp;
  8869. <span class="cstat-no" title="statement not covered" > if (!plan) {</span>
  8870. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  8871. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: 'plan 不能为空' };</span>
  8872. <span class="cstat-no" title="statement not covered" > return;</span>
  8873. <span class="cstat-no" title="statement not covered" > }</span>
  8874. &nbsp;
  8875. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8876. <span class="cstat-no" title="statement not covered" > where: { id: parseInt(bookId) },</span>
  8877. <span class="cstat-no" title="statement not covered" > data: { bookAnalysis: plan },</span>
  8878. <span class="cstat-no" title="statement not covered" > });</span>
  8879. &nbsp;
  8880. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, message: 'Plan 已保存' };</span>
  8881. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8882. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] 保存 plan 失败:', error);</span>
  8883. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8884. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '保存失败' };</span>
  8885. <span class="cstat-no" title="statement not covered" > }</span>
  8886. <span class="cstat-no" title="statement not covered" >});</span>
  8887. &nbsp;
  8888. /**
  8889. * POST /api/book-generator/langgraph/books/:id/interactive/outline
  8890. * 异步启动大纲生成,前端通过 GET 同名接口轮询结果
  8891. */
  8892. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/interactive/outline', optionalAuth, async (ctx: Context) =&gt; {</span>
  8893. <span class="cstat-no" title="statement not covered" > try {</span>
  8894. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  8895. <span class="cstat-no" title="statement not covered" > const idNum = parseInt(bookId);</span>
  8896. <span class="cstat-no" title="statement not covered" > const book = await prisma.book.findUnique({ where: { id: idNum } });</span>
  8897. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8898. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8899. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8900. <span class="cstat-no" title="statement not covered" > return;</span>
  8901. <span class="cstat-no" title="statement not covered" > }</span>
  8902. &nbsp;
  8903. // 标记为生成中,立即返回
  8904. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8905. <span class="cstat-no" title="statement not covered" > where: { id: idNum },</span>
  8906. <span class="cstat-no" title="statement not covered" > data: { genStage: 'outline_generating' },</span>
  8907. <span class="cstat-no" title="statement not covered" > });</span>
  8908. &nbsp;
  8909. // 构造 state,使用已保存的 plan
  8910. <span class="cstat-no" title="statement not covered" > const initState: any = {</span>
  8911. <span class="cstat-no" title="statement not covered" > bookId,</span>
  8912. <span class="cstat-no" title="statement not covered" > topic: book.description,</span>
  8913. <span class="cstat-no" title="statement not covered" > bookScale: book.bookScale || '1000',</span>
  8914. <span class="cstat-no" title="statement not covered" > genLevel: (book as any).genLevel || 2,</span>
  8915. <span class="cstat-no" title="statement not covered" > description: book.description,</span>
  8916. <span class="cstat-no" title="statement not covered" > title: book.title,</span>
  8917. <span class="cstat-no" title="statement not covered" > userId: book.userId,</span>
  8918. <span class="cstat-no" title="statement not covered" > bookPlan: book.bookAnalysis || '',</span>
  8919. <span class="cstat-no" title="statement not covered" > completedChapters: [],</span>
  8920. <span class="cstat-no" title="statement not covered" > failedChapters: [],</span>
  8921. <span class="cstat-no" title="statement not covered" > };</span>
  8922. &nbsp;
  8923. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 大纲生成已启动(异步): bookId=${bookId}`);</span>
  8924. &nbsp;
  8925. // 异步执行 AI 调用
  8926. <span class="cstat-no" title="statement not covered" > setImmediate(async () =&gt; {</span>
  8927. <span class="cstat-no" title="statement not covered" > try {</span>
  8928. <span class="cstat-no" title="statement not covered" > await richOutlineNode(initState);</span>
  8929. // richOutlineNode 内部已通过 bookStore.update 写入 outlineJson
  8930. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8931. <span class="cstat-no" title="statement not covered" > where: { id: idNum },</span>
  8932. <span class="cstat-no" title="statement not covered" > data: { genStage: 'outline_ready' },</span>
  8933. <span class="cstat-no" title="statement not covered" > });</span>
  8934. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 大纲生成完成: bookId=${bookId}`);</span>
  8935. <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
  8936. <span class="cstat-no" title="statement not covered" > console.error(`[Interactive] 大纲生成失败: bookId=${bookId}`, err);</span>
  8937. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  8938. <span class="cstat-no" title="statement not covered" > where: { id: idNum },</span>
  8939. <span class="cstat-no" title="statement not covered" > data: { genStage: 'outline_failed', errorMsg: err instanceof Error ? err.message : '大纲生成失败' },</span>
  8940. <span class="cstat-no" title="statement not covered" > });</span>
  8941. <span class="cstat-no" title="statement not covered" > }</span>
  8942. <span class="cstat-no" title="statement not covered" > });</span>
  8943. &nbsp;
  8944. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8945. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8946. <span class="cstat-no" title="statement not covered" > message: '大纲生成已启动',</span>
  8947. <span class="cstat-no" title="statement not covered" > data: { genStage: 'outline_generating' },</span>
  8948. <span class="cstat-no" title="statement not covered" > };</span>
  8949. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8950. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] outline 启动失败:', error);</span>
  8951. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  8952. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '启动失败' };</span>
  8953. <span class="cstat-no" title="statement not covered" > }</span>
  8954. <span class="cstat-no" title="statement not covered" >});</span>
  8955. &nbsp;
  8956. /**
  8957. * GET /api/book-generator/langgraph/books/:id/interactive/outline
  8958. * 轮询获取大纲生成结果
  8959. */
  8960. <span class="cstat-no" title="statement not covered" >router.get('/books/:id/interactive/outline', optionalAuth, async (ctx: Context) =&gt; {</span>
  8961. <span class="cstat-no" title="statement not covered" > try {</span>
  8962. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  8963. <span class="cstat-no" title="statement not covered" > const book = await prisma.book.findUnique({ where: { id: parseInt(bookId) } });</span>
  8964. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  8965. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  8966. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  8967. <span class="cstat-no" title="statement not covered" > return;</span>
  8968. <span class="cstat-no" title="statement not covered" > }</span>
  8969. &nbsp;
  8970. <span class="cstat-no" title="statement not covered" > const stage = (book as any).genStage || '';</span>
  8971. &nbsp;
  8972. <span class="cstat-no" title="statement not covered" > if (stage === 'outline_failed') {</span>
  8973. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 0, data: { genStage: 'outline_failed', error: (book as any).errorMsg || '大纲生成失败' } };</span>
  8974. <span class="cstat-no" title="statement not covered" > return;</span>
  8975. <span class="cstat-no" title="statement not covered" > }</span>
  8976. &nbsp;
  8977. <span class="cstat-no" title="statement not covered" > if (stage === 'outline_ready' || book.outlineJson) {</span>
  8978. <span class="cstat-no" title="statement not covered" > const outlineJson = book.outlineJson || '';</span>
  8979. <span class="cstat-no" title="statement not covered" > let outlineData: any = null;</span>
  8980. <span class="cstat-no" title="statement not covered" > try {</span>
  8981. <span class="cstat-no" title="statement not covered" > outlineData = typeof outlineJson === 'string' ? JSON.parse(outlineJson) : outlineJson;</span>
  8982. <span class="cstat-no" title="statement not covered" > } catch (e) { /* ignore */ }</span>
  8983. &nbsp;
  8984. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8985. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8986. <span class="cstat-no" title="statement not covered" > message: '大纲生成完成',</span>
  8987. <span class="cstat-no" title="statement not covered" > data: { rawOutline: outlineJson, outlineData, genStage: 'outline_ready' },</span>
  8988. <span class="cstat-no" title="statement not covered" > };</span>
  8989. <span class="cstat-no" title="statement not covered" > return;</span>
  8990. <span class="cstat-no" title="statement not covered" > }</span>
  8991. &nbsp;
  8992. // 还在生成中
  8993. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  8994. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  8995. <span class="cstat-no" title="statement not covered" > data: { genStage: stage || 'outline_generating' },</span>
  8996. <span class="cstat-no" title="statement not covered" > };</span>
  8997. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  8998. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] 查询 outline 失败:', error);</span>
  8999. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  9000. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '查询失败' };</span>
  9001. <span class="cstat-no" title="statement not covered" > }</span>
  9002. <span class="cstat-no" title="statement not covered" >});</span>
  9003. &nbsp;
  9004. /**
  9005. * PUT /api/book-generator/langgraph/books/:id/interactive/outline
  9006. * 保存用户修改后的大纲,并重建章节树
  9007. */
  9008. <span class="cstat-no" title="statement not covered" >router.put('/books/:id/interactive/outline', optionalAuth, async (ctx: Context) =&gt; {</span>
  9009. <span class="cstat-no" title="statement not covered" > try {</span>
  9010. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  9011. <span class="cstat-no" title="statement not covered" > const { outline } = ctx.request.body as { outline: any };</span>
  9012. &nbsp;
  9013. <span class="cstat-no" title="statement not covered" > if (!outline) {</span>
  9014. <span class="cstat-no" title="statement not covered" > ctx.status = 400;</span>
  9015. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: 'outline 不能为空' };</span>
  9016. <span class="cstat-no" title="statement not covered" > return;</span>
  9017. <span class="cstat-no" title="statement not covered" > }</span>
  9018. &nbsp;
  9019. <span class="cstat-no" title="statement not covered" > const outlineStr = typeof outline === 'string' ? outline : JSON.stringify(outline);</span>
  9020. &nbsp;
  9021. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  9022. <span class="cstat-no" title="statement not covered" > where: { id: parseInt(bookId) },</span>
  9023. <span class="cstat-no" title="statement not covered" > data: { outlineJson: outlineStr },</span>
  9024. <span class="cstat-no" title="statement not covered" > });</span>
  9025. &nbsp;
  9026. // 根据大纲重建章节树(删除旧章节,创建新章节)
  9027. <span class="cstat-no" title="statement not covered" > const chapterData = typeof outline === 'string' ? JSON.parse(outline) : outline;</span>
  9028. <span class="cstat-no" title="statement not covered" > const chapters = chapterData.chapters || [];</span>
  9029. // 删除旧章节
  9030. <span class="cstat-no" title="statement not covered" > await prisma.bookChapter.deleteMany({ where: { bookId: parseInt(bookId) } });</span>
  9031. &nbsp;
  9032. // 插入新章节(递归处理章→节→小节)
  9033. <span class="cstat-no" title="statement not covered" > let chapterNumber = 0;</span>
  9034. <span class="cstat-no" title="statement not covered" > async function insertChapters(parentId: number | null, items: any[], level: number) {</span>
  9035. <span class="cstat-no" title="statement not covered" > for (const item of items) {</span>
  9036. <span class="cstat-no" title="statement not covered" > chapterNumber++;</span>
  9037. <span class="cstat-no" title="statement not covered" > const section = await prisma.bookChapter.create({</span>
  9038. <span class="cstat-no" title="statement not covered" > data: {</span>
  9039. <span class="cstat-no" title="statement not covered" > bookId: parseInt(bookId),</span>
  9040. <span class="cstat-no" title="statement not covered" > title: item.title || '未命名章节',</span>
  9041. <span class="cstat-no" title="statement not covered" > summary: item.summary || '',</span>
  9042. <span class="cstat-no" title="statement not covered" > content: '',</span>
  9043. <span class="cstat-no" title="statement not covered" > wordCount: item.estimatedWords || 0,</span>
  9044. <span class="cstat-no" title="statement not covered" > number: chapterNumber,</span>
  9045. <span class="cstat-no" title="statement not covered" > level,</span>
  9046. <span class="cstat-no" title="statement not covered" > parentId,</span>
  9047. <span class="cstat-no" title="statement not covered" > genStage: 'draft',</span>
  9048. <span class="cstat-no" title="statement not covered" > },</span>
  9049. <span class="cstat-no" title="statement not covered" > });</span>
  9050. // 递归处理子节点(节、小节)
  9051. <span class="cstat-no" title="statement not covered" > if (item.sections &amp;&amp; item.sections.length &gt; 0) {</span>
  9052. <span class="cstat-no" title="statement not covered" > await insertChapters(section.id, item.sections, level + 1);</span>
  9053. <span class="cstat-no" title="statement not covered" > }</span>
  9054. <span class="cstat-no" title="statement not covered" > if (item.subsections &amp;&amp; item.subsections.length &gt; 0) {</span>
  9055. <span class="cstat-no" title="statement not covered" > await insertChapters(section.id, item.subsections, level + 1);</span>
  9056. <span class="cstat-no" title="statement not covered" > }</span>
  9057. <span class="cstat-no" title="statement not covered" > }</span>
  9058. <span class="cstat-no" title="statement not covered" > }</span>
  9059. <span class="cstat-no" title="statement not covered" > await insertChapters(null, chapters, 1);</span>
  9060. &nbsp;
  9061. // 更新书籍的章节计数
  9062. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  9063. <span class="cstat-no" title="statement not covered" > where: { id: parseInt(bookId) },</span>
  9064. <span class="cstat-no" title="statement not covered" > data: { totalChapters: chapterNumber },</span>
  9065. <span class="cstat-no" title="statement not covered" > });</span>
  9066. &nbsp;
  9067. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  9068. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  9069. <span class="cstat-no" title="statement not covered" > message: '大纲已保存,章节树已重建',</span>
  9070. <span class="cstat-no" title="statement not covered" > data: { chapterCount: chapterNumber },</span>
  9071. <span class="cstat-no" title="statement not covered" > };</span>
  9072. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  9073. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] 保存 outline 失败:', error);</span>
  9074. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  9075. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '保存失败' };</span>
  9076. <span class="cstat-no" title="statement not covered" > }</span>
  9077. <span class="cstat-no" title="statement not covered" >});</span>
  9078. &nbsp;
  9079. /**
  9080. * POST /api/book-generator/langgraph/books/:id/interactive/generate
  9081. * 运行并行内容生成 + 连贯性编辑
  9082. */
  9083. <span class="cstat-no" title="statement not covered" >router.post('/books/:id/interactive/generate', optionalAuth, async (ctx: Context) =&gt; {</span>
  9084. <span class="cstat-no" title="statement not covered" > try {</span>
  9085. <span class="cstat-no" title="statement not covered" > const bookId = ctx.params.id;</span>
  9086. <span class="cstat-no" title="statement not covered" > const book = await prisma.book.findUnique({ where: { id: parseInt(bookId) } });</span>
  9087. <span class="cstat-no" title="statement not covered" > if (!book) {</span>
  9088. <span class="cstat-no" title="statement not covered" > ctx.status = 404;</span>
  9089. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: '书籍不存在' };</span>
  9090. <span class="cstat-no" title="statement not covered" > return;</span>
  9091. <span class="cstat-no" title="statement not covered" > }</span>
  9092. &nbsp;
  9093. <span class="cstat-no" title="statement not covered" > const userId = book.userId || parseInt(TEST_USER_ID);</span>
  9094. &nbsp;
  9095. // 配额检查
  9096. <span class="cstat-no" title="statement not covered" > const scaleConfig = getScaleConfig(book.bookScale || '1000');</span>
  9097. <span class="cstat-no" title="statement not covered" > const totalWords = scaleConfig.totalWords;</span>
  9098. <span class="cstat-no" title="statement not covered" > const audioQuota = await checkAudioQuota(userId, totalWords);</span>
  9099. <span class="cstat-no" title="statement not covered" > if (!audioQuota.allowed) {</span>
  9100. <span class="cstat-no" title="statement not covered" > ctx.status = 403;</span>
  9101. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: audioQuota.reason };</span>
  9102. <span class="cstat-no" title="statement not covered" > return;</span>
  9103. <span class="cstat-no" title="statement not covered" > }</span>
  9104. &nbsp;
  9105. // 构造 minimal state
  9106. <span class="cstat-no" title="statement not covered" > const initState: any = {</span>
  9107. <span class="cstat-no" title="statement not covered" > bookId,</span>
  9108. <span class="cstat-no" title="statement not covered" > topic: book.description,</span>
  9109. <span class="cstat-no" title="statement not covered" > bookScale: book.bookScale || '1000',</span>
  9110. <span class="cstat-no" title="statement not covered" > genLevel: (book as any).genLevel || 2,</span>
  9111. <span class="cstat-no" title="statement not covered" > description: book.description,</span>
  9112. <span class="cstat-no" title="statement not covered" > title: book.title,</span>
  9113. <span class="cstat-no" title="statement not covered" > userId,</span>
  9114. <span class="cstat-no" title="statement not covered" > bookPlan: book.bookAnalysis || '',</span>
  9115. <span class="cstat-no" title="statement not covered" > outline: book.outlineJson || '',</span>
  9116. <span class="cstat-no" title="statement not covered" > completedChapters: [],</span>
  9117. <span class="cstat-no" title="statement not covered" > failedChapters: [],</span>
  9118. <span class="cstat-no" title="statement not covered" > };</span>
  9119. &nbsp;
  9120. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 开始并行生成内容: bookId=${bookId}`);</span>
  9121. &nbsp;
  9122. // ===== 直接异步生成(跳过队列) =====
  9123. <span class="cstat-no" title="statement not covered" > const { langGraphGenerator } = await import('./index.js');</span>
  9124. <span class="cstat-no" title="statement not covered" > langGraphGenerator.generate(</span>
  9125. <span class="cstat-no" title="statement not covered" > bookId,</span>
  9126. <span class="cstat-no" title="statement not covered" > book.description,</span>
  9127. <span class="cstat-no" title="statement not covered" > book.bookScale || '1000',</span>
  9128. <span class="cstat-no" title="statement not covered" > (book as any).genLevel || 2</span>
  9129. <span class="cstat-no" title="statement not covered" > ).then(() =&gt; {</span>
  9130. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 生成完成: bookId=${bookId}`);</span>
  9131. <span class="cstat-no" title="statement not covered" > }).catch(err =&gt; {</span>
  9132. <span class="cstat-no" title="statement not covered" > console.error(`[Interactive] 生成失败: bookId=${bookId}`, err);</span>
  9133. <span class="cstat-no" title="statement not covered" > });</span>
  9134. &nbsp;
  9135. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  9136. <span class="cstat-no" title="statement not covered" > where: { id: parseInt(bookId) },</span>
  9137. <span class="cstat-no" title="statement not covered" > data: { genStage: 'generating_content' },</span>
  9138. <span class="cstat-no" title="statement not covered" > });</span>
  9139. &nbsp;
  9140. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  9141. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  9142. <span class="cstat-no" title="statement not covered" > message: '内容生成已启动',</span>
  9143. <span class="cstat-no" title="statement not covered" > data: { bookId, genStage: 'generating_content', mode: 'direct' },</span>
  9144. <span class="cstat-no" title="statement not covered" > };</span>
  9145. <span class="cstat-no" title="statement not covered" > return;</span>
  9146. <span class="cstat-no" title="statement not covered" > try {</span>
  9147. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  9148. <span class="cstat-no" title="statement not covered" > where: { id: parseInt(bookId) },</span>
  9149. <span class="cstat-no" title="statement not covered" > data: { genStage: 'generating_content' },</span>
  9150. <span class="cstat-no" title="statement not covered" > });</span>
  9151. &nbsp;
  9152. // Step 1: 并行生成内容
  9153. <span class="cstat-no" title="statement not covered" > const contentResult = await writeChaptersParallelNode(initState);</span>
  9154. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 并行内容生成完成: bookId=${bookId}`);</span>
  9155. &nbsp;
  9156. // Step 2: 连贯性编辑
  9157. <span class="cstat-no" title="statement not covered" > const mergeState = { ...initState, ...contentResult };</span>
  9158. <span class="cstat-no" title="statement not covered" > await continuityEditNode(mergeState);</span>
  9159. <span class="cstat-no" title="statement not covered" > console.log(`[Interactive] 连贯性编辑完成: bookId=${bookId}`);</span>
  9160. &nbsp;
  9161. <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
  9162. <span class="cstat-no" title="statement not covered" > code: 0,</span>
  9163. <span class="cstat-no" title="statement not covered" > message: '内容生成完成',</span>
  9164. <span class="cstat-no" title="statement not covered" > data: { bookId, genStage: 'completed', mode: 'sync' },</span>
  9165. <span class="cstat-no" title="statement not covered" > };</span>
  9166. <span class="cstat-no" title="statement not covered" > } catch (generateError) {</span>
  9167. <span class="cstat-no" title="statement not covered" > console.error(`[Interactive] 内容生成失败: bookId=${bookId}`, generateError);</span>
  9168. <span class="cstat-no" title="statement not covered" > await prisma.book.update({</span>
  9169. <span class="cstat-no" title="statement not covered" > where: { id: parseInt(bookId) },</span>
  9170. <span class="cstat-no" title="statement not covered" > data: { genStage: 'failed', errorMsg: generateError instanceof Error ? generateError.message : '生成失败' },</span>
  9171. <span class="cstat-no" title="statement not covered" > });</span>
  9172. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  9173. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: generateError instanceof Error ? generateError.message : '生成失败' };</span>
  9174. <span class="cstat-no" title="statement not covered" > }</span>
  9175. <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
  9176. <span class="cstat-no" title="statement not covered" > console.error('[Interactive] generate 失败:', error);</span>
  9177. <span class="cstat-no" title="statement not covered" > ctx.status = 500;</span>
  9178. <span class="cstat-no" title="statement not covered" > ctx.body = { code: 1, message: error instanceof Error ? error.message : '生成失败' };</span>
  9179. <span class="cstat-no" title="statement not covered" > }</span>
  9180. <span class="cstat-no" title="statement not covered" >});</span>
  9181. &nbsp;
  9182. <span class="cstat-no" title="statement not covered" >export default router;</span>
  9183. &nbsp;</pre></td></tr></table></pre>
  9184. <div class='push'></div><!-- for sticky footer -->
  9185. </div><!-- /wrapper -->
  9186. <div class='footer quiet pad2 space-top1 center small'>
  9187. Code coverage generated by
  9188. <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
  9189. at 2026-05-19T14:27:48.313Z
  9190. </div>
  9191. <script src="../../prettify.js"></script>
  9192. <script>
  9193. window.onload = function () {
  9194. prettyPrint();
  9195. };
  9196. </script>
  9197. <script src="../../sorter.js"></script>
  9198. <script src="../../block-navigation.js"></script>
  9199. </body>
  9200. </html>